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))); } }
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; }
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); } }
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; }
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; }
void cputchar(int c) { while (mtpcr(PCR_TOHOST, 0x0101000000000000 | (unsigned char)c)); }
void cons_init() { mtpcr(PCR_SR, mfpcr(PCR_SR) | (1 << (IRQ_HOST+SR_IM_SHIFT))); while (mtpcr(PCR_TOHOST, 0x01L << 56)); }