Applied, thanks! Damien Zammit, le dim. 18 janv. 2026 03:46:50 +0000, a ecrit: > --- > i386/i386/cpu_number.h | 48 ++++++++++++++++++++++++++++++------------ > x86_64/locore.S | 4 ++-- > 2 files changed, 36 insertions(+), 16 deletions(-) > > diff --git a/i386/i386/cpu_number.h b/i386/i386/cpu_number.h > index f7bf2578..0f090d2e 100644 > --- a/i386/i386/cpu_number.h > +++ b/i386/i386/cpu_number.h > @@ -41,15 +41,25 @@ > #define CX(addr, reg) addr(,reg,8) > #endif > > -/* Slow version, always works. > - * Call with 32 bit wide reg on i386 > - * Call with 64 bit wide reg on x86_64 */ > +/* Slow version, always works. */ > +#ifdef __i386__ > #define CPU_NUMBER_NO_STACK(reg) \ > - mov %cs:lapic, reg ;\ > - mov %cs:APIC_ID(reg), reg ;\ > - shr $24, reg ;\ > - and %cs:apic_id_mask, reg ;\ > - mov %cs:CX(cpu_id_lut, reg), 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__ > @@ -82,9 +92,10 @@ > pushq %rdx ;\ > movl $1, %eax ;\ > cpuid ;\ > - shrq $24, %rbx ;\ > - andq %cs:apic_id_mask, %rbx ;\ > - movq %cs:CX(cpu_id_lut, %rbx), %rsi ;\ > + 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 ;\ > @@ -117,9 +128,18 @@ static inline int cpu_number(void) > > #define MY(stm) (percpu_array + PERCPU_##stm) > > -#define CPU_NUMBER_NO_STACK(reg) > -#define CPU_NUMBER_NO_GS(reg) > -#define CPU_NUMBER(reg) > +#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 > > #endif /* NCPUS == 1 */ > diff --git a/x86_64/locore.S b/x86_64/locore.S > index b822c167..6afda87a 100644 > --- a/x86_64/locore.S > +++ b/x86_64/locore.S > @@ -1181,7 +1181,7 @@ syscall_entry_2: > movq %rdx,R_CS(%rsp) /* fix cs */ > movq %rbx,R_EFLAGS(%rsp) /* fix eflags */ > > - CPU_NUMBER_NO_STACK(%rdx) > + CPU_NUMBER_NO_STACK(%r8b, %r8d, %r8, %edx, %rdx) > TIME_TRAP_SENTRY > > movq CX(EXT(kernel_stack),%rdx),%rbx > @@ -1421,7 +1421,7 @@ ENTRY(syscall64) > mov %r10,%rcx /* fix arg3 location according to C ABI > */ > > /* switch to kernel stack, then we can enable interrupts */ > - CPU_NUMBER_NO_STACK(%r11) > + CPU_NUMBER_NO_STACK(%r8b, %r8d, %r8, %r11d, %r11) > movq CX(EXT(kernel_stack),%r11),%rsp > sti > > -- > 2.51.0 > > >
-- Samuel > Quelqu'un aurait-il une solution pour réinitialiser un MBR Si tu veux qu'il soit complètement blanc (pas souhaitable, à mon avis) : dd if=/dev/zero of=/dev/hda bs=512 count=1 (sous Linux) -+- OT in Guide du linuxien (très) pervers - "Pour les K difficiles" -+-
