diff options
| author | Aleksa Vuckovic <aleksa@vuckovic.cc> | 2023-02-25 02:24:36 +0100 |
|---|---|---|
| committer | Aleksa Vuckovic <aleksa@vuckovic.cc> | 2023-02-25 02:25:19 +0100 |
| commit | 4931f266a72dccfb439badfa1070563003c80ce3 (patch) | |
| tree | 8ee554e9d4594fa4916f307dca7edff98137df18 /kernel | |
| parent | caba4178bbfd7b3b1ff2e156e24b08015137d16a (diff) | |
define consts
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/include/libk/math.h | 6 | ||||
| -rw-r--r-- | kernel/include/msr.h | 2 | ||||
| -rw-r--r-- | kernel/src/apic/apic.c | 5 | ||||
| -rw-r--r-- | kernel/src/apic/ioapic.c | 2 | ||||
| -rw-r--r-- | kernel/src/apic/madt.c | 1 | ||||
| -rw-r--r-- | kernel/src/boot/boot64.S | 3 | ||||
| -rw-r--r-- | kernel/src/mem/paging.c | 4 | ||||
| -rw-r--r-- | kernel/src/mem/pmm.c | 9 | ||||
| -rw-r--r-- | kernel/src/sys/userspace_asm.S | 10 |
9 files changed, 20 insertions, 22 deletions
diff --git a/kernel/include/libk/math.h b/kernel/include/libk/math.h index ec3363a..aff847c 100644 --- a/kernel/include/libk/math.h +++ b/kernel/include/libk/math.h @@ -3,9 +3,9 @@ #include <types.h> -#define min(a,b) (a > b ? b : a) -#define max(a,b) (a > b ? a : b) -#define upper_div(a,b) ((a / b) * b < a ? (a / b) + 1 : (a / b)) +#define min(a,b) ((a) > (b) ? (b) : (a)) +#define max(a,b) ((a) > (b) ? (a) : (b)) +#define upper_div(a,b) ((((a) / (b) * b) < (a)) ? (((a) / (b)) + 1) : ((a) / (b))) int64_t abs(int64_t val); diff --git a/kernel/include/msr.h b/kernel/include/msr.h index 356e52c..b2d0b82 100644 --- a/kernel/include/msr.h +++ b/kernel/include/msr.h @@ -3,6 +3,8 @@ #include <types.h> +#define APIC_BASE_MSR 0x0000001B + uint64_t read_msr(uint32_t addr); void write_msr(uint32_t addr, uint64_t value); diff --git a/kernel/src/apic/apic.c b/kernel/src/apic/apic.c index 3dff70f..06c0661 100644 --- a/kernel/src/apic/apic.c +++ b/kernel/src/apic/apic.c @@ -16,11 +16,6 @@ uint8_t cpu_apic_ids[256]; uint8_t curr_cpu_apic_id() { -// Initial APIC ID -// CPUIDinfo info; -// CpuId(1, 0, &info); -// return (uint8_t)(info.EBX >> 24); - return (uint8_t)(((*((__volatile__ uint32_t*)((uint64_t)lapic_addr + 0x20))) >> 24) & 0xFF); } diff --git a/kernel/src/apic/ioapic.c b/kernel/src/apic/ioapic.c index 1322c47..bcd5a4d 100644 --- a/kernel/src/apic/ioapic.c +++ b/kernel/src/apic/ioapic.c @@ -55,8 +55,6 @@ void ioapic_set_irq(uint8_t irq, uint64_t apic_id, uint8_t vector) ioapic_write((uint8_t)low_index, low); } -#define APIC_BASE_MSR 0x0000001B - void apic_remap_interrupts() { map_addr(ioapic_addr, ioapic_addr, FLAG_PRESENT); diff --git a/kernel/src/apic/madt.c b/kernel/src/apic/madt.c index 8a1e51d..f69887d 100644 --- a/kernel/src/apic/madt.c +++ b/kernel/src/apic/madt.c @@ -3,7 +3,6 @@ #include <heap.h> #include <libk/string.h> #include <libk/stdio.h> -#include <apic.h> void parse_madt() { diff --git a/kernel/src/boot/boot64.S b/kernel/src/boot/boot64.S index 8231b3e..848256f 100644 --- a/kernel/src/boot/boot64.S +++ b/kernel/src/boot/boot64.S @@ -1,12 +1,13 @@ .code64 .set KERNEL_VMA, 0xffffffff80000000 +.set GDT_KERNEL_CS, 0x10 .section .boot64.text, "a" .global begin_long_mode begin_long_mode: - mov $0x10, %ax + mov $GDT_KERNEL_CS, %ax mov %ax, %ds mov %ax, %es mov %ax, %ss diff --git a/kernel/src/mem/paging.c b/kernel/src/mem/paging.c index cb9bd70..b8c44c0 100644 --- a/kernel/src/mem/paging.c +++ b/kernel/src/mem/paging.c @@ -14,8 +14,8 @@ uint64_t __attribute__((aligned(4096))) page_table_lvl2[512]; void map_addr(uint64_t virt, uint64_t phys, uint32_t flags) { - virt -= virt % 0x00200000; - phys -= phys % 0x00200000; + virt -= virt % PAGE_SIZE; + phys -= phys % PAGE_SIZE; // i is in range [0, 511] size_t pt_lvl4_i = (virt >> 39) % 0x200; // 512gb entry diff --git a/kernel/src/mem/pmm.c b/kernel/src/mem/pmm.c index 63bfb07..e8245f2 100644 --- a/kernel/src/mem/pmm.c +++ b/kernel/src/mem/pmm.c @@ -7,8 +7,7 @@ #include <multiboot2.h> #include <pmm.h> -#define PMM_PAGE_SIZE 4096 * 512 -#define MEM_USED_BELOW 0x03000000 +#define MEM_USED_BELOW 50*1024*1024 uint64_t free_mem_cnt; uint64_t all_mem_cnt; @@ -23,8 +22,8 @@ void init_pmm() mb2_tag_mmap_entry entry = pos->mmap_entry; if (entry.type != 1) continue; - uint64_t base = entry.base_addr & (PMM_PAGE_SIZE - 1) ? (entry.base_addr & (uint64_t)~(PMM_PAGE_SIZE - 1)) + PMM_PAGE_SIZE : entry.base_addr; - for (uint64_t i = base; i + PMM_PAGE_SIZE <= entry.base_addr + entry.length; i += PMM_PAGE_SIZE) { + uint64_t base = entry.base_addr & (PAGE_SIZE - 1) ? (entry.base_addr & (uint64_t)~(PAGE_SIZE - 1)) + PAGE_SIZE : entry.base_addr; + for (uint64_t i = base; i + PAGE_SIZE <= entry.base_addr + entry.length; i += PAGE_SIZE) { if (i >= MEM_USED_BELOW) { free_mem_cnt++; map_addr(i, i, FLAG_PRESENT); @@ -44,6 +43,6 @@ void init_pmm() void memory_usage() { - printf("memory used: %dMB\n", (48 * 1024 * 1024 + (all_mem_cnt - free_mem_cnt) * PAGE_SIZE) / 1024 / 1024); + printf("memory used: %dMB\n", (MEM_USED_BELOW + (all_mem_cnt - free_mem_cnt) * PAGE_SIZE) / 1024 / 1024); printf("memory free: %dMB\n", free_mem_cnt * PAGE_SIZE / 1024 / 1024); } diff --git a/kernel/src/sys/userspace_asm.S b/kernel/src/sys/userspace_asm.S index 4431a84..1bb19a3 100644 --- a/kernel/src/sys/userspace_asm.S +++ b/kernel/src/sys/userspace_asm.S @@ -3,6 +3,10 @@ .extern begin_userspace .extern syscall_handler +.set IA32_EFER, 0xc0000080 +.set STAR_MSR, 0xc0000081 +.set LSTAR_MSR, 0xc0000082 + .global jump_userspace jump_userspace: mov $0x1b, %ax @@ -11,17 +15,17 @@ jump_userspace: mov %ax, %fs mov %ax, %gs - mov $0xc0000082, %rcx + mov $LSTAR_MSR, %rcx movabs $__syscall, %rax shr $32, %rax mov %eax, %edx movabs $__syscall, %rax wrmsr - mov $0xc0000080, %rcx + mov $IA32_EFER, %rcx rdmsr or $1, %eax wrmsr - mov $0xc0000081, %rcx + mov $STAR_MSR, %rcx rdmsr mov $0x00130008, %edx wrmsr |
