aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--i386/i386/cpu_number.h7
-rw-r--r--i386/i386/i386asm.sym3
-rw-r--r--i386/i386/locore.S15
3 files changed, 19 insertions, 6 deletions
diff --git a/i386/i386/cpu_number.h b/i386/i386/cpu_number.h
index 9aef6370..a6dd47d6 100644
--- a/i386/i386/cpu_number.h
+++ b/i386/i386/cpu_number.h
@@ -35,6 +35,13 @@
/* More-specific code must define cpu_number() and CPU_NUMBER. */
#ifdef __i386__
#define CX(addr, reg) addr(,reg,4)
+
+#define CPU_NUMBER(reg) \
+ movl %cs:lapic, reg ;\
+ movl %cs:APIC_ID(reg), reg ;\
+ shrl $24, reg ;\
+
+
#endif
#ifdef __x86_64__
#define CX(addr, reg) addr(,reg,8)
diff --git a/i386/i386/i386asm.sym b/i386/i386/i386asm.sym
index 85658b30..8317db6c 100644
--- a/i386/i386/i386asm.sym
+++ b/i386/i386/i386asm.sym
@@ -45,10 +45,13 @@
#include <i386/gdt.h>
#include <i386/ldt.h>
#include <i386/mp_desc.h>
+#include <i386/apic.h>
#include <i386/xen.h>
expr CALL_SINGLE_FUNCTION_BASE
+offset ApicLocalUnit lu apic_id APIC_ID
+
offset thread th pcb
offset thread th task
offset thread th recover
diff --git a/i386/i386/locore.S b/i386/i386/locore.S
index ff78e80d..5ac238f7 100644
--- a/i386/i386/locore.S
+++ b/i386/i386/locore.S
@@ -541,13 +541,15 @@ _kret_iret:
trap_from_kernel:
#if MACH_KDB || MACH_TTD
movl %esp,%ebx /* save current stack */
-
movl %esp,%edx /* on an interrupt stack? */
- and $(~(KERNEL_STACK_SIZE-1)),%edx
- cmpl EXT(int_stack_base),%edx
+
+ CPU_NUMBER(%ecx)
+ and $(~(INTSTACK_SIZE-1)),%edx
+ cmpl CX(EXT(int_stack_base),%ecx),%edx
je 1f /* OK if so */
- CPU_NUMBER(%edx) /* get CPU number */
+ movl %ecx,%edx
+
cmpl CX(EXT(kernel_stack),%edx),%esp
/* already on kernel stack? */
ja 0f
@@ -668,9 +670,10 @@ ENTRY(all_intrs)
pushl %edx
cld /* clear direction flag */
+ CPU_NUMBER(%ecx)
movl %esp,%edx /* on an interrupt stack? */
- and $(~(KERNEL_STACK_SIZE-1)),%edx
- cmpl %ss:EXT(int_stack_base),%edx
+ and $(~(INTSTACK_SIZE-1)),%edx
+ cmpl %ss:CX(EXT(int_stack_base),%ecx),%edx
je int_from_intstack /* if not: */
pushl %ds /* save segment registers */