X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Farch%2Fx86%2Fmain.c;h=10cac71681b51fd9ed80cb8b4ec4c1af13004968;hb=86f855a3e417d93976af42dde36f457e89524902;hp=865e53e4b27b6fee0d0f0d4577abddeab6fd8e89;hpb=8f870b810f0416ae051e6a3785a5e74bdd3cb513;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/arch/x86/main.c b/KernelLand/Kernel/arch/x86/main.c index 865e53e4..10cac716 100644 --- a/KernelLand/Kernel/arch/x86/main.c +++ b/KernelLand/Kernel/arch/x86/main.c @@ -9,6 +9,7 @@ #include #include #include +#include #define VGA_ERRORS 0 @@ -23,6 +24,8 @@ extern void MM_Install(int NPMemRanges, tPMemMapEnt *PMemRanges); extern void MM_InstallVirtual(void); extern int Time_Setup(void); 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); @@ -50,13 +53,26 @@ int kmain(Uint MbMagic, void *MbInfoPtr) // Multiboot 1 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); + + + // 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; } @@ -72,7 +88,7 @@ int kmain(Uint MbMagic, void *MbInfoPtr) MbMagic, MULTIBOOT_MAGIC, MULTIBOOT2_MAGIC); return 0; } - + // Set up physical memory manager MM_Install(nPMemMapEnts, pmemmap); @@ -107,29 +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"); - if( gaArch_BootModules ) - free( gaArch_BootModules ); + Multiboot_FreeModules(giArch_NumBootModules, gaArch_BootModules); + giArch_NumBootModules = 0; + gaArch_BootModules = NULL; }