Applied, thanks!

Damien Zammit, le sam. 14 févr. 2026 04:01:20 +0000, a ecrit:
> 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
> 
> 
> 

-- 
Samuel
#include <culture.h>

Reply via email to