- Revert 49927 "Update to trunk" as it breaks KsStudio (again)
[reactos.git] / boot / freeldr / freeldr / arch / i386 / arch.S
index 225dc4b..9e9475e 100644 (file)
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-.intel_syntax noprefix
-#define HEX(y) 0x##y
+       .text
+       .code16
 
 #define ASM
 #include <arch.h>
 #include <multiboot.h>
 
-       .code16
 
 EXTERN(RealEntryPoint)
 
        cli
 
        /* Setup segment registers */
-       xor ax, ax
-       mov ds, ax
-       mov es, ax
-       mov fs, ax
-       mov gs, ax
-       mov ss, ax
-
+       xorw    %ax,%ax
+       movw    %ax,%ds
+       movw    %ax,%es
+       movw    %ax,%fs
+       movw    %ax,%gs
+       movw    %ax,%ss
        /* Setup a stack */
-       mov sp, word ptr ds:stack16
+       movw    stack16,%sp
 
        sti
 
@@ -49,24 +47,24 @@ EXTERN(RealEntryPoint)
        .code32
 
        /* Zero BootDrive and BootPartition */
-       xor eax, eax
-       mov dword ptr [_BootDrive], eax
-       mov dword ptr [_BootPartition], eax
+       xorl    %eax,%eax
+       movl    %eax,(_BootDrive)
+       movl    %eax,(_BootPartition)
 
        /* Store the boot drive */
-       mov byte ptr [_BootDrive], dl
+       movb    %dl,(_BootDrive)
 
        /* Store the boot partition */
-       mov byte ptr [_BootPartition], dh
+       movb    %dh,(_BootPartition)
 
        /* GO! */
-       push eax
+       pushl   %eax
        call    _BootMain
 
        call    switch_to_real
        .code16
 
-       int HEX(19)
+       int     $0x19
 
        /* We should never get here */
 stop:
@@ -80,7 +78,7 @@ stop:
  */
 EXTERN(switch_to_prot)
 
-.code16
+       .code16
 
        cli             /* None of these */
 
@@ -90,18 +88,18 @@ EXTERN(switch_to_prot)
        /* Of course CS has to already be valid. */
        /* We are currently in real-mode so we */
        /* need real-mode segment values. */
-       xor ax, ax
-       mov ds, ax
-       mov es, ax
-       mov fs, ax
-       mov gs, ax
-       mov ss, ax
+       xorw    %ax,%ax
+       movw    %ax,%ds
+       movw    %ax,%es
+       movw    %ax,%fs
+       movw    %ax,%gs
+       movw    %ax,%ss
 
        /* Get the return address off the stack */
-       pop word ptr ds:[code32ret]
+       popw    (code32ret)
 
        /* Save 16-bit stack pointer */
-       mov word ptr ds:[stack16], sp
+       movw    %sp,stack16
 
        /* Load the GDT */
        lgdt    gdtptr
@@ -109,28 +107,28 @@ EXTERN(switch_to_prot)
        lidt    i386idtptr
 
        /* Enable Protected Mode */
-       mov eax, cr0
-       or eax, CR0_PE_SET
-       mov cr0, eax
+       mov     %cr0,%eax
+       orl     $CR0_PE_SET,%eax
+       mov     %eax,%cr0
 
        /* Clear prefetch queue & correct CS */
-       //ljmp  PMODE_CS, inpmode
-    jmp far ptr PMODE_CS:inpmode
+       ljmp    $PMODE_CS, $inpmode
+
 
-.code32
+       .code32
 
 inpmode:
        /* Setup segment selectors */
-       mov ax, PMODE_DS
-       mov ds, ax
-       mov es, ax
-       mov fs, ax
-       mov gs, ax
-       mov ss, ax
-       mov esp, dword ptr [stack32]
+       movw    $PMODE_DS,%ax
+       movw    %ax,%ds
+       movw    %ax,%es
+       movw    %ax,%fs
+       movw    %ax,%gs
+       movw    %ax,%ss
+       movl    stack32,%esp
 
        /* Put the return address back onto the stack */
-       push dword ptr [code32ret]
+       pushl   (code32ret)
 
        /* Now return in p-mode! */
        ret
@@ -141,7 +139,7 @@ inpmode:
  */
 EXTERN(switch_to_real)
 
-.code32
+       .code32
 
        /* We don't know what values are currently */
        /* in the segment registers. So we are */
@@ -149,49 +147,48 @@ EXTERN(switch_to_real)
        /* Of course CS has to already be valid. */
        /* We are currently in protected-mode so we */
        /* need protected-mode segment values. */
