This relies on gs segment percpu pointer always being
available in critical contexts in smp builds.
TESTED:
- i386+SMP boots to shell with -smp 6
- Passes all i386 CI.
---
i386/i386/cpu_number.h | 73 ------------------------------------------
i386/i386/locore.S | 10 +++---
x86_64/locore.S | 9 +++---
3 files changed, 9 insertions(+), 83 deletions(-)
diff --git a/i386/i386/cpu_number.h b/i386/i386/cpu_number.h
index 4b4ac6c3..a549bb56 100644
--- a/i386/i386/cpu_number.h
+++ b/i386/i386/cpu_number.h
@@ -41,69 +41,6 @@
#define CX(addr, reg) addr(,reg,8)
#endif
-/* Slow version, always works. */
-#ifdef __i386__
-#define CPU_NUMBER_NO_STACK(reg) \
- movl %cs:lapic, reg ;\
- movl %cs:APIC_ID(reg), reg ;\
- shrl $24, reg ;\
- andl %cs:apic_id_mask, reg ;\
- movl %cs:CX(cpu_id_lut, reg), reg
-#endif
-#ifdef __x86_64__
-/* Specify 8/32/64 bit variants of clob and 32/64 variants of reg */
-#define CPU_NUMBER_NO_STACK(clob8, clob32, clob64, reg32, reg64)\
- movq %cs:lapic, clob64 ;\
- movl %cs:APIC_ID(clob64), clob32 ;\
- shrl $24, clob32 ;\
- andb %cs:apic_id_mask, clob8 ;\
- leaq cpu_id_lut(%rip), reg64 ;\
- movl %cs:(reg64, clob64, 8), reg32
-#endif
-
-/* Fast version, requires a stack */
-#ifdef __i386__
-/* Never call CPU_NUMBER_NO_GS(%esi) */
-#define CPU_NUMBER_NO_GS(reg) \
- pushl %esi ;\
- pushl %eax ;\
- pushl %ebx ;\
- pushl %ecx ;\
- pushl %edx ;\
- movl $1, %eax ;\
- cpuid ;\
- shrl $24, %ebx ;\
- andl %cs:apic_id_mask, %ebx ;\
- movl %cs:CX(cpu_id_lut, %ebx), %esi ;\
- popl %edx ;\
- popl %ecx ;\
- popl %ebx ;\
- popl %eax ;\
- movl %esi, reg ;\
- popl %esi
-#endif
-#ifdef __x86_64__
-/* Never call CPU_NUMBER_NO_GS(%rsi) */
-#define CPU_NUMBER_NO_GS(reg) \
- pushq %rsi ;\
- pushq %rax ;\
- pushq %rbx ;\
- pushq %rcx ;\
- pushq %rdx ;\
- movl $1, %eax ;\
- cpuid ;\
- shrl $24, %ebx ;\
- andb %cs:apic_id_mask, %bl ;\
- leaq cpu_id_lut(%rip), %rsi ;\
- movl %cs:(%rsi, %rbx, 4), %esi ;\
- popq %rdx ;\
- popq %rcx ;\
- popq %rbx ;\
- popq %rax ;\
- movq %rsi, reg ;\
- popq %rsi
-#endif
-
/* Fastest version, requires gs being set up */
#define CPU_NUMBER(reg) \
movl MY(CPU_ID), reg;
@@ -130,16 +67,6 @@ static inline int cpu_number(void)
#define MY(stm) (percpu_array + PERCPU_##stm)
-#ifdef __x86_64__
-#define CPU_NUMBER_NO_STACK(clob8, clob32, clob64, reg32, reg64) \
- xorl reg32, reg32
-#endif
-#ifdef __i386__
-#define CPU_NUMBER_NO_STACK(reg) \
- xorl reg, reg
-#endif
-#define CPU_NUMBER_NO_GS(reg) \
- xor reg, reg
#define CPU_NUMBER(reg) \
xor reg, reg
#define CX(addr,reg) addr
diff --git a/i386/i386/locore.S b/i386/i386/locore.S
index ffc0b978..535257c6 100644
--- a/i386/i386/locore.S
+++ b/i386/i386/locore.S
@@ -757,16 +757,15 @@ INTERRUPT(255)
ENTRY(all_intrs)
PUSH_REGS_ISR /* save registers */
cld /* clear direction flag */
+ PUSH_SEGMENTS_ISR /* save segment registers */
+ SET_KERNEL_SEGMENTS(%dx) /* switch to kernel segments */
- CPU_NUMBER_NO_GS(%ecx)
+ CPU_NUMBER(%ecx)
movl %esp,%edx /* on an interrupt stack? */
and $(~(INTSTACK_SIZE-1)),%edx
cmpl %ss:CX(EXT(int_stack_base),%ecx),%edx
je int_from_intstack /* if not: */
- PUSH_SEGMENTS_ISR /* save segment registers */
- SET_KERNEL_SEGMENTS(%dx) /* switch to kernel segments */
-
CPU_NUMBER(%edx)
movl CX(EXT(int_stack_top),%edx),%ecx
@@ -818,12 +817,13 @@ LEXT(return_to_iret) /* to find the
return from calling interrupt) */
iret /* return to caller */
int_from_intstack:
- CPU_NUMBER_NO_GS(%edx)
+ CPU_NUMBER(%edx)
cmpl CX(EXT(int_stack_base),%edx),%esp /* seemingly looping? */
jb stack_overflowed /* if not: */
call EXT(interrupt) /* call interrupt routine */
_return_to_iret_i: /* ( label for kdb_kintr) */
/* must have been on kernel segs */
+ POP_SEGMENTS_ISR /* restore segment regs */
POP_AREGS_ISR /* restore registers */
/* no ASTs */
diff --git a/x86_64/locore.S b/x86_64/locore.S
index af97ff03..e44f0087 100644
--- a/x86_64/locore.S
+++ b/x86_64/locore.S
@@ -871,15 +871,14 @@ ENTRY(all_intrs)
cld /* clear direction flag */
PUSH_SEGMENTS_ISR(%rdx) /* save segment registers */
SWAPGS_ENTRY_IF_NEEDED_R12
+ SET_KERNEL_SEGMENTS(%rdx) /* switch to kernel segments */
- CPU_NUMBER_NO_GS(%rcx)
+ CPU_NUMBER(%ecx)
movq %rsp,%rdx /* on an interrupt stack? */
and $(~(INTSTACK_SIZE-1)),%rdx
cmpq %ss:CX(EXT(int_stack_base),%rcx),%rdx
je int_from_intstack /* if not: */
- SET_KERNEL_SEGMENTS(%rdx) /* switch to kernel segments */
-
CPU_NUMBER(%edx)
movq CX(EXT(int_stack_top),%rdx),%rcx
@@ -934,7 +933,7 @@ LEXT(return_to_iret) /* to find the
return from calling interrupt) */
iretq /* return to caller */
int_from_intstack:
- CPU_NUMBER_NO_GS(%rdx)
+ CPU_NUMBER(%edx)
cmpq CX(EXT(int_stack_base),%rdx),%rsp /* seemingly looping? */
jb stack_overflowed /* if not: */
call EXT(interrupt) /* call interrupt routine */
@@ -1225,7 +1224,7 @@ syscall_entry_2:
movq %rdx,R_CS(%rsp) /* fix cs */
movq %rbx,R_EFLAGS(%rsp) /* fix eflags */
- CPU_NUMBER_NO_STACK(%r8b, %r8d, %r8, %edx, %rdx)
+ CPU_NUMBER(%edx)
TIME_TRAP_SENTRY
movq CX(EXT(kernel_stack),%rdx),%rbx
--
2.45.2