//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;