kernel: Generalize startup code into main
This commit is contained in:
parent
8d12a42442
commit
8b750aabe9
7
Makefile
7
Makefile
@ -1,7 +0,0 @@
|
|||||||
default: nbp.com
|
|
||||||
|
|
||||||
%.com: %.asm
|
|
||||||
nasm -s -o $@ $<
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f *.com
|
|
7
kernel/Makefile
Normal file
7
kernel/Makefile
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
default: kernel.com
|
||||||
|
|
||||||
|
kernel.com: *.asm
|
||||||
|
nasm -s -o kernel.com main.asm
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f *.com
|
@ -1,3 +1,53 @@
|
|||||||
|
; assumptions about the starting envionment
|
||||||
|
cpu 8086
|
||||||
|
org 0x0000
|
||||||
|
|
||||||
|
_startup:
|
||||||
|
xor ax, ax ; trash ax
|
||||||
|
mov ax, cs
|
||||||
|
cmp ax, 0x0000 ; MBR or NBP, CS=0000 IP=7C00
|
||||||
|
je .mbr
|
||||||
|
cmp ax, 0x07C0 ; MBR on weird BIOS, CS=07C0 IP=0000
|
||||||
|
je .mbr
|
||||||
|
.dos:
|
||||||
|
; ROP because call only works on immediate or memory
|
||||||
|
mov ax, cs
|
||||||
|
push ax ; return CS
|
||||||
|
mov ax, .dosret
|
||||||
|
add ax, 0x0100
|
||||||
|
push ax ; return IP
|
||||||
|
mov ax, cs
|
||||||
|
add ax, 0x0010
|
||||||
|
push ax ; main CS
|
||||||
|
mov ax, main
|
||||||
|
push ax ; main IP
|
||||||
|
retf
|
||||||
|
.dosret:
|
||||||
|
int 0x20
|
||||||
|
jmp .halt
|
||||||
|
.mbr:
|
||||||
|
push si ; index of partition table entry
|
||||||
|
push ds ; segment for ^
|
||||||
|
push dx ; dl might contain drive number
|
||||||
|
push bx ; possible offset for pxeenv+ struct
|
||||||
|
push es ; segment for ^
|
||||||
|
|
||||||
|
mov ax, 0x0050
|
||||||
|
mov es, ax
|
||||||
|
mov di, 0x0000
|
||||||
|
|
||||||
|
xor ax, ax
|
||||||
|
mov ds, ax
|
||||||
|
mov si, 0x7C00
|
||||||
|
|
||||||
|
mov cx, _reloc_end
|
||||||
|
rep movsb
|
||||||
|
|
||||||
|
call 0x0050:main
|
||||||
|
.halt:
|
||||||
|
hlt
|
||||||
|
jmp .halt
|
||||||
|
|
||||||
main:
|
main:
|
||||||
mov ax, cs
|
mov ax, cs
|
||||||
mov ds, ax
|
mov ds, ax
|
||||||
@ -10,10 +60,12 @@ main:
|
|||||||
|
|
||||||
retf
|
retf
|
||||||
|
|
||||||
%include "kernel/heap.asm"
|
%include "heap.asm"
|
||||||
%include "kernel/intr.asm"
|
%include "intr.asm"
|
||||||
%include "kernel/debug.asm"
|
%include "debug.asm"
|
||||||
%include "kernel/kprintf.asm"
|
%include "kprintf.asm"
|
||||||
|
|
||||||
|
_reloc_end:
|
||||||
|
|
||||||
align 16
|
align 16
|
||||||
heap:
|
heap:
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
exec qemu-system-x86_64 -boot n -fda fd0.img \
|
exec qemu-system-x86_64 -boot n \
|
||||||
-option-rom /usr/share/qemu/pxe-rtl8139.rom \
|
-option-rom /usr/share/qemu/pxe-rtl8139.rom \
|
||||||
-device e1000,netdev=mynet0,mac=52:54:00:12:34:56 \
|
-device e1000,netdev=mynet0,mac=52:54:00:12:34:56 \
|
||||||
-netdev user,id=mynet0,net=192.168.76.0/24,dhcpstart=192.168.76.9,tftp=$PWD,bootfile=nbp.com
|
-netdev user,id=mynet0,net=192.168.76.0/24,dhcpstart=192.168.76.9,tftp=$PWD,bootfile=kernel.com
|
59
nbp.asm
59
nbp.asm
@ -1,59 +0,0 @@
|
|||||||
; assumptions about the starting envionment
|
|
||||||
cpu 8086
|
|
||||||
org 0x0000
|
|
||||||
; es:bx pxeenv+ structure
|
|
||||||
; ss:sp functional stack
|
|
||||||
|
|
||||||
_startup:
|
|
||||||
xor ax, ax
|
|
||||||
mov ax, cs
|
|
||||||
cmp ax, 0x0000 ; MBR or NBP, CS=0000 IP=7C00
|
|
||||||
je .mbr
|
|
||||||
cmp ax, 0x07C0 ; MBR on weird BIOS, CS=07C0 IP=0000
|
|
||||||
je .mbr
|
|
||||||
.dos:
|
|
||||||
mov ax, cs
|
|
||||||
push ax ; return CS
|
|
||||||
mov ax, .dosret
|
|
||||||
add ax, 0x0100
|
|
||||||
push ax ; return IP
|
|
||||||
|
|
||||||
mov ax, cs
|
|
||||||
add ax, 0x0010
|
|
||||||
push ax ; main CS
|
|
||||||
mov ax, main
|
|
||||||
push ax ; main IP
|
|
||||||
retf
|
|
||||||
.dosret:
|
|
||||||
int 0x20
|
|
||||||
int 0x18
|
|
||||||
.mbr:
|
|
||||||
mov ax, 0x0050
|
|
||||||
mov ds, ax
|
|
||||||
mov [0xFFFE], ss ; save current stack configuration onto new stack
|
|
||||||
mov [0xFFFC], sp
|
|
||||||
mov ss, ax
|
|
||||||
mov sp, 0xFFFC
|
|
||||||
|
|
||||||
push dx
|
|
||||||
push bx ; possible far ptr to pxeenv+ struct
|
|
||||||
push es
|
|
||||||
|
|
||||||
mov es, ax ; 0x0050
|
|
||||||
mov di, 0x0000
|
|
||||||
|
|
||||||
xor ax, ax
|
|
||||||
mov ds, ax
|
|
||||||
mov si, 0x7C00
|
|
||||||
|
|
||||||
mov cx, _reloc_end
|
|
||||||
rep movsb
|
|
||||||
|
|
||||||
call 0x0050:main
|
|
||||||
.halt:
|
|
||||||
hlt
|
|
||||||
jmp .halt
|
|
||||||
|
|
||||||
%include "kernel/main.asm"
|
|
||||||
|
|
||||||
_reloc_end:
|
|
Loading…
Reference in New Issue
Block a user