Code segment may not be writable; create the temporary pointer to the GDT
authorMichael Brown <mcb30@etherboot.org>
Tue, 6 Jun 2006 15:30:28 +0000 (15:30 +0000)
committerMichael Brown <mcb30@etherboot.org>
Tue, 6 Jun 2006 15:30:28 +0000 (15:30 +0000)
on the stack.

src/arch/i386/prefix/libprefix.S

index 1022781..f0f7682 100644 (file)
@@ -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