os

An operating system
git clone https://erai.gay/code/os/
Log | Files | Refs | README | LICENSE

commit 778abaa4a0c04cb4227d5ce01f6f9c1508a85032
parent 5c9dbf55e34322f70886bfe65be4d55437a5088b
Author: erai <erai@omiltem.net>
Date:   Wed, 24 Apr 2024 12:20:27 -0400

sorta boot on real hardware

Diffstat:
Mkernel.c | 95++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------------------
1 file changed, 67 insertions(+), 28 deletions(-)

diff --git a/kernel.c b/kernel.c @@ -184,31 +184,38 @@ bzero(s: *byte, size: int) { _isr(r: *regs) { if (r.trap < 32) { - sputs("EX "); - sputd(r.trap); - sputs("\n"); + //sputs("EX "); + //sputd(r.trap); + //sputs("\n"); } if (r.trap == 2) { - sputs("NMI\n"); + //sputs("NMI\n"); } + var vga: *byte; + + vga = ptov(0xB8000); + + vga[2] = ('A' + r.trap):byte; + vga[3] = 0x0e:byte; + // pic end of interrupt if (r.trap >= 32 && r.trap < 48) { if (r.trap == 32) { } else if (r.trap == 42) { - sputc('n'); - sputc('\n'); + //sputc('n'); + //sputc('\n'); } else if (r.trap == 43) { // ethernet interrupt - sputc('e'); + //sputc('e'); } if (r.trap < 40) { outb(IO_PIC1, 0x0b); if inb(IO_PIC1) & (1 << (r.trap & 7)) { outb(IO_PIC1, 0x20); } else { - sputs("s\n"); + //sputs("s\n"); } } else { outb(IO_PIC2, 0x0b); @@ -216,7 +223,7 @@ _isr(r: *regs) { outb(IO_PIC2, 0x20); outb(IO_PIC1, 0x20); } else { - sputs("s\n"); + //sputs("s\n"); } } } @@ -311,13 +318,34 @@ valid_table(p: int, sig: *byte): int { return len; } -find_rsdt(): int { +show_addr(x: int) { + var vga: *byte; + var i: int; + var j: int; + + vga = ptov(0xB8000); + + i = 64; + j = 160; + loop { + if i == 0 { + break; + } + i = i - 4; + vga[j] = "0123456789abcdef"[(x >> i) & 15]; + vga[j + 1] = 0x0e:byte; + j = j + 2; + } + +} + +find_xsdt(): int { var p: int; // Find the RDSP - p = 0; + p = 0xe0000; loop { - if p == 0x100000 { + if p + 20 >= 0xfffff { return 0; } if !memcmp(ptov(p), "RSD PTR ", 8) { @@ -328,11 +356,13 @@ find_rsdt(): int { p = p + 16; } - p = _r32(ptov(p + 16)); + //p = _r32(ptov(p + 16)); - if valid_table(p, "RSDT") == 0 { - return 0; - } + p = ptov(p + 24):*int[0]; + show_addr(p); + //if valid_table(p, "XSDT") == 0 { + //return 0; + //} return p; } @@ -723,7 +753,7 @@ init_nvme(dev: *pcidev) { } -_kstart(mb: *byte) { +_kstart(mb: int) { var brk: int; var tss: *int; var tss_size: int; @@ -731,13 +761,19 @@ _kstart(mb: *byte) { var idt_size: int; var gdt: *int; var gdt_size: int; - var rsdt: int; + var xsdt: int; var mcfg: int; var pcip: int; var pci: *byte; var flag: int; + var vga: *byte; - setup_serial(); + vga = ptov(0xB8000); + + vga[0] = 'a':byte; + vga[1] = 0x0e:byte; + + //setup_serial(); brk = ptov(1024 * 512 * 3):int; @@ -816,19 +852,22 @@ _kstart(mb: *byte) { outb(IO_PIC1 + 1, 0xfa); outb(IO_PIC2 + 1, 0xf3); + show_addr(ptov(mb + 44):*int[0]); + // Find ACPI tables - rsdt = find_rsdt(); - mcfg = find_acpi(rsdt, "MCFG"); + //xsdt = find_xsdt(); + + //mcfg = find_acpi(xsdt, "MCFG"); - pcip = (ptov(mcfg + 44):*int)[0]; - pci = map_pci(ptov(-(1<<31)), pcip); + //pcip = (ptov(mcfg + 44):*int)[0]; + //pci = map_pci(ptov(-(1<<31)), pcip); //scan_pci(pci, show_pcidev, 0:*void); - scan_pci(pci, clear_int, 0:*void); - flag = 0; - scan_pci(pci, init_e1000, (&flag):*void); - flag = 0; - scan_pci(pci, init_nvme, (&flag):*void); + //scan_pci(pci, clear_int, 0:*void); + //flag = 0; + //scan_pci(pci, init_e1000, (&flag):*void); + //flag = 0; + //scan_pci(pci, init_nvme, (&flag):*void); // Wait for interrupts loop {