//See PCI.

#if mp_cnt>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;

ProgressBarsRst;
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 my keybaord and regs 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;
}
ProgressBarsRst;
}

Main;