//See PCI. #if mp_count > 1 #define DEST_CPU 1 #else #define DEST_CPU 0 #endif #assert I_USER == 0x40 interrupt U0 IntMy40() { lock {progress1++;} *(dev.uncached_alias + LAPIC_EOI)(U32 *) = 0; } interrupt U0 IntMy41() { lock {progress2++;} *(dev.uncached_alias + LAPIC_EOI)(U32 *) = 0; } interrupt U0 IntMy42() { lock {progress3++;} *(dev.uncached_alias + LAPIC_EOI)(U32 *) = 0; } interrupt U0 IntMy43() { lock {progress4++;} *(dev.uncached_alias + LAPIC_EOI)(U32 *) = 0; } I64 vect[4] = {&IntMy40, &IntMy41, &IntMy42, &IntMy43}; U0 Main() { I64 i; U8 *da = dev.uncached_alias + IOAPIC_REG; U32 *_d = dev.uncached_alias + IOAPIC_DATA; ProgressBarsReset; for (i = I_USER; i < I_USER + 4; i++) IntEntrySet(i, vect[i&3], IDTET_IRQ); //There are like 4*6 vects. Bus zero //has the first four vects. for (i = IOREDTAB; i < IOREDTAB + 4 * 2; i += 2) { *da = i + 1; *_d = dev.mp_apic_ids[DEST_CPU] << 24; *da = i; *_d = 0x4000 + 0x40 + (i - IOREDTAB) / 2; } Sleep(1000); "The keyboard and timer seem to be active.\n" "IntA:%d IntB:%d IntC:%d IntD:%d\n\n" "IntB is Terry's keyboard and registers a single KEY-UP.\n" "Rerun and press a few keys.\n", progress1, progress2, progress3, progress4; //Disable vects for (i = IOREDTAB; i < IOREDTAB + 4 * 2; i += 2) { *da = i + 1; *_d = dev.mp_apic_ids[DEST_CPU] << 24; *da = i; *_d = 0x14000 + 0x40 + (i - IOREDTAB) / 2; } ProgressBarsReset; } Main;