summaryrefslogtreecommitdiff
path: root/src/arch
diff options
context:
space:
mode:
authorFreya Murphy <freya@freyacat.org>2024-02-03 00:50:07 -0500
committerFreya Murphy <freya@freyacat.org>2024-02-03 00:53:58 -0500
commit90a6065691beee52bf5309916fba98f7580d27be (patch)
tree0b5375d20c189f62d394c473d371f7bf7f1d3fc5 /src/arch
parentimproved debugger, refactored (diff)
downloadcorn-90a6065691beee52bf5309916fba98f7580d27be.tar.gz
corn-90a6065691beee52bf5309916fba98f7580d27be.tar.bz2
corn-90a6065691beee52bf5309916fba98f7580d27be.zip
refactor, new arch dirs, (wip) page alloc on write, hsv screen (convert to userspace later), other fixes
Diffstat (limited to 'src/arch')
-rw-r--r--src/arch/amd64/acpi.c36
-rw-r--r--src/arch/amd64/cpu/backtrace.c (renamed from src/arch/amd64/backtrace.c)0
-rw-r--r--src/arch/amd64/cpu/debugger.c (renamed from src/arch/amd64/debugger.c)5
-rw-r--r--src/arch/amd64/cpu/debugger.h (renamed from src/arch/amd64/debugger.h)2
-rw-r--r--src/arch/amd64/cpu/idt.S (renamed from src/arch/amd64/idt.S)0
-rw-r--r--src/arch/amd64/cpu/idt.c (renamed from src/arch/amd64/idt.c)9
-rw-r--r--src/arch/amd64/cpu/idt.h (renamed from src/arch/amd64/idt.h)0
-rw-r--r--src/arch/amd64/drivers/bochs.c (renamed from src/arch/amd64/fb.c)34
-rw-r--r--src/arch/amd64/drivers/pci.c (renamed from src/arch/amd64/pci.c)2
-rw-r--r--src/arch/amd64/drivers/pic.c (renamed from src/arch/amd64/pic.c)2
-rw-r--r--src/arch/amd64/drivers/pic.h (renamed from src/arch/amd64/pic.h)0
-rw-r--r--src/arch/amd64/drivers/serial.c (renamed from src/arch/amd64/serial.c)3
-rw-r--r--src/arch/amd64/fpu.c1
-rw-r--r--src/arch/amd64/linker.ld38
-rw-r--r--src/arch/amd64/mboot.c30
-rw-r--r--src/arch/amd64/paging.c82
-rw-r--r--src/arch/amd64/paging.h1
-rw-r--r--src/arch/amd64/shim.c4
18 files changed, 155 insertions, 94 deletions
diff --git a/src/arch/amd64/acpi.c b/src/arch/amd64/acpi.c
index e262a99..eb38f73 100644
--- a/src/arch/amd64/acpi.c
+++ b/src/arch/amd64/acpi.c
@@ -1,14 +1,12 @@
#include <acpi.h>
#include <lib.h>
-
+#include <memory.h>
#include <stdint.h>
#include <stddef.h>
+#include <string.h>
+#include <panic.h>
#include "bindings.h"
-#include "memory.h"
-
-/* global state, idk a better way rn */
-struct acpi_state state;
struct acpi_header {
char signature[4];
@@ -20,7 +18,7 @@ struct acpi_header {
uint32_t oem_revision;
uint32_t creator_id;
uint32_t creator_revision;
-};
+} __attribute__((packed));
// root system descriptor pointer
// ACPI 1.0
@@ -30,7 +28,7 @@ struct rsdp {
char oemid[6];
uint8_t revision;
uint32_t rsdt_addr;
-};
+} __attribute__((packed));
// eXtended system descriptor pointer
// ACPI 2.0
@@ -45,7 +43,7 @@ struct xsdp {
uint64_t xsdt_addr;
uint8_t extendeid_checksum;
uint8_t reserved[3];
-};
+} __attribute__((packed));
// root system descriptor table
// ACPI 1.0
@@ -152,6 +150,9 @@ struct acpi_state {
uint16_t SCI_EN;
};
+/* global state, idk a better way rn */
+static struct acpi_state state;
+
static bool checksum(uint8_t *data, size_t len) {
unsigned char sum = 0;
for (size_t i = 0; i < len; i++)
@@ -230,6 +231,9 @@ static void *acpi_find_table_xsdt(struct xsdt *xsdt, const char *identifier, int
}
int acpi_init_rsdt(struct rsdt *rsdt) {
+
+ kprintf("RSDT: %#016lx\n", (size_t)rsdt);
+
rsdt = mmap(rsdt, sizeof(struct rsdt));
state.dst.rsdt = rsdt;
@@ -278,23 +282,35 @@ int acpi_init(void *rootsdp) {
if (!checksum((uint8_t *)rsdp, sizeof(struct rsdp)))
return -1;
+ if (strncmp(rsdp->signature, "RSD PTR ", 8) != 0) {
+ panic("invalid acpi rsdp signature: %.*s\n", 8, rsdp->signature);
+ }
+
int res;
if (rsdp->revision == 0) {
+ kprintf("ACPI 1.0\n");
+ kprintf("RSDP: %#016lx\n", (size_t)rsdp);
res = acpi_init_rsdt(
(struct rsdt *) (uintptr_t) rsdp->rsdt_addr
);
} else if (rsdp->revision == 2) {
struct xsdp *xsdp = (struct xsdp *) rsdp;
+ kprintf("ACPI 2.0\n");
+ kprintf("XSDP: %#016lx\n", (size_t)xsdp);
res = acpi_init_xsdt(
(struct xsdt *) (uintptr_t) xsdp->xsdt_addr
);
} else {
- return -1;
+ panic("invalid acpi rev: %d\n", rsdp->revision);
}
- if (res)
+ if (res) {
+ kprintf("...acpi failed to load\n\n");
return res;
+ }
+
+ kprintf("\n\n");
int ret = read_s5_addr(&state);
if (!ret)
diff --git a/src/arch/amd64/backtrace.c b/src/arch/amd64/cpu/backtrace.c
index 9e1c9d7..9e1c9d7 100644
--- a/src/arch/amd64/backtrace.c
+++ b/src/arch/amd64/cpu/backtrace.c
diff --git a/src/arch/amd64/debugger.c b/src/arch/amd64/cpu/debugger.c
index a1fa968..4d9d3c3 100644
--- a/src/arch/amd64/debugger.c
+++ b/src/arch/amd64/cpu/debugger.c
@@ -2,6 +2,7 @@
#include <stddef.h>
#include <backtrace.h>
#include <serial.h>
+
#include "debugger.h"
struct dr6 {
@@ -195,8 +196,8 @@ static int debugger_handle_bkp_cmd(char *msg) {
const char *lenstrs[] = {"1", "2", "8", "4"};
const char *rwstrs[] = {"x ", "w ", "io", "rw"};
kprintf(
- "breakpoint %d: %#016lx len=%s trigger=%s instrlen=%01d %s\n",
- i,
+ "breakpoint %d: %#016lx len=%s trigger=%s instrlen=%01d %s\n",
+ i,
bkp.addr,
lenstrs[bkp.len],
rwstrs[bkp.rw],
diff --git a/src/arch/amd64/debugger.h b/src/arch/amd64/cpu/debugger.h
index e679c07..14f73bf 100644
--- a/src/arch/amd64/debugger.h
+++ b/src/arch/amd64/cpu/debugger.h
@@ -3,7 +3,7 @@
#include "idt.h"
#define DEBUG_INT3 0x00
-#define DEBUG_DBG 0x01
+#define DEBUG_DBG 0x01
#define DEBUG_FAULT 0x02
void debugger(struct isr_regs *state, int cause);
diff --git a/src/arch/amd64/idt.S b/src/arch/amd64/cpu/idt.S
index cd8783e..cd8783e 100644
--- a/src/arch/amd64/idt.S
+++ b/src/arch/amd64/cpu/idt.S
diff --git a/src/arch/amd64/idt.c b/src/arch/amd64/cpu/idt.c
index d33c795..053f614 100644
--- a/src/arch/amd64/idt.c
+++ b/src/arch/amd64/cpu/idt.c
@@ -2,10 +2,10 @@
#include <stddef.h>
#include <lib.h>
#include <panic.h>
-
-#include "debugger.h"
#include "idt.h"
-#include "pic.h"
+#include "debugger.h"
+#include "../paging.h"
+#include "../drivers/pic.h"
#define IDT_SIZE 256
@@ -148,7 +148,7 @@ void idt_pic_timer(void) {
// print a message once we know the timer works
// but avoid spamming the logs
if (counter == 3) {
- kputs("pic timer!\n");
+ //kputs("pic timer!\n");
}
if (counter <= 3) {
counter++;
@@ -158,4 +158,3 @@ void idt_pic_timer(void) {
void idt_pic_keyboard(void) {}
void idt_pic_mouse(void) {}
-
diff --git a/src/arch/amd64/idt.h b/src/arch/amd64/cpu/idt.h
index 89a9dab..89a9dab 100644
--- a/src/arch/amd64/idt.h
+++ b/src/arch/amd64/cpu/idt.h
diff --git a/src/arch/amd64/fb.c b/src/arch/amd64/drivers/bochs.c
index 8560166..5383213 100644
--- a/src/arch/amd64/fb.c
+++ b/src/arch/amd64/drivers/bochs.c
@@ -3,8 +3,9 @@
#include <stdint.h>
#include <panic.h>
#include <pci.h>
+#include <bochs.h>
-#include "bindings.h"
+#include "../bindings.h"
#define INDEX 0x1CE
#define DATA 0x1CF
@@ -52,38 +53,21 @@ static void set_mode(uint16_t width, uint16_t height, uint16_t bit_depth, int lf
(clear ? 0 : DATA_NO_CLEAR_MEM));
}
-//static void set_bank(uint16_t bank) {
-// write(INDEX_BANK, bank);
-//}
+uint32_t* bochs_init(uint16_t width, uint16_t height, uint8_t bit_depth) {
-int fb_init(uint16_t width, uint16_t height) {
-
- set_mode(width, height, 32, true, true);
+ set_mode(width, height, bit_depth, true, true);
if (!is_available())
- panic("bochs framebuffer not avaliable");
+ return NULL;
struct pci_device bochs = {0};
bool found = pci_findby_id(&bochs, BOCHS_PCI_DEVICE, BOCHS_PCI_VENDOR, NULL);
if (!found)
- panic("bochs pci device not avaliable");
+ return NULL;
uint32_t bar0 = pci_rcfg_d(bochs, PCI_BAR0_D);
- uint32_t *fb = (uint32_t*) (uintptr_t) bar0;
- fb = mmap(fb, width * height * 4);
-
- for (uint16_t y = 0; y < height; y++) {
- for (uint16_t x = 0; x < width; x++) {
- double dx = x / (double) width,
- dy = y / (double) height,
- dz = (2 - dx - dy) / 2;
- uint32_t r = (uint32_t)(dx * 255),
- g = (uint32_t)(dy * 255),
- b = (uint32_t)(dz * 255);
- fb[x + y * width] = (b << 0) | (g << 8) | (r << 16);
- }
- }
-
+ uint32_t *addr = (uint32_t*) (uintptr_t) bar0;
+ addr = mmap(addr, width * height * bit_depth);
- return 0;
+ return addr;
}
diff --git a/src/arch/amd64/pci.c b/src/arch/amd64/drivers/pci.c
index 7b30f0e..410eb7e 100644
--- a/src/arch/amd64/pci.c
+++ b/src/arch/amd64/drivers/pci.c
@@ -3,7 +3,7 @@
#include <panic.h>
#include <lib.h>
-#include "bindings.h"
+#include "../bindings.h"
#define CONF_ADDR 0xCF8
#define CONF_DATA 0xCFC
diff --git a/src/arch/amd64/pic.c b/src/arch/amd64/drivers/pic.c
index c25856b..be7716f 100644
--- a/src/arch/amd64/pic.c
+++ b/src/arch/amd64/drivers/pic.c
@@ -1,4 +1,4 @@
-#include "bindings.h"
+#include "../bindings.h"
#include "pic.h"
#define PIC1 0x20 /* IO base address for master PIC */
diff --git a/src/arch/amd64/pic.h b/src/arch/amd64/drivers/pic.h
index 2a4670e..2a4670e 100644
--- a/src/arch/amd64/pic.h
+++ b/src/arch/amd64/drivers/pic.h
diff --git a/src/arch/amd64/serial.c b/src/arch/amd64/drivers/serial.c
index fe21629..b9e351e 100644
--- a/src/arch/amd64/serial.c
+++ b/src/arch/amd64/drivers/serial.c
@@ -1,5 +1,6 @@
#include <serial.h>
-#include "bindings.h"
+
+#include "../bindings.h"
#define PORT 0x3F8
diff --git a/src/arch/amd64/fpu.c b/src/arch/amd64/fpu.c
index 551485e..43fc653 100644
--- a/src/arch/amd64/fpu.c
+++ b/src/arch/amd64/fpu.c
@@ -1,6 +1,7 @@
#include <fpu.h>
#include <stddef.h>
#include <stdint.h>
+#include <lib.h>
void enable_fpu() {
size_t cr4;
diff --git a/src/arch/amd64/linker.ld b/src/arch/amd64/linker.ld
deleted file mode 100644
index 0032765..0000000
--- a/src/arch/amd64/linker.ld
+++ /dev/null
@@ -1,38 +0,0 @@
-ENTRY(start)
-
-SECTIONS {
- . = 1M;
-
- kernel_start = .;
-
- .boot BLOCK(4K) : ALIGN(4K)
- {
- *(.multiboot)
- }
-
- .rodata BLOCK(4K) : ALIGN(4K)
- {
- *(.rodata)
- }
-
- .data BLOCK(4K) : ALIGN(4K)
- {
- *(.data)
- }
-
- text_start = .;
-
- .text BLOCK(4K) : ALIGN(4K)
- {
- *(.text)
- }
-
- text_end = .;
-
- .bss BLOCK(4K) : ALIGN(4K)
- {
- *(.bss)
- }
-
- kernel_end = .;
-}
diff --git a/src/arch/amd64/mboot.c b/src/arch/amd64/mboot.c
index 315747e..34424a0 100644
--- a/src/arch/amd64/mboot.c
+++ b/src/arch/amd64/mboot.c
@@ -9,6 +9,7 @@
#define MBOOT_CMDLINE 1
#define MBOOT_MEMORY_MAP 6
+#define MBOOT_FRAMEBUFFER 8
#define MBOOT_ELF_SYMBOLS 9
#define MBOOT_OLD_RSDP 14
#define MBOOT_NEW_RSDP 15
@@ -82,6 +83,18 @@ struct mboot_tag_cmdline {
uint8_t cmdline[];
};
+struct mboot_tag_framebuffer {
+ uint32_t type;
+ uint32_t size;
+ uint64_t framebuffer_addr;
+ uint32_t framebuffer_pitch;
+ uint32_t framebuffer_width;
+ uint32_t framebuffer_height;
+ uint8_t framebuffer_bpp;
+ uint8_t framebuffer_type;
+ uint16_t reserved;
+};
+
static void read_symbols(
struct boot_info *shim_info,
struct mboot_tag_elf_sections *sections
@@ -133,6 +146,17 @@ static void read_cmdline(
shim_info->cmdline[size] = '\0';
}
+static void read_framebuffer(
+ struct boot_info *shim_info,
+ struct mboot_tag_framebuffer *framebuffer
+) {
+ shim_info->fb.addr = framebuffer->framebuffer_addr;
+ shim_info->fb.width = framebuffer->framebuffer_width;
+ shim_info->fb.height = framebuffer->framebuffer_height;
+ shim_info->fb.pitch = framebuffer->framebuffer_pitch;
+ shim_info->fb.bit_depth = framebuffer->framebuffer_bpp;
+}
+
static const char *segment_type[] = {
"Reserved",
"Free",
@@ -217,6 +241,12 @@ void mboot_load_info(
(struct mboot_tag_cmdline *) tag
);
break;
+ case MBOOT_FRAMEBUFFER:
+ read_framebuffer(
+ shim_info,
+ (struct mboot_tag_framebuffer *) tag
+ );
+ break;
case MBOOT_MEMORY_MAP:
read_memory_map(
shim_info,
diff --git a/src/arch/amd64/paging.c b/src/arch/amd64/paging.c
index 604e0a0..1c1c56c 100644
--- a/src/arch/amd64/paging.c
+++ b/src/arch/amd64/paging.c
@@ -45,7 +45,8 @@ struct pde {
// PAGE TABLE ENTRY
struct pte {
uint64_t flags : 9;
- uint64_t : 3;
+ uint64_t loaded : 1;
+ uint64_t : 2;
uint64_t address : 40;
uint64_t : 7;
uint64_t protection_key : 4;
@@ -69,7 +70,7 @@ static struct pde *pd_mapped = (void *) (uintptr_t) 0x202000;
static struct pte *pt_mapped = (void *) (uintptr_t) 0x203000;
static inline void invlpg(void *addr) {
- __asm volatile("invlpg (%0)" ::"r" (addr) : "memory");
+ __asm__ volatile("invlpg (%0)" ::"r" (addr) : "memory");
}
static void load_addr(void *phys_addr) {
@@ -297,6 +298,7 @@ static void unmap_page(
page->address = 0;
page->flags = 0;
+ page->loaded = 0;
try_unmap_pt();
@@ -360,6 +362,7 @@ static void unmap_pages(
page->address = 0;
page->flags = 0;
+ page->loaded = 0;
}
@@ -369,6 +372,31 @@ static void unmap_pages(
return;
}
+static struct pte *get_page(
+ struct pml4e *root,
+ void *virt
+) {
+ struct pdpte *pdpt;
+ struct pde *pd;
+ struct pte *pt;
+ struct pte *page;
+
+ unsigned int df = 0;
+
+ if (select_pdpt(virt, df, root, &pdpt, false))
+ return NULL;
+
+ if (select_pd(virt, df, pdpt, &pd, false))
+ return NULL;
+
+ if (select_pt(virt, df, pd, &pt, false))
+ return NULL;
+
+ select_page(virt, pt, &page);
+
+ return page;
+}
+
static int map_page(
struct pml4e *root,
void *virt,
@@ -382,6 +410,9 @@ static int map_page(
unsigned int df = F_WRITEABLE;
+ if (phys == NULL)
+ df = 0; // alloc page on fault
+
if (select_pdpt(virt, df, root, &pdpt, true))
return 1;
@@ -393,9 +424,16 @@ static int map_page(
select_page(virt, pt, &page);
- page->address = (uint64_t)phys >> 12;
- page->flags = F_PRESENT | flags;
- invlpg(virt);
+ if (phys) {
+ page->flags = F_PRESENT | flags;
+ page->address = (uint64_t)phys >> 12;
+ page->loaded = 1;
+ invlpg(virt);
+ } else {
+ page->flags = flags;
+ page->address = 0;
+ page->loaded = 0;
+ }
return 0;
}
@@ -424,6 +462,9 @@ static int map_pages(
unsigned int df = F_WRITEABLE;
+ if (phys_start == NULL)
+ df = 0; // alloc page on fault
+
long i;
for (i = 0; i < page_count; i++) {
@@ -454,15 +495,22 @@ static int map_pages(
select_page(virt, pt, &page);
- page->address = (uint64_t)phys >> 12;
- page->flags = F_PRESENT | flags;
+ if (phys_start) {
+ page->flags = F_PRESENT | flags;
+ page->address = (uint64_t)phys >> 12;
+ page->loaded = 1;
+ } else {
+ page->flags = flags;
+ page->address = 0;
+ page->loaded = 0;
+ }
if (flags & F_GLOBAL)
invlpg(virt);
}
- __asm volatile("mov %cr3, %rax; mov %rax, %cr3;");
+ __asm__ volatile("mov %cr3, %rax; mov %rax, %cr3;");
return 0;
@@ -575,3 +623,21 @@ int kunmap_page(void *virt_addr) {
unmap_page(kernel_pml4, virt_addr);
return 0;
}
+
+int kload_page(void *virt_addr) {
+ struct pte *page = get_page(kernel_pml4, virt_addr);
+ if (page == NULL)
+ return -1;
+ if (page->loaded)
+ return -1;
+ void *phys = alloc_phys_page();
+ kprintf("0x%p\n", phys);
+ if (phys == NULL)
+ return -2;
+ page->loaded = 1;
+ page->address = (uint64_t)phys >> 12;
+ page->flags |= F_PRESENT | F_WRITEABLE;
+ invlpg(virt_addr);
+ __asm__ volatile ("movq %cr3, %rax; movq %rax, %cr3;");
+ return 0;
+}
diff --git a/src/arch/amd64/paging.h b/src/arch/amd64/paging.h
index a76a172..9e1352c 100644
--- a/src/arch/amd64/paging.h
+++ b/src/arch/amd64/paging.h
@@ -13,3 +13,4 @@
void paging_init(void);
int kmap_page(void *virt_addr, void *phys_addr, unsigned int flags);
int kunmap_page(void *virt_addr);
+int kload_page(void *virt_addr);
diff --git a/src/arch/amd64/shim.c b/src/arch/amd64/shim.c
index c161c88..b84167c 100644
--- a/src/arch/amd64/shim.c
+++ b/src/arch/amd64/shim.c
@@ -6,8 +6,8 @@
#include "paging.h"
#include "mboot.h"
-#include "idt.h"
-#include "pic.h"
+#include "cpu/idt.h"
+#include "drivers/pic.h"
static struct boot_info boot_info;