Start working on rom-based kernel
This commit is contained in:
parent
04a7087d79
commit
65564b78af
3
Makefile
3
Makefile
@ -102,3 +102,6 @@ qemu-pxe: pxeboot.0 $(ROMS)
|
||||
-option-rom /usr/share/qemu/pxe-rtl8139.rom \
|
||||
-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=$(CURDIR),bootfile=pxeboot.0
|
||||
|
||||
qemu-rom: kernel.rom
|
||||
$(QEMU) $(QEMU_ARGS) --option-rom kernel.rom
|
||||
|
70
kernel/intr.asm
Normal file
70
kernel/intr.asm
Normal file
@ -0,0 +1,70 @@
|
||||
; Get pointer to interrupt vector
|
||||
; IN al number
|
||||
; OUT 0:bx ptr to vector
|
||||
intr_ptr:
|
||||
xor bh, bh
|
||||
mov bl, al
|
||||
add bx, bx
|
||||
add bx, bx
|
||||
ret
|
||||
|
||||
; Set interrupt vector
|
||||
; IN al number
|
||||
; ds:dx ptr
|
||||
intr_set:
|
||||
push bx
|
||||
call intr_ptr
|
||||
ss mov [bx], dx
|
||||
ss mov [bx+2], ds
|
||||
pop bx
|
||||
ret
|
||||
|
||||
; Get interrupt vector
|
||||
; IN al number
|
||||
; OUT es:bx ptr
|
||||
intr_get:
|
||||
call intr_ptr
|
||||
ss mov es, [bx+2]
|
||||
ss mov bx, [bx]
|
||||
ret
|
||||
|
||||
; Save BIOS vectors
|
||||
; Trashes ax, cx, bx, ds
|
||||
intr_backup:
|
||||
mov cx, 0x20
|
||||
xor bx, bx
|
||||
mov ds, bx
|
||||
.loop: ; load segment
|
||||
mov ax, [bx+2]
|
||||
; skip transfer if not pointing to BIOS
|
||||
cmp ax, 0xA000
|
||||
jc .skip
|
||||
; store segment
|
||||
mov [bx+ivt2+2], ax
|
||||
; copy offset
|
||||
mov ax, [bx]
|
||||
mov [bx+ivt2], ax
|
||||
; iterate to next vector
|
||||
.skip: add bx, 4
|
||||
loop .loop
|
||||
ret
|
||||
|
||||
; Restore BIOS vectors
|
||||
intr_restore:
|
||||
mov cx, 0x20
|
||||
xor bx, bx
|
||||
mov ds, bx
|
||||
.loop: ; load segment
|
||||
mov ax, [bx+ivt2+2]
|
||||
; skip if not a vector to BIOS
|
||||
cmp ax, 0xA000
|
||||
jc .skip
|
||||
; store segment
|
||||
mov [bx+2], ax
|
||||
; copy offset
|
||||
mov ax, [bx+ivt2]
|
||||
mov [bx], ax
|
||||
; iterate to next vector
|
||||
.skip: add bx, 4
|
||||
loop .loop
|
||||
ret
|
68
rom/kernel.asm
Normal file
68
rom/kernel.asm
Normal file
@ -0,0 +1,68 @@
|
||||
cpu 8086
|
||||
org 0x0000
|
||||
|
||||
db 0x55, 0xAA
|
||||
db 0x00
|
||||
jmp near init
|
||||
|
||||
times (0x18 - ($-$$)) db 0
|
||||
dw 0
|
||||
dw pnp
|
||||
|
||||
pnp: db "$PnP"
|
||||
db 1 ; version 1
|
||||
db 2 ; 2 * 16 length
|
||||
dw 0 ; offset of next header
|
||||
db 0
|
||||
db 0 ; checksum (filled by fix-rom)
|
||||
dd 0 ; device identifier
|
||||
dw 0 ; manufacturer string
|
||||
dw name ; product name string
|
||||
db 0,0,0 ; device type string
|
||||
db 0x20 ; device indicator, bit for "read cacheable" set
|
||||
dw 0 ; boot connection vector
|
||||
dw 0 ; boot disconnect vector
|
||||
dw boot ; bootstrap entry point
|
||||
dw 0 ; reserved
|
||||
|
||||
; zero for setting sreg without using reg
|
||||
zero: dw 0
|
||||
|
||||
name: db "rdos", 0
|
||||
|
||||
init: push ds
|
||||
|
||||
; DS := 0
|
||||
mov ds, [cs:zero]
|
||||
; set entry points vectors
|
||||
mov word [0x19*4], boot
|
||||
mov word [0x19*4+2], cs
|
||||
|
||||
pop ds
|
||||
retf
|
||||
|
||||
; entry point on boot, preempting disks
|
||||
; this also doubles as entry point for reboot
|
||||
boot: xor ax, ax
|
||||
mov ss, ax
|
||||
mov sp, stack
|
||||
|
||||
int 3
|
||||
|
||||
hlt: hlt
|
||||
jmp hlt
|
||||
|
||||
%include "kernel/intr.asm"
|
||||
|
||||
align 512
|
||||
|
||||
absolute 0x400
|
||||
resb (0x501 - ($-$$))
|
||||
|
||||
; copy of the first 32 interrupt vectors
|
||||
ivt2: resd 0x20
|
||||
|
||||
; 8kb stack
|
||||
alignb 2
|
||||
resw 0x2000
|
||||
stack:
|
Loading…
Reference in New Issue
Block a user