diff --git a/ChangeLog b/ChangeLog index b8d3afaf1..ea303ce19 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2009-06-22 Robert Millan + + * kern/i386/pc/startup.S (real_to_prot): Move from here ... + * kern/i386/realmode.S (real_to_prot): ... to here. + 2009-06-22 Robert Millan * conf/i386-ieee1275.rmk (pkglib_PROGRAMS): Replace `kernel.elf' diff --git a/kern/i386/pc/startup.S b/kern/i386/pc/startup.S index f77d7dbe3..cb3fec6ba 100644 --- a/kern/i386/pc/startup.S +++ b/kern/i386/pc/startup.S @@ -290,8 +290,6 @@ codestart: */ call EXT_C(grub_main) -#include "../realmode.S" - /* * This is the area for all of the special variables. */ @@ -301,62 +299,7 @@ VARIABLE(grub_boot_drive) .p2align 2 /* force 4-byte alignment */ -/* - * These next two routines, "real_to_prot" and "prot_to_real" are structured - * in a very specific way. Be very careful when changing them. - * - * NOTE: Use of either one messes up %eax and %ebp. - */ - -real_to_prot: - .code16 - cli - - /* load the GDT register */ -#ifdef APPLE_CC - mov %cs, %ax - mov %ax, %ds - DATA32 ADDR32 lgdt gdtdesc -#else - DATA32 ADDR32 lgdt %cs:gdtdesc -#endif - - /* turn on protected mode */ - movl %cr0, %eax - orl $GRUB_MEMORY_MACHINE_CR0_PE_ON, %eax - movl %eax, %cr0 - - /* jump to relocation, flush prefetch queue, and reload %cs */ - DATA32 ljmp $GRUB_MEMORY_MACHINE_PROT_MODE_CSEG, $protcseg - - .code32 -protcseg: - /* reload other segment registers */ - movw $GRUB_MEMORY_MACHINE_PROT_MODE_DSEG, %ax - movw %ax, %ds - movw %ax, %es - movw %ax, %fs - movw %ax, %gs - movw %ax, %ss - - /* put the return address in a known safe location */ - movl (%esp), %eax - movl %eax, GRUB_MEMORY_MACHINE_REAL_STACK - - /* get protected mode stack */ - movl protstack, %eax - movl %eax, %esp - movl %eax, %ebp - - /* get return address onto the right stack */ - movl GRUB_MEMORY_MACHINE_REAL_STACK, %eax - movl %eax, (%esp) - - /* zero %eax */ - xorl %eax, %eax - - /* return on the old (or initialized) stack! */ - ret +#include "../realmode.S" /* * grub_gate_a20(int on) diff --git a/kern/i386/realmode.S b/kern/i386/realmode.S index d28c5ca56..075aa57e9 100644 --- a/kern/i386/realmode.S +++ b/kern/i386/realmode.S @@ -110,12 +110,62 @@ gdtdesc: .long gdt /* addr */ /* - * These next routine, "prot_to_real" is structured in a very - * specific way. Be very careful when changing it. + * These next two routines, "real_to_prot" and "prot_to_real" are structured + * in a very specific way. Be very careful when changing them. * - * NOTE: Use of it messes up %eax and %ebp. + * NOTE: Use of either one messes up %eax and %ebp. */ +real_to_prot: + .code16 + cli + + /* load the GDT register */ +#ifdef APPLE_CC + mov %cs, %ax + mov %ax, %ds + DATA32 ADDR32 lgdt gdtdesc +#else + DATA32 ADDR32 lgdt %cs:gdtdesc +#endif + + /* turn on protected mode */ + movl %cr0, %eax + orl $GRUB_MEMORY_MACHINE_CR0_PE_ON, %eax + movl %eax, %cr0 + + /* jump to relocation, flush prefetch queue, and reload %cs */ + DATA32 ljmp $GRUB_MEMORY_MACHINE_PROT_MODE_CSEG, $protcseg + + .code32 +protcseg: + /* reload other segment registers */ + movw $GRUB_MEMORY_MACHINE_PROT_MODE_DSEG, %ax + movw %ax, %ds + movw %ax, %es + movw %ax, %fs + movw %ax, %gs + movw %ax, %ss + + /* put the return address in a known safe location */ + movl (%esp), %eax + movl %eax, GRUB_MEMORY_MACHINE_REAL_STACK + + /* get protected mode stack */ + movl protstack, %eax + movl %eax, %esp + movl %eax, %ebp + + /* get return address onto the right stack */ + movl GRUB_MEMORY_MACHINE_REAL_STACK, %eax + movl %eax, (%esp) + + /* zero %eax */ + xorl %eax, %eax + + /* return on the old (or initialized) stack! */ + ret + prot_to_real: /* just in case, set GDT */ lgdt gdtdesc