commit 528b0c16fe05c98cefbef0c6faab4f6819d02991
parent 6769ced179395019001757ab499fa95d3da4fb97
Author: erai <erai@omiltem.net>
Date: Wed, 14 May 2025 14:19:31 -0400
mbr loader
Diffstat:
5 files changed, 222 insertions(+), 19 deletions(-)
diff --git a/.gitignore b/.gitignore
@@ -9,3 +9,4 @@
!cc0.c
!check.py
!pxe.asm
+!mbr.asm
diff --git a/build.sh b/build.sh
@@ -1,12 +1,9 @@
#!/bin/sh
MACHINE="$(uname -m)"
+
LIBS="bufio.om lib.om alloc.om syscall.om syscall.${MACHINE}.om"
CRYPTO="ed25519.om sha512.om sha256.om chacha20.om poly1305.om aes.om rsa.om"
-CC="cc1.om type.om as.om decl.om node.om"
-SSHD="chacha20.om poly1305.om sha256.om sha512.om ed25519.om sshd.om"
-SHELL="echo.om cmp.om rm.om ls.om cat.om xxd.om mv.om mkdir.om cpio.om sh.om"
-BIN="echo cmp rm ls cat xxd mv mkdir cpio sh sshd init cc1"
./cc1 -m ${MACHINE} ${LIBS} echo.om -o echo -n echo.lines -G echo.call
./cc1 -m ${MACHINE} ${LIBS} cmp.om -o cmp -n cmp.lines -G cmp.call
@@ -19,8 +16,3 @@ BIN="echo cmp rm ls cat xxd mv mkdir cpio sh sshd init cc1"
./cc1 -m ${MACHINE} ${LIBS} cpio.om -o cpio -n cpio.lines -G cpio.call
./cc1 -m ${MACHINE} ${LIBS} sh.om -o sh -n sh.lines -G sh.call
./cc1 -m ${MACHINE} ${LIBS} ${CRYPTO} sshd.om -o sshd -n sshd.lines -G sshd.call
-
-for name in ${BIN}; do echo ${name}; done | ./cpio -o > initramfs
-if [ "${MACHINE}" = "x86_64" ]; then
- ./cc1 -m ${MACHINE} kernel.x86_64.om -o kernel.x86_64 -n kernel.x86_64.lines -G kernel.x86_64.call
-fi
diff --git a/kernel.sh b/kernel.sh
@@ -0,0 +1,26 @@
+#!/bin/bash
+
+MACHINE="x86_64"
+
+LIBS="bufio.om lib.om alloc.om syscall.om syscall.${MACHINE}.om"
+CRYPTO="ed25519.om sha512.om sha256.om chacha20.om poly1305.om aes.om rsa.om"
+BIN="echo cmp rm ls cat xxd mv mkdir cpio sh sshd init cc1"
+
+./cc1 -m ${MACHINE} ${LIBS} echo.om -o echo -n echo.lines -G echo.call
+./cc1 -m ${MACHINE} ${LIBS} cmp.om -o cmp -n cmp.lines -G cmp.call
+./cc1 -m ${MACHINE} ${LIBS} rm.om -o rm -n rm.lines -G rm.call
+./cc1 -m ${MACHINE} ${LIBS} mv.om -o mv -n mv.lines -G mv.call
+./cc1 -m ${MACHINE} ${LIBS} mkdir.om -o mkdir -n mkdir.lines -G mkdir.call
+./cc1 -m ${MACHINE} ${LIBS} ls.om -o ls -n ls.lines -G ls.call
+./cc1 -m ${MACHINE} ${LIBS} cat.om -o cat -n cat.lines -G cat.call
+./cc1 -m ${MACHINE} ${LIBS} xxd.om -o xxd -n xxd.lines -G xxd.call
+./cc1 -m ${MACHINE} ${LIBS} cpio.om -o cpio -n cpio.lines -G cpio.call
+./cc1 -m ${MACHINE} ${LIBS} sh.om -o sh -n sh.lines -G sh.call
+./cc1 -m ${MACHINE} ${LIBS} ${CRYPTO} sshd.om -o sshd -n sshd.lines -G sshd.call
+
+for name in ${BIN}; do echo ${name}; done | ./cpio -o > initramfs
+./cc1 -m ${MACHINE} kernel.${MACHINE}.om -o kernel.${MACHINE} -n kernel.${MACHINE}.lines -G kernel.${MACHINE}.call
+
+nasm -f bin mbr.asm -o mbr
+cat mbr kernel.${MACHINE} > disk
+truncate -s '>2M' disk
diff --git a/kernel.x86_64.om b/kernel.x86_64.om
@@ -277,7 +277,7 @@ func memcmp(a: *byte, b: *byte, n: int): int {
}
}
-func bytesum(a: *byte, n: int): byte {
+func bytesum(a: *byte, n: int): int {
var i: int;
var x: byte;
@@ -285,7 +285,7 @@ func bytesum(a: *byte, n: int): byte {
x = 0 as byte;
loop {
if i == n {
- return x;
+ return x as int;
}
x = x + a[i];
@@ -4775,8 +4775,11 @@ func task_init(t: *task) {
// open("/dev/null") => 0
// open("/dev/tty") => 1
// dup(1) => 2
- if vexec("/init", nil, nil) != 0 {
- kdie("failed to exec init");
+ //if vexec("/init", nil, nil) != 0 {
+ // kdie("failed to exec init");
+ //}
+ loop {
+ yield();
}
}
@@ -4848,6 +4851,13 @@ func _kstart(mb: int) {
mmap_start = mmap[i * 3];
mmap_end = mmap_start + mmap[i * 3 + 1];
+ kputh(mmap_start);
+ kputc('-');
+ kputh(mmap_end);
+ kputc(' ');
+ kputh8(mmap[i * 3 + 2] & 15);
+ kputc('\n');
+
if i + 1 < mmap_count {
if mmap_end > mmap[i * 3 + 3] {
kdie("OVERLAP");
@@ -5006,15 +5016,16 @@ func _kstart(mb: int) {
global.lapic = lapic;
pci = map_pci(pcip);
- //scan_pci(pci, show_pcidev);
- scan_pci(pci, init_realtek);
- scan_pci(pci, init_ahci);
+ scan_pci(pci, show_pcidev);
+ //scan_pci(pci, init_realtek);
+ //scan_pci(pci, init_ahci);
+
- tcp_listen(22, tcp_ssh);
+ //tcp_listen(22, tcp_ssh);
- parse_initramfs();
+ //parse_initramfs();
- spawn(task_init, "init", nil);
+ //spawn(task_init, "init", nil);
// Wait for interrupts
kputs("zzz\n");
diff --git a/mbr.asm b/mbr.asm
@@ -0,0 +1,173 @@
+ bits 16
+ org 0x7c00
+
+_start:
+ ; Disable interrupts to relocate
+ cli
+
+ ; Direction forward
+ cld
+
+ ; Clear the segments
+ xor ax, ax
+ mov ds, ax
+ mov es, ax
+ mov fs, ax
+ mov gs, ax
+ mov ss, ax
+ mov esp, 0x2000
+
+ ; Enable A20
+ in al, 0x92
+ or al, 0x02
+ out 0x92, al
+
+ ; Allocate load header
+ sub sp, 32 + 16
+ mov ebp, esp
+
+ ; Extended Read
+ lea si, [bp + 32]
+ mov dword [si + 0], 0x00100010 ; descriptor size and block count
+ mov dword [si + 4], 0x00002000 ; buffer address and segment
+ mov dword [si + 8], 1 ; lba
+ mov dword [si + 12], 0
+ mov ah, 0x42
+ mov dl, 0x80
+ int 0x13
+
+ ; Parse the header
+ mov edi, 0x00002000
+ mov cx, 0x800
+.next_magic:
+ mov eax, 0x1badb002
+ repne scasd
+ cmp cx, 8
+ jb fail
+ add eax, [di]
+ add eax, [di + 4]
+ test eax, eax
+ jnz .next_magic
+
+ ; Check the header has load fields
+ test word [di + 4], 1
+ jz fail
+
+ ; Copy the header to bp
+ xor esi, esi
+ lea si, [di - 4]
+ mov di, bp
+ mov cx, 8
+ rep movsd
+
+ ; load_offset = si - 0x2020 + load_addr - header_addr
+ mov eax, [bp + 16]
+ sub eax, [bp + 12]
+ add eax, esi
+ sub eax, 0x2020
+
+ ; Check load_offset < 8k
+ mov ecx, 0x2000
+ sub ecx, eax
+ jb fail
+
+ ; Copy first page
+ mov edi, [bp + 16]
+ mov esi, 0x2000
+ add esi, eax
+
+.copy_page:
+ a32 rep movsb
+ cmp edi, [bp + 20]
+ jae .load_done
+
+ lea si, [bp + 32]
+ add dword [si + 8], 16
+ mov ah, 0x42
+ mov dl, 0x80
+ int 0x13
+
+ mov esi, 0x2000
+ mov ecx, 0x2000
+ jmp .copy_page
+.load_done:
+
+ ; Boot info header
+ sub sp, 128
+ mov ebp, esp
+ mov dword [bp], 0x40
+
+ ; Find the memory map
+ xor ebx, ebx
+ mov edi, 0x2100
+ mov [bp + 48], edi
+ add edi, 4
+.next_mmap:
+ mov edx, 0x534d4150
+ mov eax, 0xe820
+ mov ecx, 20
+ int 0x15
+ mov edx, 0x534d4150
+ cmp eax, edx
+ jnz fail
+ mov [di - 4], ecx
+ add dword [bp + 44], 24
+ add di, 24
+ test ebx, ebx
+ jnz .next_mmap
+
+ ; Create GDT
+ mov esi, 0x2000
+ ; Null segment
+ mov dword [si + 0], 0
+ mov dword [si + 4], 0
+ ; Code segment
+ mov dword [si + 8], 0x0000ffff
+ mov dword [si + 12], 0x00cf9b00
+ ; Data segment
+ mov dword [si + 16], 0x0000ffff
+ mov dword [si + 20], 0x00cf9300
+
+ ; Load the GDT
+ sub sp, 6
+ mov edi, esp
+ mov word [di + 0], 23
+ mov dword [di + 2], esi
+ lgdt [edi]
+ add sp, 6
+
+ ; Enter protected mode
+ cli
+ mov eax, cr0
+ or al, 1
+ mov cr0, eax
+ jmp 8:_prot
+ bits 32
+
+fail:
+ hlt
+ jmp fail
+
+_prot:
+ ; Load protected segments
+ mov ax, 16
+ mov ds, ax
+ mov es, ax
+ mov fs, ax
+ mov gs, ax
+ mov ss, ax
+ mov esp, esp
+
+ ; Jump to the kernel
+ mov eax, 0x2badb002
+ mov ebx, ebp
+ mov edx, [bp + 28 + 128]
+ jmp edx
+
+ times (446 - ($ - _start)) db 0x90
+
+ ; Partition table
+ times (510 - ($ - _start)) db 0x00
+ ; Signature
+ db 0x55
+ db 0xaa