Hello, Damien Zammit via Bug reports for the GNU Hurd, le sam. 21 déc. 2024 23:55:17 +0000, a ecrit: > + movl %eax, %ebx > + > + /* Make eax hold offset to my cpus gdt */ > + movl $((GDT_DESCR_M32 + GDT_TABLE_M32) * 4), %eax > + mul %ebp > + > + /* Patch only our own copy of gdt */ > + movl $apboot_percpu_low, %ecx > + addl %eax, %ecx > + movw %bx, (%ecx) > + shr $16, %ebx > + addl $2, %ecx > + movb %bl, (%ecx) > + shr $8, %bx > + addl $3, %ecx > + movb %bl, (%ecx) > + > + /* Patch only our own copy of gdt descriptor */ > + movl $apboot_gdt_descr, %ecx > + addl %eax, %ecx > + movl %ecx, %edx > + addl $2, %edx > + movl (%edx), %ebx > + addl %eax, %ebx > + movl %ebx, (%edx) > + > + /* Reload our copy of gdt */ > + lgdtl (%ecx) > + ljmpl $KERNEL_CS, $2f
This is quite verbose. Could you check that the attached patch on top of it still works? Samuel
diff --git a/i386/i386/cpuboot.S b/i386/i386/cpuboot.S index b9b6d632..6ba7aa42 100644 --- a/i386/i386/cpuboot.S +++ b/i386/i386/cpuboot.S @@ -44,6 +44,7 @@ apboot_gdt_top: .word 0 apboot_gdt_descr: .word (GDT_TABLE_M32 * 4) - 1 +apboot_gdt_descr_addr: .long apboot_gdt - KERNELBASE .align 16 apboot_gdt: @@ -200,27 +201,17 @@ apboot_jmp_offset: mul %ebp /* Patch only our own copy of gdt */ - movl $apboot_percpu_low, %ecx - addl %eax, %ecx - movw %bx, (%ecx) + movw %bx, apboot_percpu_low(%eax) shr $16, %ebx - addl $2, %ecx - movb %bl, (%ecx) + movb %bl, apboot_percpu_med(%eax) shr $8, %bx - addl $3, %ecx - movb %bl, (%ecx) + movb %bl, apboot_percpu_high(%eax) /* Patch only our own copy of gdt descriptor */ - movl $apboot_gdt_descr, %ecx - addl %eax, %ecx - movl %ecx, %edx - addl $2, %edx - movl (%edx), %ebx - addl %eax, %ebx - movl %ebx, (%edx) + addl %eax, apboot_gdt_descr_addr(%eax) /* Reload our copy of gdt */ - lgdtl (%ecx) + lgdtl apboot_gdt_descr(%eax) ljmpl $KERNEL_CS, $2f 2: