mirror of
https://github.com/Tom-on64/kern.git
synced 2026-11-03 18:22:22 +00:00
Fixed using ALIGN() instead of dceil() in vmm
This commit is contained in:
@@ -25,8 +25,12 @@
|
|||||||
#define ALIGN_DOWN(_addr, _align) ((_addr) & ~((_align) - 1))
|
#define ALIGN_DOWN(_addr, _align) ((_addr) & ~((_align) - 1))
|
||||||
#define BIT(_n) (1ULL << (_n))
|
#define BIT(_n) (1ULL << (_n))
|
||||||
|
|
||||||
#define min(_a, _b) ((_a) < (_b) ? (_a) : (_b))
|
#define swap(_a, _b) ({ typeof(_a) _tmp = (_a); (_a) = (_b); (_b) = (_a); })
|
||||||
#define max(_a, _b) ((_a) > (_b) ? (_a) : (_b))
|
#define min(_x, _y) ({ typeof(_x) __x = (_x); typeof(_y) __y = (_y); __x < __y ? __x : __y; })
|
||||||
|
#define max(_x, _y) ({ typeof(_x) __x = (_x); typeof(_y) __y = (_y); __x > __y ? __x : __y; })
|
||||||
|
#define ceil(_x, _y) ((((_x) + (_y)) (_y)) * (_y))
|
||||||
|
#define floor(_x, _y) ((_x) - ((_x) % (_y)))
|
||||||
|
#define dceil(_x, _y) (((_x) + (_y) - 1) / (_y))
|
||||||
|
|
||||||
#define fence() __asm__ volatile ("" ::: "memory")
|
#define fence() __asm__ volatile ("" ::: "memory")
|
||||||
|
|
||||||
|
|||||||
+11
-11
@@ -10,14 +10,13 @@
|
|||||||
|
|
||||||
__noreturn
|
__noreturn
|
||||||
void _start(void) {
|
void _start(void) {
|
||||||
|
int err = 0;
|
||||||
|
|
||||||
// Serial console for debugging
|
// Serial console for debugging
|
||||||
if (serial_init(COM1) < 0) panic("Failed to initialize Serial driver.");
|
if ((err = serial_init(COM1)) < 0) panic("Failed to initialize Serial driver. (%d)", err);
|
||||||
|
|
||||||
// Load structures from bootloader
|
// Load structures from bootloader
|
||||||
if (boot_init() < 0) panic("Failed to parse bootloader structures.");
|
if ((err = boot_init()) < 0) panic("Failed to parse bootloader structures. (%d)", err);
|
||||||
|
|
||||||
// The most important function in the world.
|
|
||||||
splash();
|
|
||||||
|
|
||||||
// CPUID thingy :p
|
// CPUID thingy :p
|
||||||
uint32_t eax = 0;
|
uint32_t eax = 0;
|
||||||
@@ -26,16 +25,17 @@ void _start(void) {
|
|||||||
pr_info("[kernel] CPUID_GETVENDORID: %s\n", s);
|
pr_info("[kernel] CPUID_GETVENDORID: %s\n", s);
|
||||||
|
|
||||||
// System init
|
// System init
|
||||||
if (gdt_init() < 0) panic("Failed to initalize GDT.");
|
if ((err = gdt_init()) < 0) panic("Failed to initalize GDT. (%d)", err);
|
||||||
if (isr_init() < 0) panic("Failed to initalize ISRs.");
|
if ((err = isr_init()) < 0) panic("Failed to initalize ISRs. (%d)", err);
|
||||||
|
|
||||||
// Memory management
|
// Memory management
|
||||||
if (pmm_init() < 0) panic("Failed to initalize Physical Memory Manager.");
|
if ((err = pmm_init()) < 0) panic("Failed to initalize Physical Memory Manager. (%d)", err);
|
||||||
if (pag_init() < 0) panic("Failed to initalize Paging.");
|
if ((err = pag_init()) < 0) panic("Failed to initalize Paging. (%d)", err);
|
||||||
|
|
||||||
panic("Yeah..");
|
// The most important function in the world.
|
||||||
|
splash();
|
||||||
|
|
||||||
// Patiently wait for things to do :)
|
// Patiently wait for things to do :)
|
||||||
while (1);
|
while (1);
|
||||||
}
|
};
|
||||||
|
|
||||||
|
|||||||
+5
-3
@@ -11,6 +11,8 @@
|
|||||||
// VIRTUAL address of the kernels PML4
|
// VIRTUAL address of the kernels PML4
|
||||||
uint64_t* pag_kernel_pml4 = NULL;
|
uint64_t* pag_kernel_pml4 = NULL;
|
||||||
|
|
||||||
|
// abcabcaaabcaab
|
||||||
|
|
||||||
int pag_init(void) {
|
int pag_init(void) {
|
||||||
pag_kernel_pml4 = TO_VIRT(pmm_alloc());
|
pag_kernel_pml4 = TO_VIRT(pmm_alloc());
|
||||||
if (IS_ERR(pag_kernel_pml4)) return PTR_ERR(pag_kernel_pml4);
|
if (IS_ERR(pag_kernel_pml4)) return PTR_ERR(pag_kernel_pml4);
|
||||||
@@ -20,14 +22,14 @@ int pag_init(void) {
|
|||||||
pag_kernel_pml4,
|
pag_kernel_pml4,
|
||||||
(void*)bootloader.kernel_virt_base,
|
(void*)bootloader.kernel_virt_base,
|
||||||
(void*)bootloader.kernel_phys_base,
|
(void*)bootloader.kernel_phys_base,
|
||||||
ALIGN(bootloader.executable->size, PAGE_SIZE),
|
dceil(bootloader.executable->size, PAGE_SIZE),
|
||||||
PTE_FLAG_WRITE | PTE_FLAG_PRESENT
|
PTE_FLAG_WRITE | PTE_FLAG_PRESENT
|
||||||
);
|
);
|
||||||
if (ret != SUCCESS) return ret;
|
if (ret != SUCCESS) return ret;
|
||||||
|
|
||||||
for (size_t i = 0; i < bootloader.mm_entry_count; i++) {
|
for (size_t i = 0; i < bootloader.mm_entry_count; i++) {
|
||||||
struct limine_memmap_entry* entry = bootloader.mm_entries[i];
|
struct limine_memmap_entry* entry = bootloader.mm_entries[i];
|
||||||
|
|
||||||
uint64_t flags = 0;
|
uint64_t flags = 0;
|
||||||
switch (entry->type) {
|
switch (entry->type) {
|
||||||
case LIMINE_MEMMAP_USABLE: flags = PTE_FLAG_WRITE; break;
|
case LIMINE_MEMMAP_USABLE: flags = PTE_FLAG_WRITE; break;
|
||||||
@@ -50,7 +52,7 @@ int pag_init(void) {
|
|||||||
ret = pag_map_region(
|
ret = pag_map_region(
|
||||||
pag_kernel_pml4,
|
pag_kernel_pml4,
|
||||||
(void*)(entry->base + bootloader.hhdm_offset), (void*)entry->base,
|
(void*)(entry->base + bootloader.hhdm_offset), (void*)entry->base,
|
||||||
ALIGN(entry->length, PAGE_SIZE),
|
dceil(entry->length, PAGE_SIZE),
|
||||||
flags | PTE_FLAG_PRESENT
|
flags | PTE_FLAG_PRESENT
|
||||||
);
|
);
|
||||||
if (ret != SUCCESS) return ret;
|
if (ret != SUCCESS) return ret;
|
||||||
|
|||||||
Reference in New Issue
Block a user