X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Farch%2Fx86%2Fmain.c;h=822bf70b124934d4941eff3928f706e901595378;hb=3b7ea9f98f32f0ca3a38f1667e544f29bf52efea;hp=8f36f47c67b3fc247714250dec7dc6ccf2ef9f94;hpb=fd61b8c2f5e94da0265b3885525beff8e86317f6;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/arch/x86/main.c b/KernelLand/Kernel/arch/x86/main.c index 8f36f47c..822bf70b 100644 --- a/KernelLand/Kernel/arch/x86/main.c +++ b/KernelLand/Kernel/arch/x86/main.c @@ -8,7 +8,6 @@ #include #include #include -#include #include #define VGA_ERRORS 0 @@ -19,12 +18,13 @@ // === IMPORTS === extern char gKernelEnd[]; -extern void Heap_Install(void); extern void MM_PreinitVirtual(void); extern void MM_Install(int NPMemRanges, tPMemMapEnt *PMemRanges); extern void MM_InstallVirtual(void); extern int Time_Setup(void); -//extern int ACPICA_Initialise(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); @@ -52,13 +52,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; } @@ -85,8 +98,10 @@ int kmain(Uint MbMagic, void *MbInfoPtr) // Start Multitasking Threads_Init(); + #if USE_ACPICA // Poke ACPICA -// ACPICA_Initialise(); + ACPICA_Initialise(); + #endif Log_Log("Arch", "Starting VFS..."); // Load Virtual Filesystem @@ -107,27 +122,29 @@ 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 ; } + #if 0 // Unmap and free - numPages = (gaArch_BootModules[i].Size + ((Uint)gaArch_BootModules[i].Base&0xFFF) + 0xFFF) >> 12; + int numPages = (mod->Size + ((tVAddr)mod->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) ); + //for( int j = 0; j < numPages; j++ ) + // MM_DerefPhys( mod->PBase + (j << 12) ); - if( (tVAddr) gaArch_BootModules[i].ArgString > MAX_ARGSTR_POS ) - MM_UnmapHWPages( (tVAddr)gaArch_BootModules[i].ArgString, 2 ); + if( (tVAddr) mod->ArgString > MAX_ARGSTR_POS ) + MM_UnmapHWPages( (tVAddr)mod->ArgString, 2 ); + #endif } Log_Log("Arch", "Boot modules loaded"); if( gaArch_BootModules )