-       mov ax, PMODE_DS
-       mov ds, ax
-       mov es, ax
-       mov fs, ax
-       mov gs, ax
-       mov ss, ax
+       movw    $PMODE_DS,%ax
+       movw    %ax,%ds
+       movw    %ax,%es
+       movw    %ax,%fs
+       movw    %ax,%gs
+       movw    %ax,%ss
 
        /* Get the return address off the stack */
-       pop dword ptr [code16ret]
+       popl    (code16ret)
 
        /* Save 32-bit stack pointer */
-       mov dword ptr [stack32], esp
+       movl    %esp,stack32
 
        /* jmp to 16-bit segment to set the limit correctly */
-       ljmp RMODE_CS, switch_to_real16
+       ljmp    $RMODE_CS, $switch_to_real16
 
 switch_to_real16:
-.code16
+       .code16
 
        /* Restore segment registers to correct limit */
-       mov ax, RMODE_DS
-       mov ds, ax
-       mov es, ax
-       mov fs, ax
-       mov gs, ax
-       mov ss, ax
+       movw    $RMODE_DS,%ax
+       movw    %ax,%ds
+       movw    %ax,%es
+       movw    %ax,%fs
+       movw    %ax,%gs
+       movw    %ax,%ss
 
        /* Disable Protected Mode */
-       mov     eax, cr0
-       and eax, CR0_PE_CLR
-       mov     cr0, eax
+       mov     %cr0,%eax
+       andl    $CR0_PE_CLR,%eax
+       mov     %eax,%cr0
 
        /* Clear prefetch queue & correct CS */
-       //ljmp  $0, $inrmode
-       jmp far ptr 0:inrmode
+       ljmp    $0, $inrmode
 
 inrmode:
-       mov ax, cs
-       mov ds, ax
-       mov es, ax
-       mov fs, ax
-       mov gs, ax
-       mov ss, ax
+       movw    %cs,%ax
+       movw    %ax,%ds
+       movw    %ax,%es
+       movw    %ax,%fs
+       movw    %ax,%gs
+       movw    %ax,%ss
 
        /* Clear out the high 16-bits of ESP */
        /* This is needed because I have one */
@@ -199,12 +196,12 @@ inrmode:
        /* anything other than 0x0000 is in the high */
        /* 16-bits of ESP. Even though real-mode */
        /* code should only use SP and not ESP. */
-       xor esp, esp
+       xorl    %esp,%esp
 
-       mov sp, word ptr ds:[stack16]
+       movw    stack16,%sp
 
        /* Put the return address back onto the stack */
-       push word ptr ds:[code16ret]
+       pushw   (code16ret)
 
        /* Load IDTR with real mode value */
        lidt    rmode_idtptr
@@ -218,14 +215,14 @@ inrmode:
        /*
         * Needed for enabling the a20 address line
         */
-.code16
+       .code16
 empty_8042:
        .word   0x00eb,0x00eb            // jmp $+2, jmp $+2
-       in al, HEX(64)
-       cmp al, HEX(ff)               // legacy-free machine without keyboard
-       jz empty_8042_ret           // controllers on Intel Macs read back 0xFF
-       test al, 2
-       jnz empty_8042
+       inb     $0x64,%al
+       cmp     $0xff, %al               // legacy-free machine without keyboard
+       jz      empty_8042_ret           // controllers on Intel Macs read back 0xFF
+       testb   $0x02,%al
+       jnz     empty_8042
 empty_8042_ret:
        ret
 
@@ -233,24 +230,24 @@ empty_8042_ret:
         * Enable the A20 address line (to allow access to over 1mb)
         */
 EXTERN(_EnableA20)
-.code32
+       .code32
 
-       pusha
+       pushal
 
-       call switch_to_real
-.code16
+       call    switch_to_real
+       .code16
 
-       call empty_8042
-       mov al, HEX(D1)                // command write
-       out HEX(64), al
-       call empty_8042
-       mov al, HEX(DF)                // A20 on
-       out     HEX(60), al
-       call empty_8042
-       call switch_to_prot
+       call    empty_8042
+       movb    $0xD1,%al                // command write
+       outb    %al,$0x64
+       call    empty_8042
+       mov     $0xDF,%al                // A20 on
+       out     %al,$0x60
+       call    empty_8042
+       call    switch_to_prot
        .code32
 
-       popa
+       popal
 
        ret
 
@@ -258,24 +255,24 @@ EXTERN(_EnableA20)
         * Disable the A20 address line
         */
 EXTERN(_DisableA20)
-.code32
+       .code32
 
-       pusha
+       pushal
 
-       call switch_to_real
+       call    switch_to_real
        .code16
 
        call    empty_8042
