summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--config/kernel.ld12
-rw-r--r--kernel/drivers/gpu.c17
-rw-r--r--kernel/drivers/gpu/bochs.c5
-rw-r--r--kernel/entry.S67
-rw-r--r--kernel/include/comus/limits.h7
-rw-r--r--kernel/memory/paging.c43
-rw-r--r--kernel/memory/virtalloc.c2
-rw-r--r--kernel/term.c2
8 files changed, 99 insertions, 56 deletions
diff --git a/config/kernel.ld b/config/kernel.ld
index 52e9088..bcacf61 100644
--- a/config/kernel.ld
+++ b/config/kernel.ld
@@ -9,27 +9,39 @@ SECTIONS
. = ALIGN(0x1000);
.text : {
+ text_start = .;
*(.multiboot)
*(.text)
+ *(.text.*)
+ text_end = .;
}
. = ALIGN(0x1000);
.rodata : {
+ rodata_start = .;
*(.rodata)
+ *(.rodata.*)
+ rodata_end = .;
}
. = ALIGN(0x1000);
.data : {
+ data_start = .;
*(.data)
+ *(.data.*)
+ data_end = .;
}
. = ALIGN(0x1000);
.bss : {
+ bss_start = .;
*(COMMON)
*(.bss)
+ *(.bss.*)
+ bss_end = .;
}
kernel_end = .;
diff --git a/kernel/drivers/gpu.c b/kernel/drivers/gpu.c
index 17e7e18..3d79b99 100644
--- a/kernel/drivers/gpu.c
+++ b/kernel/drivers/gpu.c
@@ -12,20 +12,27 @@ struct gpu *gpu_dev = NULL;
int gpu_init(void)
{
// try to get a gpu device
- if (!gpu_dev && gop_init(&gpu_dev) == SUCCESS) {
- }
- if (!gpu_dev && bochs_init(&gpu_dev) == SUCCESS) {
- }
+ if (gpu_dev == NULL)
+ gop_init(&gpu_dev);
+ if (gpu_dev == NULL)
+ bochs_init(&gpu_dev);
// if we did (yay!) resize terminal
if (gpu_dev)
- term_resize(gpu_dev->width, gpu_dev->height);
+ term_resize(gpu_dev->width / en_font.width,
+ gpu_dev->height / en_font.height);
return gpu_dev != NULL;
}
void gpu_set_pixel(uint32_t x, uint32_t y, uint32_t r, uint32_t g, uint32_t b)
{
+ if (gpu_dev == NULL)
+ return;
+
+ x %= gpu_dev->width;
+ y %= gpu_dev->height;
+
// TODO: handle other bpp
volatile uint32_t *fb = (volatile uint32_t *)gpu_dev->framebuffer;
int offset = y * gpu_dev->width + x;
diff --git a/kernel/drivers/gpu/bochs.c b/kernel/drivers/gpu/bochs.c
index 3438ab5..f8e5820 100644
--- a/kernel/drivers/gpu/bochs.c
+++ b/kernel/drivers/gpu/bochs.c
@@ -68,8 +68,9 @@ int bochs_init(struct gpu **gpu_dev)
bochs_dev.width = BOCHS_WIDTH;
bochs_dev.height = BOCHS_HEIGHT;
bochs_dev.bit_depth = BOCHS_BIT_DEPTH;
- bochs_dev.framebuffer = kmapaddr(
- addr, NULL, BOCHS_WIDTH * BOCHS_HEIGHT * BOCHS_BIT_DEPTH, F_WRITEABLE);
+ bochs_dev.framebuffer =
+ kmapaddr(addr, NULL, BOCHS_WIDTH * BOCHS_HEIGHT * (BOCHS_BIT_DEPTH / 8),
+ F_WRITEABLE);
*gpu_dev = &bochs_dev;
return 0;
diff --git a/kernel/entry.S b/kernel/entry.S
index 85cb350..e1b4767 100644
--- a/kernel/entry.S
+++ b/kernel/entry.S
@@ -1,10 +1,12 @@
+#include <comus/limits.h>
+
.globl _start
.globl kernel_pml4
.globl kernel_pdpt_0
.globl kernel_pd_0
- .globl kernel_pt_0
+ .globl kernel_pd_0_ents
+ .globl kernel_pd_1
.globl paging_pt
- .globl bootstrap_pt
.extern main
.extern GDT
@@ -66,17 +68,17 @@ mb_end:
# kernel page tables
.align 4096
-kernel_pml4: # reserve memory for initial 512 pml4 entires
- .skip 4096
-kernel_pdpt_0: # reserve memory for initial 512 pdpt entires
+kernel_pml4:
.skip 4096
-kernel_pd_0: # reserve memory for initial 512 pd entries
+kernel_pdpt_0:
.skip 4096
-kernel_pt_0: # reserve memory for initial 512 pt entries
+kernel_pd_0:
.skip 4096
-paging_pt: # reserve pages for pager mappings
+kernel_pd_0_ents:
+ .skip (4096*N_IDENT_PTS)
+kernel_pd_1:
.skip 4096
-bootstrap_pt: # reserve pages to bootstrap pager
+paging_pt:
.skip 4096
# kernel stack
@@ -171,31 +173,39 @@ _start:
pushl $0
push %eax
- # zero out kernel page table
- movl $kernel_pml4, %edi
+ # setup kernel paging structures
+ movl $kernel_pml4, %edi # zero out pml4
movl %edi, %cr3
xorl %eax, %eax
- movl $4096, %ecx # zero 4096 pages
+ movl $0x1000, %ecx
rep stosl
movl %cr3, %edi
- # identity map kernel
- movl $kernel_pdpt_0 + 3, (%edi) # Set the uint32_t at the desination index to 0x2003.
- movl $kernel_pdpt_0, %edi # Add 0x1000 to the desination index.
- movl $kernel_pd_0 + 3, (%edi) # Set the uint32_t at the desination index to 0x3003.
- movl $kernel_pd_0, %edi # Add 0x1000 to the desination index.
- movl $kernel_pt_0 + 3, (%edi) # Set the uint32_t at the desination index to 0x4003.
- movl $kernel_pt_0, %edi # Add 0x1000 to the desination index.
+ movl $kernel_pdpt_0 + 3, (%edi) # map pdpt
+ movl $kernel_pdpt_0, %edi
+
+ movl $kernel_pd_0 + 3, (%edi) # map pd 0
+
+ addl $8, %edi # map pd 1
+ movl $kernel_pd_1 + 3, (%edi)
- movl $0x03, %ebx # Entry value to set
- movl $512, %ecx # Loop count
+ movl $kernel_pd_0, %edi # map pd 0 ents
+ movl $kernel_pd_0_ents + 3, %ebx
+ movl $N_IDENT_PTS, %ecx
+_start.map_pd_0:
+ movl %ebx, (%edi)
+ addl $(8 * 512), %ebx
+ addl $8, %edi
+ loop _start.map_pd_0
-_start.SetEntry:
- # set entires in mapping
- movl %ebx, (%edi) # Set the uint32_t at the desination index to the B-register
- addl $0x1000, %ebx # Add 0x1000 to the B-register
- addl $8, %edi # Add eight to the desination index
- loop _start.SetEntry
+ movl $kernel_pd_0_ents, %edi # identity map kernel
+ movl $0x03, %ebx
+ movl $(512 * N_IDENT_PTS), %ecx
+_start.map_pd_0_ents:
+ movl %ebx, (%edi)
+ addl $0x1000, %ebx
+ addl $8, %edi
+ loop _start.map_pd_0_ents
# enable page address extension
movl %cr4, %eax
@@ -240,6 +250,9 @@ code64:
# set segment registers
movw $GDT.Data, %dx
movw %dx, %ds
+ movw %dx, %es
+ movw %dx, %fs
+ movw %dx, %gs
movw %dx, %ss
# set ebp to 0 so we know where to end stack traces
diff --git a/kernel/include/comus/limits.h b/kernel/include/comus/limits.h
index 93cf8dd..b6c596b 100644
--- a/kernel/include/comus/limits.h
+++ b/kernel/include/comus/limits.h
@@ -6,6 +6,9 @@
* Defined kernel limits
*/
+/// number of pts to identity map the kernel (1pt = 2MB)
+#define N_IDENT_PTS 4 // max 512 (1G)
+
/// max number of processes
#define N_PROCS 256
@@ -16,5 +19,5 @@
#define N_MMAP_ENTRY 256
/// length of terminal buffer
-#define TERM_MAX_WIDTH 480
-#define TERM_MAX_HEIGHT 270
+#define TERM_MAX_WIDTH 1920
+#define TERM_MAX_HEIGHT 1080
diff --git a/kernel/memory/paging.c b/kernel/memory/paging.c
index 2709050..0c74145 100644
--- a/kernel/memory/paging.c
+++ b/kernel/memory/paging.c
@@ -55,19 +55,19 @@ struct pte {
extern volatile struct pml4e kernel_pml4[512];
extern volatile struct pdpte kernel_pdpt_0[512];
extern volatile struct pde kernel_pd_0[512];
-extern volatile struct pte kernel_pt_0[512];
-extern volatile struct pte bootstrap_pt[512];
+extern volatile struct pte kernel_pd_0_ents[512 * N_IDENT_PTS];
+extern volatile struct pde kernel_pd_1[512];
extern volatile struct pte
paging_pt[512]; // paging_pt should NEVER be outside of this file, NEVER i say
// paged address to read page tables
// the structures are not gurenteed to be ident mapped
// map them here with map_<type>(phys_addr) before useing structures
-void volatile *addr_mapped = (void *)(uintptr_t)0x204000;
-static volatile struct pml4e *pml4_mapped = (void *)(uintptr_t)0x200000;
-static volatile struct pdpte *pdpt_mapped = (void *)(uintptr_t)0x201000;
-static volatile struct pde *pd_mapped = (void *)(uintptr_t)0x202000;
-static volatile struct pte *pt_mapped = (void *)(uintptr_t)0x203000;
+void volatile *addr_mapped = (void *)(uintptr_t)0x40004000;
+static volatile struct pml4e *pml4_mapped = (void *)(uintptr_t)0x40000000;
+static volatile struct pdpte *pdpt_mapped = (void *)(uintptr_t)0x40001000;
+static volatile struct pde *pd_mapped = (void *)(uintptr_t)0x40002000;
+static volatile struct pte *pt_mapped = (void *)(uintptr_t)0x40003000;
static inline void invlpg(volatile void *addr)
{
@@ -496,26 +496,33 @@ failed:
void paging_init(void)
{
+ // map pdpt
kernel_pml4[0].flags = F_PRESENT | F_WRITEABLE;
kernel_pml4[0].address = (uint64_t)(&kernel_pdpt_0) >> 12;
+ // map pd0 & pd1
kernel_pdpt_0[0].flags = F_PRESENT | F_WRITEABLE;
kernel_pdpt_0[0].address = (uint64_t)(&kernel_pd_0) >> 12;
+ kernel_pdpt_0[1].flags = F_PRESENT | F_WRITEABLE;
+ kernel_pdpt_0[1].address = (uint64_t)(&kernel_pd_1) >> 12;
- kernel_pd_0[0].flags = F_PRESENT | F_WRITEABLE;
- kernel_pd_0[0].address = (uint64_t)(&kernel_pt_0) >> 12;
- kernel_pd_0[1].flags = F_PRESENT | F_WRITEABLE;
- kernel_pd_0[1].address = (uint64_t)(&paging_pt) >> 12;
- kernel_pd_0[2].flags = F_PRESENT | F_WRITEABLE;
- kernel_pd_0[2].address = (uint64_t)(&bootstrap_pt) >> 12;
+ // map pd0 entires (length N_IDENT_PTS)
+ for (int i = 0; i < N_IDENT_PTS; i++) {
+ kernel_pd_0[i].flags = F_PRESENT | F_WRITEABLE;
+ kernel_pd_0[i].address = (uint64_t)(&kernel_pd_0_ents[512 * i]) >> 12;
+ }
- for (size_t i = 0; i < 512; i++) {
- kernel_pt_0[i].flags = F_PRESENT | F_WRITEABLE;
- kernel_pt_0[i].address = (i * PAGE_SIZE) >> 12;
+ // identity map kernel
+ for (size_t i = 0; i < 512 * N_IDENT_PTS; i++) {
+ kernel_pd_0_ents[i].flags = F_PRESENT | F_WRITEABLE;
+ kernel_pd_0_ents[i].address = (i * PAGE_SIZE) >> 12;
}
+ // map paging_pt
+ kernel_pd_1[0].flags = F_PRESENT | F_WRITEABLE;
+ kernel_pd_1[0].address = (uint64_t)(&paging_pt) >> 12;
+
memsetv(&paging_pt, 0, 4096);
- memsetv(&bootstrap_pt, 0, 4096);
// make sure we are using THESE pagetables
// EFI doesnt on boot
@@ -550,7 +557,7 @@ void *mem_mapaddr(mem_ctx_t ctx, void *phys, void *virt, size_t len,
return NULL;
if (map_pages((volatile struct pml4e *)ctx->pml4, virt, aligned_phys,
- F_WRITEABLE | flags, pages)) {
+ F_PRESENT | flags, pages)) {
virtaddr_free(ctx->virtctx, virt);
return NULL;
}
diff --git a/kernel/memory/virtalloc.c b/kernel/memory/virtalloc.c
index 1c83427..e82ac96 100644
--- a/kernel/memory/virtalloc.c
+++ b/kernel/memory/virtalloc.c
@@ -81,7 +81,7 @@ static void free_node(struct virt_ctx *ctx, struct virt_addr_node *node)
void virtaddr_init(struct virt_ctx *ctx)
{
struct virt_addr_node init = {
- .start = 0x400000, // third page table
+ .start = 0x600000, // third pd
.end = 0x1000000000000, // 48bit memory address max
.next = NULL,
.prev = NULL,
diff --git a/kernel/term.c b/kernel/term.c
index b2b7134..917f645 100644
--- a/kernel/term.c
+++ b/kernel/term.c
@@ -67,8 +67,8 @@ static inline void term_move_cur(char c)
y++;
}
if (y >= height) {
- term_scroll(y - (height - 1));
y = height - 1;
+ term_scroll(1);
}
}