Subversion Repositories HelenOS-historic

Rev

Rev 576 | Rev 693 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 576 Rev 672
Line 41... Line 41...
41
#ifdef CONFIG_SMP
41
#ifdef CONFIG_SMP
42
 
42
 
43
/*
43
/*
44
 * Advanced Programmable Interrupt Controller for SMP systems.
44
 * Advanced Programmable Interrupt Controller for SMP systems.
45
 * Tested on:
45
 * Tested on:
46
 *  Bochs 2.0.2 - Bochs 2.2 with 2-8 CPUs
46
 *  Bochs 2.0.2 - Bochs 2.2.5 with 2-8 CPUs
47
 *  Simics 2.0.28 - Simics 2.2.19 2-15 CPUs
47
 *  Simics 2.0.28 - Simics 2.2.19 2-15 CPUs
48
 *  VMware Workstation 5.5 with 2 CPUs
48
 *  VMware Workstation 5.5 with 2 CPUs
49
 *  ASUS P/I-P65UP5 + ASUS C-P55T2D REV. 1.41 with 2x 200Mhz Pentium CPUs
49
 *  ASUS P/I-P65UP5 + ASUS C-P55T2D REV. 1.41 with 2x 200Mhz Pentium CPUs
50
 *  ASUS PCH-DL with 2x 3000Mhz Pentium 4 Xeon (HT) CPUs
50
 *  ASUS PCH-DL with 2x 3000Mhz Pentium 4 Xeon (HT) CPUs
51
 *  MSI K7D Master-L with 2x 2100MHz Athlon MP CPUs
51
 *  MSI K7D Master-L with 2x 2100MHz Athlon MP CPUs
Line 309... Line 309...
309
    lvt_lint_t lint;
309
    lvt_lint_t lint;
310
    svr_t svr;
310
    svr_t svr;
311
    icr_t icr;
311
    icr_t icr;
312
    tdcr_t tdcr;
312
    tdcr_t tdcr;
313
    lvt_tm_t tm;
313
    lvt_tm_t tm;
-
 
314
    ldr_t ldr;
-
 
315
    dfr_t dfr;
314
    __u32 t1, t2;
316
    __u32 t1, t2;
315
 
317
 
316
    /* Initialize LVT Error register. */
318
    /* Initialize LVT Error register. */
317
    error.value = l_apic[LVT_Err];
319
    error.value = l_apic[LVT_Err];
318
    error.masked = true;
320
    error.masked = true;
Line 370... Line 372...
370
    t1 = l_apic[CCRT];
372
    t1 = l_apic[CCRT];
371
    delay(1000);
373
    delay(1000);
372
    t2 = l_apic[CCRT];
374
    t2 = l_apic[CCRT];
373
   
375
   
374
    l_apic[ICRT] = t1-t2;
376
    l_apic[ICRT] = t1-t2;
-
 
377
   
-
 
378
    /* Program Logical Destination Register. */
-
 
379
    ldr.value = l_apic[LDR];
-
 
380
    if (CPU->id < sizeof(CPU->id)*8)    /* size in bits */
-
 
381
        ldr.id = (1<<CPU->id);
-
 
382
    l_apic[LDR] = ldr.value;
-
 
383
   
-
 
384
    /* Program Destination Format Register for Flat mode. */
-
 
385
    dfr.value = l_apic[DFR];
-
 
386
    dfr.model = MODEL_FLAT;
-
 
387
    l_apic[DFR] = dfr.value;
375
}
388
}
376
 
389
 
377
/** Local APIC End of Interrupt. */
390
/** Local APIC End of Interrupt. */
378
void l_apic_eoi(void)
391
void l_apic_eoi(void)
379
{
392
{
Line 468... Line 481...
468
    int dlvr = DELMOD_FIXED;
481
    int dlvr = DELMOD_FIXED;
469
   
482
   
470
    if (flags & LOPRI)
483
    if (flags & LOPRI)
471
        dlvr = DELMOD_LOWPRI;
484
        dlvr = DELMOD_LOWPRI;
472
 
485
 
473
   
-
 
474
    reg.lo = io_apic_read(IOREDTBL + pin*2);
486
    reg.lo = io_apic_read(IOREDTBL + pin*2);
475
    reg.hi = io_apic_read(IOREDTBL + pin*2 + 1);
487
    reg.hi = io_apic_read(IOREDTBL + pin*2 + 1);
476
   
488
   
477
    reg.dest =  dest;
489
    reg.dest = dest;
478
    reg.destmod = DESTMOD_LOGIC;
490
    reg.destmod = DESTMOD_LOGIC;
479
    reg.trigger_mode = TRIGMOD_EDGE;
491
    reg.trigger_mode = TRIGMOD_EDGE;
480
    reg.intpol = POLARITY_HIGH;
492
    reg.intpol = POLARITY_HIGH;
481
    reg.delmod = dlvr;
493
    reg.delmod = dlvr;
482
    reg.intvec = v;
494
    reg.intvec = v;