-       mov al, HEX(D1)                // command write
-       out HEX(64), al
-       call empty_8042
-       mov al, HEX(DD)                // A20 off
-       out HEX(60), al
+       movb    $0xD1,%al                // command write
+       outb    %al,$0x64
+       call    empty_8042
+       mov     $0xDD,%al                // A20 off
+       out     %al,$0x60
        call    empty_8042
        call    switch_to_prot
        .code32
 
-       popa
+       popal
 
        ret
 
@@ -297,11 +294,11 @@ EXTERN(_DisableA20)
  * above 1MB. So we let Grub load us there and then relocate
  * ourself to 0x8000
  */
-#define FREELDR_BASE HEX(8000)
-#define INITIAL_BASE HEX(200000)
+#define FREELDR_BASE 0x8000
+#define INITIAL_BASE 0x200000
 
        /* Align 32 bits boundary */
-.align 4
+       .align 4
        
        /* Multiboot header */
 MultibootHeader:
@@ -333,45 +330,44 @@ MultibootEntry:
         * our own */
        lgdt    gdtptrhigh + INITIAL_BASE - FREELDR_BASE
        /* Reload segment selectors */
-       //ljmp  $PMODE_CS, $(mb1 + INITIAL_BASE - FREELDR_BASE)
-       jmp far ptr PMODE_CS: (mb1 + INITIAL_BASE - FREELDR_BASE)
+       ljmp    $PMODE_CS, $(mb1 + INITIAL_BASE - FREELDR_BASE)
 mb1:
-       mov dx, PMODE_DS
-       mov ds, dx
-       mov es, dx
+       movw    $PMODE_DS,%dx
+       movw    %dx,%ds
+       movw    %dx,%es
 
        /* Check for valid multiboot signature */
-       cmp eax, MULTIBOOT_BOOTLOADER_MAGIC
-       jne mbfail
+       cmpl    $MULTIBOOT_BOOTLOADER_MAGIC,%eax
+       jne     mbfail
 
        /* Store multiboot info in a safe place */
-       mov esi, ebx
-       mov edi, offset mb_info + INITIAL_BASE - FREELDR_BASE
-       mov ecx, MB_INFO_SIZE
+       movl    %ebx,%esi
+       movl    $(mb_info + INITIAL_BASE - FREELDR_BASE),%edi
+       movl    $MB_INFO_SIZE,%ecx
        rep movsb
 
        /* Save commandline */
-       mov edx, [ebx + MB_INFO_FLAGS_OFFSET]
-       test dword ptr [ebx + MB_INFO_FLAGS_OFFSET], MB_INFO_FLAG_COMMAND_LINE
-       jz mb3
-       mov esi, [ebx + MB_INFO_COMMAND_LINE_OFFSET]
-       mov edi, offset cmdline + INITIAL_BASE - FREELDR_BASE
-       mov ecx, CMDLINE_SIZE
+       movl    MB_INFO_FLAGS_OFFSET(%ebx),%edx
+       testl   $MB_INFO_FLAG_COMMAND_LINE,MB_INFO_FLAGS_OFFSET(%ebx)
+       jz      mb3
+       movl    MB_INFO_COMMAND_LINE_OFFSET(%ebx),%esi
+       movl    $(cmdline + INITIAL_BASE - FREELDR_BASE),%edi
+       movl    $CMDLINE_SIZE,%ecx
 mb2:   lodsb
        stosb
-       test al, al
-       jz mb3
-       dec ecx
-       jnz mb2
+       testb   %al,%al
+       jz      mb3
+       dec     %ecx
+       jnz     mb2
 mb3:
 
        /* Copy to low mem */
-       mov esi, INITIAL_BASE
-       mov edi, FREELDR_BASE
-       mov ecx, (offset __bss_end__ - FREELDR_BASE)
-       add ecx, 3
-       shr ecx, 2
-       rep movsd
+       movl    $INITIAL_BASE,%esi
+       movl    $FREELDR_BASE,%edi
+       movl    $(__bss_end__ - FREELDR_BASE),%ecx
+       addl    $3,%ecx
+       shrl    $2,%ecx
+       rep movsl
 
        /* Load the GDT and IDT */
        lgdt    gdtptr
@@ -379,49 +375,47 @@ mb3:
 
        /* Clear prefetch queue & correct CS,
         * jump to low mem */
-       //ljmp  $PMODE_CS, $mb4
-       jmp far ptr PMODE_CS:mb4
+       ljmp    $PMODE_CS, $mb4
 mb4:
        /* Reload segment selectors */
-       mov dx, PMODE_DS
-       mov ds, dx
-       mov es, dx
-       mov fs, dx
-       mov gs, dx
-       mov ss, dx
-       mov esp, STACK32ADDR
-
-       mov ebx, offset mb_info
+       movw    $PMODE_DS,%dx
+       movw    %dx,%ds
+       movw    %dx,%es
+       movw    %dx,%fs
+       movw    %dx,%gs
+       movw    %dx,%ss
+       movl    $STACK32ADDR,%esp
+
+       movl    $mb_info,%ebx
        /* See if the boot device was passed in */
