From: Michael Brown Date: Tue, 6 Jun 2006 15:30:28 +0000 (+0000) Subject: Code segment may not be writable; create the temporary pointer to the GDT X-Git-Tag: v0.9.3~1299 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e7eca7b7cbd3354916145c36ca88e9e754ef8812;p=thirdparty%2Fipxe.git Code segment may not be writable; create the temporary pointer to the GDT on the stack. --- diff --git a/src/arch/i386/prefix/libprefix.S b/src/arch/i386/prefix/libprefix.S index 10227818c..f0f7682b5 100644 --- a/src/arch/i386/prefix/libprefix.S +++ b/src/arch/i386/prefix/libprefix.S @@ -254,6 +254,7 @@ flatten_real_mode: /* Preserve real-mode segment values and temporary registers */ pushw %es pushw %ds + pushw %bp pushl %eax /* Set GDT base and load GDT */ @@ -261,8 +262,11 @@ flatten_real_mode: movw %cs, %ax shll $4, %eax addl $gdt, %eax - movl %eax, %cs:gdt_base - lgdt %cs:gdt + pushl %eax + pushw %cs:gdt_limit + movw %sp, %bp + lgdt (%bp) + addw $6, %sp /* Switch to protected mode */ movl %cr0, %eax @@ -281,6 +285,7 @@ flatten_real_mode: /* Restore real-mode segment values and temporary registers */ popl %eax + popw %bp popw %ds popw %es ret