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



Reply via email to