diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/drivers/gpu.c | 17 | ||||
-rw-r--r-- | kernel/drivers/gpu/bochs.c | 5 | ||||
-rw-r--r-- | kernel/entry.S | 67 | ||||
-rw-r--r-- | kernel/include/comus/limits.h | 7 | ||||
-rw-r--r-- | kernel/memory/paging.c | 43 | ||||
-rw-r--r-- | kernel/memory/virtalloc.c | 2 | ||||
-rw-r--r-- | kernel/term.c | 2 |
7 files changed, 87 insertions, 56 deletions
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); } } |