65 lines
1.2 KiB
ArmAsm
65 lines
1.2 KiB
ArmAsm
/* https://github.com/cirosantilli/x86-bare-metal-examples#bios-initial-state */
|
|
|
|
#include "common.h"
|
|
|
|
.macro INITIAL_STORE x
|
|
mov %\()\x, \x
|
|
.endm
|
|
|
|
.macro INITIAL_DATA x
|
|
\x: .skip 2
|
|
\x\()s: .ascii "\x = \0"
|
|
.endm
|
|
|
|
.macro INITIAL_PRINT x
|
|
PRINT_STRING $\x\()s
|
|
PRINT_BYTES $\x, $2
|
|
PRINT_NEWLINE
|
|
.endm
|
|
|
|
/* Indispensable initialization.
|
|
* This initialization is a bit redundant with BEGIN,
|
|
* and does dirty some registers, but I haven't found a better option.
|
|
*/
|
|
.code16
|
|
cli
|
|
xor %ax, %ax
|
|
mov %ax, %ds
|
|
|
|
/* We want our data do be before STAGE2,
|
|
* or it will get overwritten during the load.
|
|
*/
|
|
jmp after_data
|
|
|
|
.irp reg, ax, bx, cx, dx, cs, ds, es, fs, gs, ss
|
|
INITIAL_DATA \reg
|
|
.endr
|
|
cr0: .long 0
|
|
cr0s: .ascii "cr0 = \0"
|
|
|
|
after_data:
|
|
|
|
.irp reg, ax, bx, cx, dx, cs, ds, es, fs, gs, ss
|
|
INITIAL_STORE \reg
|
|
.endr
|
|
|
|
/* Does not have a 16-bit mov version. */
|
|
mov %cr0, %eax
|
|
mov %eax, cr0
|
|
|
|
/* We delay a full BEGIN as late as possible
|
|
* to mess with less initial state.
|
|
*/
|
|
BEGIN
|
|
|
|
STAGE2
|
|
|
|
.irp reg, ax, bx, cx, dx, cs, ds, es, fs, gs, ss
|
|
INITIAL_PRINT \reg
|
|
.endr
|
|
PRINT_STRING $cr0s
|
|
PRINT_BYTES cr0, $4
|
|
PRINT_NEWLINE
|
|
|
|
hlt
|