toaruos/boot/boot.S
2018-10-14 11:35:01 +09:00

129 lines
1.6 KiB
ArmAsm

.code16
main:
ljmp $0x0,$0x7c05
main2:
mov $0x0, %ax
mov %ax, %ds
mov %ax, %ss
mov $0x7b00, %ax
mov %ax, %sp
mov $0x500, %ax
mov %ax, %es
clc
int $0x12
mov %ax, (lower_mem)
mov $0x0, %di
call do_e820
jc hang
cli
in $0x92, %al
or $2, %al
out %al, $0x92
xor %eax, %eax
mov %ds, %ax
shl $4, %eax
add $gdt_base, %eax
mov %eax, gdtr+2
mov $gdt_end, %eax
sub $gdt_base, %eax
mov %ax, gdtr
lgdtw gdtr
mov %cr0, %eax
or $1, %eax
mov %eax, %cr0
mov $0x10, %ax
mov %ax, %ds
mov %ax, %es
mov %ax, %fs
mov %ax, %gs
mov %ax, %ss
.global kmain
ljmp $0x08,$kmain
hang:
jmp hang
do_e820:
xor %ebx, %ebx
xor %bp, %bp
mov $0x534D4150, %edx
mov $0xe820, %eax
movl $0x1,%es:20(%di)
mov $24, %ecx
int $0x15
jb do_e820.failed
mov $0x534D4150, %edx
cmp %edx, %eax
jne do_e820.failed
test %ebx, %ebx
je do_e820.failed
jmp do_e820.jmpin
do_e820.e820lp:
mov $0xe820, %eax
movl $0x1,%es:20(%di)
mov $24, %ecx
int $0x15
jb do_e820.e820f
mov $0x534D4150, %edx
do_e820.jmpin:
jcxz do_e820.skipent
cmp $20, %cl
jbe do_e820.notext
testb $0x1, %es:20(%di)
je do_e820.skipent
do_e820.notext:
mov %es:8(%di), %ecx
or %es:12(%di), %ecx
jz do_e820.skipent
inc %bp
add $24, %di
do_e820.skipent:
test %ebx, %ebx
jne do_e820.e820lp
do_e820.e820f:
mov %bp, mmap_ent
clc
ret
do_e820.failed:
stc
ret
.align 8
gdtr:
.word 0
.long 0
gdt_base:
.quad 0
.word 0xFFFF
.word 0
.byte 0
.byte 0x9a
.byte 0xcf
.byte 0
.word 0xffff
.word 0
.byte 0
.byte 0x92
.byte 0xcf
.byte 0
gdt_end:
.global mmap_ent
mmap_ent:
.byte 0
.byte 0
.global lower_mem
lower_mem:
.byte 0
.byte 0