-       mov edx, [ebx + MB_INFO_FLAGS_OFFSET]
-       test edx, MB_INFO_FLAG_BOOT_DEVICE
-       jz mb5
+       movl    MB_INFO_FLAGS_OFFSET(%ebx),%edx
+       testl   $MB_INFO_FLAG_BOOT_DEVICE,%edx
+       jz      mb5
        /* Retrieve boot device info */
-       mov eax, [ebx + MB_INFO_BOOT_DEVICE_OFFSET]
-       shr eax, 16
-       inc al
-       mov byte ptr _BootPartition, al
-       mov byte ptr _BootDrive, ah
-       jmp mb6
+       movl    MB_INFO_BOOT_DEVICE_OFFSET(%ebx),%eax
+       shrl    $16,%eax
+       incb    %al
+       movb    %al,_BootPartition
+       movb    %ah,_BootDrive
+       jmp     mb6
 mb5:   /* No boot device known, assume first partition of first harddisk */
-       mov byte ptr _BootDrive, HEX(80)
-       mov byte ptr _BootPartition, 1
+       movb    $0x80,_BootDrive
+       movb    $1,_BootPartition
 mb6:
        /* Check for command line */
-       mov eax, offset cmdline
-       test dword ptr [ebx + MB_INFO_FLAGS_OFFSET], MB_INFO_FLAG_COMMAND_LINE
-       jnz mb7
-       xor eax, eax
+       mov     $cmdline,%eax
+       testl   $MB_INFO_FLAG_COMMAND_LINE,MB_INFO_FLAGS_OFFSET(%ebx)
+       jnz     mb7
+       xorl    %eax,%eax
 mb7:
 
        /* GO! */
-       push eax        
+       pushl   %eax    
        call    _BootMain
 
-mbfail:
-       call    switch_to_real
+mbfail:        call    switch_to_real
        .code16
-       int     0x19
+       int     $0x19
 mbstop:        jmp     mbstop  /* We should never get here */
 
        .code32
@@ -443,52 +437,52 @@ code32ret:
        .long   0
 
 
-    .align 4   /* force 4-byte alignment */
+       .p2align        2       /* force 4-byte alignment */
 gdt:
        /* NULL Descriptor */
-       .word HEX(0000)
-       .word HEX(0000)
-       .word HEX(0000)
-       .word HEX(0000)
+       .word   0x0000
+       .word   0x0000
+       .word   0x0000
+       .word   0x0000
 
        /* 32-bit flat CS */
-       .word HEX(FFFF)
-       .word HEX(0000)
-       .word HEX(9A00)
-       .word HEX(00CF)
+       .word   0xFFFF
+       .word   0x0000
+       .word   0x9A00
+       .word   0x00CF
 
        /* 32-bit flat DS */
-       .word HEX(FFFF)
-       .word HEX(0000)
-       .word HEX(9200)
-       .word HEX(00CF)
+       .word   0xFFFF
+       .word   0x0000
+       .word   0x9200
+       .word   0x00CF
 
        /* 16-bit real mode CS */
-       .word HEX(FFFF)
-       .word HEX(0000)
-       .word HEX(9E00)
-       .word HEX(0000)
+       .word   0xFFFF
+       .word   0x0000
+       .word   0x9E00
+       .word   0x0000
 
        /* 16-bit real mode DS */
-       .word HEX(FFFF)
-       .word HEX(0000)
-       .word HEX(9200)
-       .word HEX(0000)
+       .word   0xFFFF
+       .word   0x0000
+       .word   0x9200
+       .word   0x0000
 
 /* GDT table pointer */
 gdtptr:
-       .word HEX(27)           /* Limit */
-       .long gdt                       /* Base Address */
+       .word   0x27            /* Limit */
+       .long   gdt                     /* Base Address */
 
 /* Initial GDT table pointer for multiboot */
 gdtptrhigh:
-       .word HEX(27)           /* Limit */
-       .long gdt + INITIAL_BASE - FREELDR_BASE /* Base Address */
+       .word   0x27            /* Limit */
+       .long   gdt + INITIAL_BASE - FREELDR_BASE       /* Base Address */
 
 /* Real-mode IDT pointer */
 rmode_idtptr:
-       .word HEX(3ff)          /* Limit */
-       .long 0                 /* Base Address */
+       .word   0x3ff           /* Limit */
+       .long   0                       /* Base Address */
 
 mb_info:
        .fill   MB_INFO_SIZE, 1, 0