---
i386/i386/apic.c | 5 +++++
i386/i386/cpu_number.c | 16 +++++++++++++---
2 files changed, 18 insertions(+), 3 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 65d74ddc..c719d841 100644
--- a/i386/i386/cpu_number.c
+++ b/i386/i386/cpu_number.c
@@ -19,14 +19,24 @@
#include <i386/apic.h>
#include <i386/smp.h>
#include <i386/cpu.h>
+#include <kern/printf.h>
#if NCPUS > 1
int cpu_number(void)
{
- int kernel_id;
- unsigned long flags;
+ int kernel_id, apic_id;
- kernel_id = apic_get_cpu_kernel_id(apic_get_current_cpu());
+ 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;
+ }
return kernel_id;
}
--
2.34.1