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>
