示例#1
0
文件: time.c 项目: 7perl/akaros
void
set_core_timer(uint32_t usec, bool periodic)
{
	// we could implement periodic timers using one-shot timers,
	// but for now we only support one-shot
	assert(!periodic);

	if (usec)
	{
		uint32_t clocks =  (uint64_t)usec*TSC_HZ/1000000;

		int8_t irq_state = 0;
		disable_irqsave(&irq_state);

		mtpcr(PCR_COUNT, 0);
		mtpcr(PCR_COMPARE, clocks);
		mtpcr(PCR_SR, mfpcr(PCR_SR) | (1 << (IRQ_TIMER+SR_IM_SHIFT)));

		enable_irqsave(&irq_state);
	}
	else
	{
		mtpcr(PCR_SR, mfpcr(PCR_SR) & ~(1 << (IRQ_TIMER+SR_IM_SHIFT)));
	}
}
示例#2
0
static uint64_t tohost_sync(unsigned dev, unsigned cmd, uint64_t payload)
{
  uint64_t tohost = (uint64_t)dev << 56 | (uint64_t)cmd << 48 | payload;
  uint64_t fromhost;
  __sync_synchronize();
  while (mtpcr(PCR_TOHOST, tohost));
  while ((fromhost = mtpcr(PCR_FROMHOST, 0)) == 0);
  __sync_synchronize();
  return fromhost;
}
示例#3
0
文件: trap.c 项目: alfongj/akaros
static void handle_host_interrupt(struct hw_trapframe *hw_tf)
{
	uintptr_t fh = mtpcr(PCR_FROMHOST, 0);
	switch (fh >> 56)
	{
	  case 0x00: return;
	  case 0x01: handle_keypress(fh); return;
	  default: assert(0);
	}
}
示例#4
0
int main(void) {

    unsigned int ns_h = 0;
    unsigned int ns_l = 100000;

    unsigned int message;

    // Synchronize.
    delay_until(ns_h, ns_l);

    while(1) {
        message = tohost_id(THREAD, 4); mtpcr(30, message); 
        message = tohost_time(get_time_low()); mtpcr(30, message);
        taskA4_main();
        message = tohost_id(THREAD, 14); mtpcr(30, message); 
        message = tohost_time(get_time_low()); mtpcr(30, message);
        add_ms(ns_h, ns_l, 200);
        delay_until(ns_h, ns_l);
    }
    return 0;
}
示例#5
0
int main(void) {

    unsigned int ns_h = 0;
    unsigned int ns_l = 100000;
    unsigned int i = 0;

    unsigned int message;

    // Synchronize.
    delay_until(ns_h, ns_l);

    while(1) {
        message = tohost_id(THREAD, 1); mtpcr(30, message); 
        message = tohost_time(get_time_low()); mtpcr(30, message);
        taskB1_main();
        message = tohost_id(THREAD, 11); mtpcr(30, message); 
        message = tohost_time(get_time_low()); mtpcr(30, message);
        if(i == 0) {
        message = tohost_id(THREAD, 2); mtpcr(30, message); 
        message = tohost_time(get_time_low()); mtpcr(30, message);
        taskB2_main();
        message = tohost_id(THREAD, 12); mtpcr(30, message); 
        message = tohost_time(get_time_low()); mtpcr(30, message);
        i++;
        } else {
        message = tohost_id(THREAD, 3); mtpcr(30, message); 
        message = tohost_time(get_time_low()); mtpcr(30, message);
        taskB3_main();
        message = tohost_id(THREAD, 13); mtpcr(30, message); 
        message = tohost_time(get_time_low()); mtpcr(30, message);
        i = 0;
        }
        add_ms(ns_h, ns_l, 25);
        delay_until(ns_h, ns_l);
    }
    return 0;
}
示例#6
0
文件: console.c 项目: 7perl/akaros
void
cputchar(int c)
{
	while (mtpcr(PCR_TOHOST, 0x0101000000000000 | (unsigned char)c));
}
示例#7
0
文件: console.c 项目: 7perl/akaros
void cons_init()
{
	mtpcr(PCR_SR, mfpcr(PCR_SR) | (1 << (IRQ_HOST+SR_IM_SHIFT)));
	while (mtpcr(PCR_TOHOST, 0x01L << 56));
}