X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Farch%2Fx86%2Fmain.c;h=10cac71681b51fd9ed80cb8b4ec4c1af13004968;hb=802762ae7efd39786c0e134ed0bdfe8100d97230;hp=2106b6afe2b47e2ef960c1ed1e43701e4cded5ac;hpb=51ab5f489bc356940c95cc936fd0508e8f07ea97;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/arch/x86/main.c b/KernelLand/Kernel/arch/x86/main.c index 2106b6af..10cac716 100644 --- a/KernelLand/Kernel/arch/x86/main.c +++ b/KernelLand/Kernel/arch/x86/main.c @@ -8,62 +8,73 @@ #include #include #include -#include +#include +#include #define VGA_ERRORS 0 +#define KERNEL_LOAD 0x100000 // 1MiB #define MAX_ARGSTR_POS (0x400000-0x2000) +#define MAX_PMEMMAP_ENTS 16 // === IMPORTS === -extern void Heap_Install(void); -extern void Desctab_Install(void); +extern char gKernelEnd[]; extern void MM_PreinitVirtual(void); -extern void MM_Install(tMBoot_Info *MBoot); +extern void MM_Install(int NPMemRanges, tPMemMapEnt *PMemRanges); extern void MM_InstallVirtual(void); -extern void Threads_Init(void); extern int Time_Setup(void); -// --- Core --- -extern void System_Init(char *Commandline); +extern int ACPICA_Initialise(void); +// - Modules/Display/VESA +extern void VBE_int_SetBootMode(Uint16 ModeID, const void *ModeInfo); // === PROTOTYPES === int kmain(Uint MbMagic, void *MbInfoPtr); // === GLOBALS === char *gsBootCmdLine = NULL; -struct { - Uint32 PBase; - void *Base; - Uint Size; - char *ArgString; -} *gaArch_BootModules; +tBootModule *gaArch_BootModules; int giArch_NumBootModules = 0; // === CODE === int kmain(Uint MbMagic, void *MbInfoPtr) { - int i; - tMBoot_Module *mods; tMBoot_Info *mbInfo; + tPMemMapEnt pmemmap[MAX_PMEMMAP_ENTS]; + int nPMemMapEnts; - LogF("Acess2 x86-"PLATFORM" v"EXPAND_STR(KERNEL_VERSION)"\n"); - LogF(" Build %i, Git Hash %s\n", BUILD_NUM, gsGitHash); + LogF("%s\r\n", gsBuildInfo); - Log("MbMagic = %08x, MbInfoPtr = %p", MbMagic, MbInfoPtr); - - // Set up non-boot info dependent stuff - Desctab_Install(); // Set up GDT and IDT MM_PreinitVirtual(); // Initialise virtual mappings - + + mbInfo = MbInfoPtr; + switch(MbMagic) { // Multiboot 1 - case MULTIBOOT_MAGIC: - // Adjust Multiboot structure address - mbInfo = (void*)( (Uint)MbInfoPtr + KERNEL_BASE ); + case MULTIBOOT_MAGIC: { + // TODO: Handle when this isn't in the mapped area + ASSERT( mbInfo->CommandLine < 4*1024*1024 ); gsBootCmdLine = (char*)(mbInfo->CommandLine + KERNEL_BASE); + + // Adjust Multiboot structure address + mbInfo = (void*)( (tVAddr)MbInfoPtr + KERNEL_BASE ); + + // Parse memory map + // - mbInfo->Flags is checked in this function + nPMemMapEnts = Multiboot_LoadMemoryMap(mbInfo, KERNEL_BASE, pmemmap, MAX_PMEMMAP_ENTS, + KERNEL_LOAD, (tVAddr)&gKernelEnd - KERNEL_BASE); - MM_Install( mbInfo ); // Set up physical memory manager - break; + + // Get video mode + Debug("mbInfo->Flags = 0x%x", mbInfo->Flags); + if( mbInfo->Flags & (1 << 11) ) + { + // TODO: Ensure address is in mapped area + ASSERT( mbInfo->vbe_mode_info < 4*1024*1024 ); + VBE_int_SetBootMode(mbInfo->vbe_mode, (void*)(mbInfo->vbe_mode_info + KERNEL_BASE)); + } + + break; } // Multiboot 2 case MULTIBOOT2_MAGIC: @@ -77,51 +88,28 @@ int kmain(Uint MbMagic, void *MbInfoPtr) MbMagic, MULTIBOOT_MAGIC, MULTIBOOT2_MAGIC); return 0; } + + // Set up physical memory manager + MM_Install(nPMemMapEnts, pmemmap); MM_InstallVirtual(); // Clean up virtual address space Heap_Install(); // Create initial heap + Time_Setup(); // Initialise timing // Start Multitasking Threads_Init(); - - // Start Timers - Time_Setup(); - + + #if USE_ACPICA + // Poke ACPICA + ACPICA_Initialise(); + #endif + Log_Log("Arch", "Starting VFS..."); // Load Virtual Filesystem VFS_Init(); // Load initial modules - mods = (void*)( mbInfo->Modules + KERNEL_BASE ); - giArch_NumBootModules = mbInfo->ModuleCount; - gaArch_BootModules = malloc( giArch_NumBootModules * sizeof(*gaArch_BootModules) ); - for( i = 0; i < mbInfo->ModuleCount; i ++ ) - { - int ofs; - - Log_Log("Arch", "Multiboot Module at 0x%08x, 0x%08x bytes (String at 0x%08x)", - mods[i].Start, mods[i].End-mods[i].Start, mods[i].String); - - gaArch_BootModules[i].PBase = mods[i].Start; - gaArch_BootModules[i].Size = mods[i].End - mods[i].Start; - - // Always HW map the module data - ofs = mods[i].Start&0xFFF; - gaArch_BootModules[i].Base = (void*)( MM_MapHWPages(mods[i].Start, - (gaArch_BootModules[i].Size+ofs+0xFFF) / 0x1000 - ) + ofs ); - - // Only map the string if needed - if( (tVAddr)mods[i].String > MAX_ARGSTR_POS ) - { - // Assumes the string is < 4096 bytes long) - gaArch_BootModules[i].ArgString = (void*)( - MM_MapHWPages(mods[i].String, 2) + (mods[i].String&0xFFF) - ); - } - else - gaArch_BootModules[i].ArgString = (char *)mods[i].String + KERNEL_BASE; - } + gaArch_BootModules = Multiboot_LoadModules(mbInfo, KERNEL_BASE, &giArch_NumBootModules); // Pass on to Independent Loader Log_Log("Arch", "Starting system"); @@ -135,26 +123,20 @@ int kmain(Uint MbMagic, void *MbInfoPtr) void Arch_LoadBootModules(void) { - int i, j, numPages; - for( i = 0; i < giArch_NumBootModules; i ++ ) + for( int i = 0; i < giArch_NumBootModules; i ++ ) { - Log_Log("Arch", "Loading '%s'", gaArch_BootModules[i].ArgString); + const tBootModule *mod = &gaArch_BootModules[i]; + Log_Log("Arch", "Loading (%p[%P]+%x) '%s'", + mod->Base, mod->PBase, mod->Size, + mod->ArgString); - if( !Module_LoadMem( gaArch_BootModules[i].Base, gaArch_BootModules[i].Size, gaArch_BootModules[i].ArgString ) ) - { + if( !Module_LoadMem( mod->Base, mod->Size, mod->ArgString) ) { Log_Warning("Arch", "Unable to load module"); + continue ; } - - // Unmap and free - numPages = (gaArch_BootModules[i].Size + ((Uint)gaArch_BootModules[i].Base&0xFFF) + 0xFFF) >> 12; - MM_UnmapHWPages( (tVAddr)gaArch_BootModules[i].Base, numPages ); - - for( j = 0; j < numPages; j++ ) - MM_DerefPhys( gaArch_BootModules[i].PBase + (j << 12) ); - - if( (tVAddr) gaArch_BootModules[i].ArgString > MAX_ARGSTR_POS ) - MM_UnmapHWPages( (tVAddr)gaArch_BootModules[i].ArgString, 2 ); } Log_Log("Arch", "Boot modules loaded"); - free( gaArch_BootModules ); + Multiboot_FreeModules(giArch_NumBootModules, gaArch_BootModules); + giArch_NumBootModules = 0; + gaArch_BootModules = NULL; }