[FREELDR] Limit the usage of DiskStopFloppyMotor() in hardware/platform-specific...
[reactos.git] / boot / freeldr / freeldr / arch / i386 / linux.S
index 51e6fb7..d2b187c 100644 (file)
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-       .text
-       .code16
-
+#include <asm.inc>
 #include <arch/pc/x86common.h>
 
-       .code32
-EXTERN(_BootNewLinuxKernel)
-       call    switch_to_real
-       .code16
-
-       /* Set the boot drive */
-       movb    (_FrldrBootDrive),%dl
-
-       /* Load segment registers */
-       cli
-       movw    $0x9000,%bx
-       movw    %bx,%ds
-       movw    %bx,%es
-       movw    %bx,%fs
-       movw    %bx,%gs
-       movw    %bx,%ss
-       movw    $0x9000,%sp
+EXTERN _DiskStopFloppyMotor:PROC
+EXTERN i386CallRealMode:PROC
 
-       ljmpl   $0x9020,$0x0000
+.code32
 
-
-       .code32
 /*
  *  VOID BootOldLinuxKernel(ULONG KernelSize);
  */
-EXTERN(_BootOldLinuxKernel)
+PUBLIC _BootOldLinuxKernel
+_BootOldLinuxKernel:
+
+    /* First we have to copy the kernel down from 0x100000 to 0x10000 */
+    /* The reason we can overwrite low memory is because this code */
+    /* executes between 0000:8000 and 0000:FFFF. That leaves space for */
+    /* 32k of code before we start interfering with Linux kernel address space. */
 
-       /* First we have to copy the kernel down from 0x100000 to 0x10000 */
-       /* The reason we can overwrite low memory is because this code */
-       /* executes between 0000:8000 and 0000:FFFF. That leaves space for */
-       /* 32k of code before we start interfering with Linux kernel address space. */
+    /* Get KernelSize in ECX and move the kernel down */
+    mov ecx, [esp + 4]
+    mov esi, HEX(100000)
+    mov edi, HEX(10000)
+    rep movsb
 
-       /* Get KernelSize in ECX and move the kernel down */
-       movl    0x04(%esp),%ecx
-       movl    $0x100000,%esi
-       movl    $0x10000,%edi
-       rep movsb
+    /* Fall through */
 
-       call    switch_to_real
-       .code16
+PUBLIC _BootNewLinuxKernel
+_BootNewLinuxKernel:
+    /* Stop the floppy drive motor */
+    call _DiskStopFloppyMotor
 
-       /* Set the boot drive */
-       movb    (_FrldrBootDrive),%dl
+    mov bx, FNID_BootLinuxKernel
+    call i386CallRealMode
 
-       /* Load segment registers */
-       cli
-       movw    $0x9000,%bx
-       movw    %bx,%ds
-       movw    %bx,%es
-       movw    %bx,%fs
-       movw    %bx,%gs
-       movw    %bx,%ss
-       movw    $0x9000,%sp
+    /* We should never get here */
+    int 3
 
-       ljmpl   $0x9020,$0x0000
+END