aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--i386/i386/apic.c5
-rw-r--r--i386/i386/cpu_number.c14
2 files changed, 18 insertions, 1 deletions
diff --git a/i386/i386/apic.c b/i386/i386/apic.c
index e53d4749..891ce288 100644
--- a/i386/i386/apic.c
+++ b/i386/i386/apic.c
@@ -278,6 +278,11 @@ lapic_enable(void)
cpu_intr_save(&flags);
apic_id = apic_get_current_cpu();
+ if (apic_id < 0)
+ {
+ printf("apic_get_current_cpu() failed, assuming BSP\n");
+ apic_id = 0;
+ }
dummy = lapic->dest_format.r;
lapic->dest_format.r = 0xffffffff; /* flat model */
diff --git a/i386/i386/cpu_number.c b/i386/i386/cpu_number.c
index 20bf2399..ad4c4b01 100644
--- a/i386/i386/cpu_number.c
+++ b/i386/i386/cpu_number.c
@@ -19,10 +19,22 @@
#include <i386/apic.h>
#include <i386/smp.h>
#include <i386/cpu.h>
+#include <kern/printf.h>
#if NCPUS > 1
int cpu_number(void)
{
- return apic_get_cpu_kernel_id(apic_get_current_cpu());
+ int kernel_id, apic_id;
+ apic_id = apic_get_current_cpu();
+ if (apic_id < 0) {
+ printf("apic_get_current_cpu() failed, assuming BSP\n");
+ apic_id = 0;
+ }
+
+ kernel_id = apic_get_cpu_kernel_id(apic_id);
+ if (kernel_id < 0) {
+ printf("apic_get_cpu_kernel_id() failed, assuming BSP\n");
+ kernel_id = 0;
+ }
}
#endif