2022-08-22 19:16:34 +00:00
|
|
|
#include <stdint.h>
|
|
|
|
#include <stddef.h>
|
|
|
|
#include "multiboot.h"
|
2022-09-02 23:00:17 +00:00
|
|
|
#include "../memory/PhysicalMemoryManager.h"
|
|
|
|
|
2022-08-22 19:16:34 +00:00
|
|
|
#define CHECK_FLAG(flags, bit) ((flags) & (1 <<(bit)))
|
2022-09-02 23:00:17 +00:00
|
|
|
#define VADDR_TO_PADDR(vaddr) (vaddr - 0xC0000000)
|
|
|
|
#define PADDR_TO_VADDR(paddr) (paddr + 0xC0000000)
|
2022-08-22 19:16:34 +00:00
|
|
|
|
|
|
|
|
2022-09-02 23:00:17 +00:00
|
|
|
extern "C" void prekernelSetup ( unsigned long magic, multiboot_info_t* mbi)
|
|
|
|
{
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Check Multiboot magic number
|
|
|
|
*/
|
|
|
|
if (magic != MULTIBOOT_BOOTLOADER_MAGIC)
|
|
|
|
{
|
|
|
|
// PANIC!!
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
mbi = PADDR_TO_VADDR(mbi);
|
2022-08-23 19:35:19 +00:00
|
|
|
|
2022-09-02 23:00:17 +00:00
|
|
|
|
|
|
|
// Setup the physical memory manager immmediatly
|
|
|
|
// Doing so saves the complications of doing it later when
|
|
|
|
// paging is enabled
|
|
|
|
|
|
|
|
/*
|
|
|
|
If we got a memory map from our bootloader we
|
|
|
|
should be parsing it to find out the memory regions available.
|
|
|
|
*/
|
|
|
|
if (CHECK_FLAG(mbi->flags, 6))
|
|
|
|
{
|
|
|
|
|
|
|
|
// Calculate total memory size
|
|
|
|
uint32_t RAM_size = 0;
|
|
|
|
for(
|
|
|
|
multiboot_memory_map_t* mmap = (multiboot_memory_map_t*) mbi->mmap_addr;
|
|
|
|
(unsigned long)mmap < mbi->mmap_addr + mbi->mmap_length;
|
|
|
|
mmap += mmap->size +sizeof(mmap->size)
|
|
|
|
){
|
2022-09-01 14:11:35 +00:00
|
|
|
RAM_size += mmap->len;
|
2022-09-02 23:00:17 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Call SetupPhysicalMemoryManager at its physical address
|
|
|
|
SetupPhysicalMemoryManager ( (uint32_t)VADDR_TO_PADDR(&kernel_end), RAM_size);
|
2022-08-23 19:35:19 +00:00
|
|
|
|
2022-09-02 23:00:17 +00:00
|
|
|
for(
|
|
|
|
multiboot_memory_map_t* mmap = (multiboot_memory_map_t*) mbi->mmap_addr;
|
|
|
|
(unsigned long)mmap < mbi->mmap_addr + mbi->mmap_length;
|
|
|
|
mmap += mmap->size +sizeof(mmap->size)
|
|
|
|
){
|
|
|
|
|
|
|
|
if(mmap->type == MULTIBOOT_MEMORY_AVAILABLE)
|
|
|
|
deallocate_region(mmap->addr, mmap->len);
|
|
|
|
if(mmap->type == MULTIBOOT_MEMORY_ACPI_RECLAIMABLE)
|
|
|
|
allocate_region(mmap->addr, mmap->len);
|
|
|
|
if(mmap->type == MULTIBOOT_MEMORY_RESERVED)
|
|
|
|
allocate_region(mmap->addr, mmap->len);
|
|
|
|
if(mmap->type == MULTIBOOT_MEMORY_NVS)
|
|
|
|
allocate_region(mmap->addr, mmap->len);
|
|
|
|
if(mmap->type == MULTIBOOT_MEMORY_BADRAM)
|
|
|
|
allocate_region(mmap->addr, mmap->len);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Allocate the kernel
|
|
|
|
allocate_region( (uint32_t)&kernel_begin, ( (uint32_t)&kernel_end - (uint32_t)&kernel_begin)- 0xC0000000 );
|
|
|
|
|
|
|
|
// Allocate the memory region below 1MB
|
|
|
|
allocate_region(0x0000000, 0x00100000);
|
2022-08-23 19:35:19 +00:00
|
|
|
|
2022-09-02 23:00:17 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// We didn't get a memory map from our bootloader.
|
|
|
|
// PANIC!!!!
|
|
|
|
return;
|
2022-08-23 19:35:19 +00:00
|
|
|
}
|
|
|
|
|
2022-09-02 23:00:17 +00:00
|
|
|
// allocate a full block for the other boot info!
|
|
|
|
BootInfoBlock* BIB = (BootInfoBlock*) allocate_block();
|
|
|
|
|
|
|
|
|
|
|
|
/* is boot device valid ? */
|
|
|
|
if (CHECK_FLAG (mbi->flags, 1))
|
|
|
|
{
|
|
|
|
BIB->bootDeviceID = mbi->boot_device;
|
|
|
|
} else{
|
|
|
|
BIB->bootDeviceID = 0x11111111;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Are mods_* valid? */
|
|
|
|
if(CHECK_FLAG ( mbi->flags, 3)){
|
|
|
|
multiboot_module_t *mod;
|
|
|
|
uint32_t i;
|
|
|
|
|
|
|
|
BIB->GrubModuleCount = mbi->mods_count;
|
|
|
|
|
|
|
|
|
|
|
|
for(i = 0, mod = (multiboot_module_t *) mbi->mods_addr; i < mbi->mods_count; i++ , mod++){
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Is the symbol table of a.out valid? */
|
|
|
|
if (CHECK_FLAG(mbi->flags, 4))
|
|
|
|
{
|
|
|
|
// NOTE: Do something with it.. (Store it , process it etc...)
|
|
|
|
// printf("- Valid Symbol Table available at 0x%x.\n Tab Size: %d, str Size: %d\n", BootInfo->SymbolTableAddr, BootInfo->SymbolTabSize, BootInfo->SymbolStrSize);
|
|
|
|
BIB->ValidSymbolTable = true;
|
|
|
|
multiboot_aout_symbol_table_t *multiboot_aout_sym = &(mbi->u.aout_sym);
|
|
|
|
|
|
|
|
} else{
|
|
|
|
BIB->ValidSymbolTable = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Is the section header table of ELF valid? */
|
|
|
|
if (CHECK_FLAG(mbi->flags, 5))
|
|
|
|
{
|
|
|
|
// NOTE: Do something with it.. (Store it , process it etc...)
|
|
|
|
BIB->ValidELFHeader = true;
|
|
|
|
multiboot_elf_section_header_table_t *multiboot_elf_sec = &(mbi->u.elf_sec);
|
|
|
|
|
|
|
|
}else{
|
|
|
|
BIB->ValidELFHeader = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Draw diagonal blue line */
|
|
|
|
if (CHECK_FLAG (mbi->flags, 12)){
|
|
|
|
BIB->EnabledVBE = true;
|
|
|
|
|
|
|
|
// NOTE: Do something with it.. (Store it , process it etc...)
|
|
|
|
} else{
|
|
|
|
BIB->EnabledVBE;
|
|
|
|
}
|
2022-08-22 19:16:34 +00:00
|
|
|
}
|