* 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
.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:
*/
EXTERN(switch_to_prot)
-.code16
+ .code16
cli /* None of these */
/* 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
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
*/
EXTERN(switch_to_real)
-.code32
+ .code32
/* We don't know what values are currently */
/* in the segment registers. So we are */
/* 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 */
/* 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
/*
* 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
* 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
* 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
* 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:
* 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
/* 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
.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