[FREELDR] Fix msvc boot (#1329)
[reactos.git] / boot / freeldr / freeldr / arch / i386 / entry.S
index 795cd40..799764f 100644 (file)
@@ -25,54 +25,59 @@ EXTERN _BootMain:PROC
 EXTERN _InitIdt:PROC
 EXTERN _i386Idt:DWORD
 //EXTERN _i386idtptr:FWORD
+EXTERN cmdline:DWORD
+
+#ifdef _USE_ML
+EXTERN __bss_start__:DWORD
+EXTERN __bss_end__:DWORD
+#endif
 
 .code32
 
 PUBLIC _RealEntryPoint
 _RealEntryPoint:
 
-       /* Setup segment selectors */
-       mov ax, PMODE_DS
-       mov ds, ax
-       mov es, ax
-       mov fs, ax
-       mov gs, ax
-       mov ss, ax
+    /* Setup segment selectors */
+    mov ax, PMODE_DS
+    mov ds, ax
+    mov es, ax
+    mov fs, ax
+    mov gs, ax
+    mov ss, ax
 
     /* Setup protected mode stack */
-       mov esp, dword ptr ds:[stack32]
+    mov esp, dword ptr ds:[stack32]
 
-       /* Load the IDT */
+    /* Load the IDT */
 #ifdef _USE_ML
     lidt fword ptr ds:[i386idtptr]
 #else
-       lidt i386idtptr
+    lidt i386idtptr
 #endif
 
     /* Continue execution */
     jmp dword ptr ds:[ContinueAddress]
 
+PUBLIC ContinueAddress
 ContinueAddress:
     .long _FrldrStartup
 
 
 _FrldrStartup:
 
+ASSUME /*CS:_TEXT,*/ DS:_DATA, ES:_DATA, FS:_DATA, GS:_DATA, SS:_DATA
+
     /* Store BootDrive and BootPartition */
-       mov byte ptr ds:[_FrldrBootDrive], dl
-       xor eax, eax
+    mov byte ptr ds:[_FrldrBootDrive], dl
+    xor eax, eax
     mov al, dh
-       mov dword ptr ds:[_FrldrBootPartition], eax
+    mov dword ptr ds:[_FrldrBootPartition], eax
 
     /* Patch long jump with real mode entry point */
     mov eax, dword ptr ds:[BSS_RealModeEntry]
     mov dword ptr ds:[SwitchToReal16Address], eax
 
-    /* Initialize the idt */
-    call _InitIdt
-
-#ifndef _USE_ML
-    /* Clean out bss */
+    /* Clean out BSS */
     xor eax, eax
     mov edi, offset __bss_start__
     mov ecx, offset __bss_end__ + 3
@@ -80,75 +85,21 @@ _FrldrStartup:
     shr ecx, 2
     rep stosd
 
+    /* Initialize the idt */
+    call _InitIdt
+
     /* Pass the command line to BootMain */
     mov eax, offset cmdline
-#else
-    xor eax, eax
-#endif
 
-       /* GO! */
-       push eax
-       call _BootMain
+    /* GO! */
+    push eax
+    call _BootMain
 
-       /* We should never get here */
+    /* We should never get here */
 stop:
-       jmp     stop
-       nop
-       nop
-
-Int386_regsin:
-       .long 0
-Int386_regsout:
-       .long 0
-
-/*
- * int Int386(int ivec, REGS* in, REGS* out);
- */
-PUBLIC _Int386
-_Int386:
-
-       /* Get the function parameters */
-       mov eax, dword ptr [esp + 4]
-    mov dword ptr ds:[BSS_IntVector], eax
-       mov eax, dword ptr [esp + 8]
-       mov dword ptr [Int386_regsin], eax
-       mov eax, dword ptr [esp + 12]
-       mov dword ptr [Int386_regsout], eax
-
-       /* Save all registers + segment registers */
-       push ds
-       push es
-       push fs
-       push gs
-       pusha
-
-    /* Copy input registers */
-    mov esi, dword ptr [Int386_regsin]
-    mov edi, BSS_RegisterSet
-    mov ecx, REGS_SIZE / 4
-    rep movsd
-
-    /* Set the function ID */
-    mov bx, FNID_Int386
-
-    /* Set continue address and switch to real mode */
-    mov dword ptr [ContinueAddress], offset Int386_return
-    jmp SwitchToReal
-
-Int386_return:
-
-    /* Copy output registers */
-    mov esi, BSS_RegisterSet
-    mov edi, dword ptr [Int386_regsout]
-    mov ecx, REGS_SIZE / 4
-    rep movsd
-
-    popa
-    pop gs
-    pop fs
-    pop es
-    pop ds
-    ret
+    jmp short stop
+    nop
+    nop
 
 
 /*
@@ -158,41 +109,33 @@ Int386_return:
  */
 PUBLIC _PxeCallApi
 _PxeCallApi:
-    push ebp
-    mov ebp, esp
-
-    pusha
-    push es
-
     /* copy entry point */
-    mov eax, [ebp + 8]
+    mov eax, [esp + 4]
     shl eax, 16
-    mov ax, [ebp + 12]
+    mov ax, [esp + 8]
     mov dword ptr ds:[BSS_PxeEntryPoint], eax
 
     /* copy function */
-    mov ax, [ebp + 16]
+    mov ax, [esp + 12]
     mov word ptr ds:[BSS_PxeFunction], ax
 
     /* convert pointer to data buffer to segment/offset */
-    mov eax, [ebp + 20]
+    mov eax, [esp + 16]
     shr eax, 4
     and eax, HEX(0f000)
     mov word ptr ds:[BSS_PxeBufferSegment], ax
-    mov eax, [ebp + 20]
+    mov eax, [esp + 16]
     and eax, HEX(0ffff)
     mov word ptr ds:[BSS_PxeBufferOffset], ax
 
+    pusha
+
     /* Set the function ID and call realmode */
     mov bx, FNID_PxeCallApi
     call i386CallRealMode
 
-    pop es
     popa
 
-    mov esp, ebp
-    pop ebp
-
     mov ax, word ptr [BSS_PxeResult]
 
     ret
@@ -203,26 +146,26 @@ _Reboot:
     /* Set the function ID */
     mov bx, FNID_Reboot
 
-    /*Switch to real mode (We don't return) */
+    /* Switch to real mode (we don't return) */
     jmp SwitchToReal
 
 
 PUBLIC _ChainLoadBiosBootSectorCode
 _ChainLoadBiosBootSectorCode:
     /* Set the boot drive */
-    mov dl, byte ptr [_FrldrBootDrive]
+    mov dl, byte ptr ds:[_FrldrBootDrive]
 
     /* Set the function ID */
     mov bx, FNID_ChainLoadBiosBootSectorCode
 
-    /*Switch to real mode (We don't return) */
+    /* Switch to real mode (we don't return) */
     jmp SwitchToReal
 
 
 PUBLIC i386CallRealMode
 i386CallRealMode:
     /* Set continue address and switch to real mode */
-    mov dword ptr [ContinueAddress], offset i386CallRealMode_return
+    mov dword ptr ds:[ContinueAddress], offset i386CallRealMode_return
     jmp SwitchToReal
 i386CallRealMode_return:
     ret
@@ -231,19 +174,20 @@ i386CallRealMode_return:
 /* Entrypoint for realmode function calls
  * ContinueAddress must be set to the return point from realmode
  * bx must be set to the ID of the realmode function to call. */
+PUBLIC SwitchToReal
 SwitchToReal:
     /* Set sane segments */
-       mov ax, PMODE_DS
-       mov ds, ax
-       mov es, ax
-       mov fs, ax
-       mov gs, ax
-       mov ss, ax
+    mov ax, PMODE_DS
+    mov ds, ax
+    mov es, ax
+    mov fs, ax
+    mov gs, ax
+    mov ss, ax
 
-       /* Save 32-bit stack pointer */
-       mov dword ptr [stack32], esp
+    /* Save 32-bit stack pointer */
+    mov dword ptr ds:[stack32], esp
 
-       /* jmp to 16-bit segment to set the limit correctly */
+    /* jmp to 16-bit segment to set the limit correctly */
     .byte HEX(0ea) // jmp far RMODE_CS:switch_to_real16
 SwitchToReal16Address:
     .long 0 // receives address of switch_to_real16
@@ -251,60 +195,56 @@ SwitchToReal16Address:
     nop
 
 
-       /* 16-bit stack pointer */
+    /* 16-bit stack pointer */
 stack16:
-       .word   STACK16ADDR
+    .word STACK16ADDR
 
-       /* 32-bit stack pointer */
+    /* 32-bit stack pointer */
 stack32:
-       .long   STACK32ADDR
+    .long STACKADDR
 
-    .align 4   /* force 4-byte alignment */
+    .align 4    /* force 4-byte alignment */
 gdt:
-       /* NULL Descriptor */
-       .word HEX(0000)
-       .word HEX(0000)
-       .word HEX(0000)
-       .word HEX(0000)
-
-       /* 32-bit flat CS */
-       .word HEX(FFFF)
-       .word HEX(0000)
-       .word HEX(9A00)
-       .word HEX(00CF)
-
-       /* 32-bit flat DS */
-       .word HEX(FFFF)
-       .word HEX(0000)
-       .word HEX(9200)
-       .word HEX(00CF)
-
-       /* 16-bit real mode CS */
-       .word HEX(FFFF)
-       .word HEX(0000)
-       .word HEX(9E00)
-       .word HEX(0000)
-
-       /* 16-bit real mode DS */
-       .word HEX(FFFF)
-       .word HEX(0000)
-       .word HEX(9200)
-       .word HEX(0000)
+    /* NULL Descriptor */
+   .word HEX(0000)
+   .word HEX(0000)
+   .word HEX(0000)
+   .word HEX(0000)
+
+    /* 32-bit flat CS */
+    .word HEX(FFFF)
+    .word HEX(0000)
+    .word HEX(9A00)
+    .word HEX(00CF)
+
+    /* 32-bit flat DS */
+    .word HEX(FFFF)
+    .word HEX(0000)
+    .word HEX(9200)
+    .word HEX(00CF)
+
+    /* 16-bit real mode CS */
+    .word HEX(FFFF)
+    .word HEX(0000)
+    .word HEX(9E00)
+    .word HEX(0000)
+
+    /* 16-bit real mode DS */
+    .word HEX(FFFF)
+    .word HEX(0000)
+    .word HEX(9200)
+    .word HEX(0000)
 
 /* GDT table pointer */
 gdtptr:
-       .word HEX(27)           /* Limit */
-       .long gdt                       /* Base Address */
-
-/* Real-mode IDT pointer */
-rmode_idtptr:
-       .word HEX(3ff)          /* Limit */
-       .long 0                 /* Base Address */
+    .word HEX(27)       /* Limit */
+    .long gdt           /* Base Address */
 
+// See _i386IdtDescriptor
 PUBLIC i386idtptr
 i386idtptr:
-    .word 255                  /* Limit */
-    .long _i386Idt             /* Base Address */
+    .word 255           /* Limit */
+    .long _i386Idt      /* Base Address */
 
 PUBLIC _FrldrBootDrive
 _FrldrBootDrive: