diff options
author | kaashoek <kaashoek> | 2006-09-07 01:37:58 +0000 |
---|---|---|
committer | kaashoek <kaashoek> | 2006-09-07 01:37:58 +0000 |
commit | f70172129c94e4d53b56fc10a7d859679b581bd2 (patch) | |
tree | f5c95ac0b9eea765d36ab0cb0c53573e2dfa0f9d /lapic.c | |
parent | f9bc4452b5437570f1709430e9364cc3e323cf3a (diff) | |
download | xv6-labs-f70172129c94e4d53b56fc10a7d859679b581bd2.tar.gz xv6-labs-f70172129c94e4d53b56fc10a7d859679b581bd2.tar.bz2 xv6-labs-f70172129c94e4d53b56fc10a7d859679b581bd2.zip |
run without lapic and ioapic, if they are not present
if no lapic available, use 8253pit for clock
now xv6 runs both on qemu (uniprocessor) and bochs (uniprocessor and MP)
Diffstat (limited to 'lapic.c')
-rw-r--r-- | lapic.c | 33 |
1 files changed, 23 insertions, 10 deletions
@@ -105,17 +105,20 @@ lapic_write(int r, int data) void lapic_timerinit(void) { - lapic_write(LAPIC_TDCR, LAPIC_X1); - lapic_write(LAPIC_TIMER, LAPIC_CLKIN | LAPIC_PERIODIC | - (IRQ_OFFSET + IRQ_TIMER)); - lapic_write(LAPIC_TCCR, 10000000); - lapic_write(LAPIC_TICR, 10000000); + if (lapicaddr) { + lapic_write(LAPIC_TDCR, LAPIC_X1); + lapic_write(LAPIC_TIMER, LAPIC_CLKIN | LAPIC_PERIODIC | + (IRQ_OFFSET + IRQ_TIMER)); + lapic_write(LAPIC_TCCR, 10000000); + lapic_write(LAPIC_TICR, 10000000); + } } void lapic_timerintr(void) { - lapic_write(LAPIC_EOI, 0); + if (lapicaddr) + lapic_write(LAPIC_EOI, 0); } void @@ -123,6 +126,9 @@ lapic_init(int c) { uint r, lvt; + if (lapicaddr == 0) + return; + lapic_write(LAPIC_DFR, 0xFFFFFFFF); // Set dst format register r = (lapic_read(LAPIC_ID)>>24) & 0xFF; // Read APIC ID lapic_write(LAPIC_LDR, (1<<r)<<24); // Set logical dst register to r @@ -155,25 +161,32 @@ lapic_init(int c) void lapic_enableintr(void) { - lapic_write(LAPIC_TPR, 0); + if (lapicaddr) + lapic_write(LAPIC_TPR, 0); } void lapic_disableintr(void) { - lapic_write(LAPIC_TPR, 0xFF); + if (lapicaddr) + lapic_write(LAPIC_TPR, 0xFF); } void lapic_eoi(void) { - lapic_write(LAPIC_EOI, 0); + if (lapicaddr) + lapic_write(LAPIC_EOI, 0); } int cpu(void) { - int x = (lapic_read(LAPIC_ID)>>24) & 0xFF; + int x; + if (lapicaddr) + x = (lapic_read(LAPIC_ID)>>24) & 0xFF; + else + x = 0; return x; } |