From 83f81b9a74e3f659ea51a8410c46c95492d8f732 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Lov=C3=A9n?= Date: Sat, 18 Nov 2017 16:23:22 +0100 Subject: [PATCH] Cleaning up and commenting --- src/kernel/boot/boot.S | 9 ++++++++- src/kernel/boot/kmain.c | 4 ++-- src/kernel/include/memory.h | 13 +++++++++++++ 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/kernel/boot/boot.S b/src/kernel/boot/boot.S index a3e2dc2..22b0399 100644 --- a/src/kernel/boot/boot.S +++ b/src/kernel/boot/boot.S @@ -54,17 +54,24 @@ _start: mov ds, eax mov es, eax + //; Jump to kernel address space movabs rax, offset upper_memory jmp rax upper_memory: + //; Move stack pointer to kernel space mov rax, KERNEL_OFFSET add rsp, rax + //; Remove identity mapping mov rax, 0 movabs [BootP4], rax + //; Jump to kmain() .extern kmain movabs rax, offset kmain - jmp rax + call rax + + hlt + jmp $ diff --git a/src/kernel/boot/kmain.c b/src/kernel/boot/kmain.c index e00461a..8dda4ce 100644 --- a/src/kernel/boot/kmain.c +++ b/src/kernel/boot/kmain.c @@ -2,14 +2,14 @@ void clear_screen() { - unsigned char *vidmem = (void *)(0xB8000 + KERNEL_OFFSET); + unsigned char *vidmem = P2V(0xB8000); for(int i=0; i < 80*24*2; i++) *vidmem++ = 0; } void print_string(char *str) { - unsigned char *vidmem = (void *)(0xB8000 + KERNEL_OFFSET); + unsigned char *vidmem = P2V(0xB8000); while(*str) { *vidmem++ = *str++; diff --git a/src/kernel/include/memory.h b/src/kernel/include/memory.h index fee7398..c66d3ae 100644 --- a/src/kernel/include/memory.h +++ b/src/kernel/include/memory.h @@ -1,6 +1,19 @@ #pragma once #define KERNEL_OFFSET 0xFFFFFF8000000000 + +#ifdef __ASSEMBLER__ #define V2P(a) ((a) - KERNEL_OFFSET) +#define P2V(a) ((a) + KERNEL_OFFSET) +#else +#include +#define V2P(a) ((uintptr_t)(a) - KERNEL_OFFSET) +#define P2V(a) ((void *)((uintptr_t)(a) + KERNEL_OFFSET)) +#endif + +#define P1_OFFSET(a) (((a)>>12) & 0x1FF) +#define P2_OFFSET(a) (((a)>>21) & 0x1FF) +#define P3_OFFSET(a) (((a)>>30) & 0x1FF) +#define P4_OFFSET(a) (((a)>>39) & 0x1FF) #define PAGE_PRESENT 0x001 #define PAGE_WRITE 0x002