Merge branch 'master' of git://localhost/acess2
[tpg/acess2.git] / KernelLand / Kernel / arch / x86 / mboot.c
1 /*
2  * Acess2 Kernel x86 Port
3  * - By John Hodge (thePowersGang)
4  *
5  * mboot.c
6  * - Multiboot Support
7  */
8 #define DEBUG   0
9 #include <acess.h>
10 #include <mboot.h>
11
12 // === CODE ===
13 int Multiboot_LoadMemoryMap(tMBoot_Info *MBInfo, tVAddr MapOffset, tPMemMapEnt *Map, const int MapSize, tPAddr KStart, tPAddr KEnd)
14 {
15          int    nPMemMapEnts = 0;
16         tMBoot_MMapEnt  *ent = (void*)((tVAddr)MBInfo->MMapAddr + MapOffset);
17         tMBoot_MMapEnt  *last = (void*)((tVAddr)ent + MBInfo->MMapLength);
18         
19         ENTER("pMBInfo pMapOffset pMap iMapSize PKStart PKEnd",
20                 MBInfo, MapOffset, Map, MapSize, KStart, KEnd);
21
22         // Build up memory map
23         nPMemMapEnts = 0;
24         while( ent < last && nPMemMapEnts < MapSize )
25         {
26                 tPMemMapEnt     *nent = &Map[nPMemMapEnts];
27                 nent->Start = ent->Base;
28                 nent->Length = ent->Length;
29                 switch(ent->Type)
30                 {
31                 case 1:
32                         nent->Type = PMEMTYPE_FREE;
33                         break;
34                 default:
35                         nent->Type = PMEMTYPE_RESERVED;
36                         break;
37                 }
38                 nent->NUMADomain = 0;
39                 
40                 nPMemMapEnts ++;
41                 ent = (void*)( (tVAddr)ent + ent->Size + 4 );
42         }
43
44         // Ensure it's valid
45         nPMemMapEnts = PMemMap_ValidateMap(Map, nPMemMapEnts, MapSize);
46         // TODO: Error handling
47
48         // Replace kernel with PMEMTYPE_USED
49         nPMemMapEnts = PMemMap_MarkRangeUsed(
50                 Map, nPMemMapEnts, MapSize,
51                 KStart, KEnd - KStart
52                 );
53
54         // Replace modules with PMEMTYPE_USED
55         nPMemMapEnts = PMemMap_MarkRangeUsed(Map, nPMemMapEnts, MapSize,
56                 MBInfo->Modules, MBInfo->ModuleCount*sizeof(tMBoot_Module)
57                 );
58         tMBoot_Module *mods = (void*)( (tVAddr)MBInfo->Modules + MapOffset);
59         for( int i = 0; i < MBInfo->ModuleCount; i ++ )
60         {
61                 nPMemMapEnts = PMemMap_MarkRangeUsed(
62                         Map, nPMemMapEnts, MapSize,
63                         mods->Start, mods->End - mods->Start
64                         );
65         }
66         
67         // Debug - Output map
68         PMemMap_DumpBlocks(Map, nPMemMapEnts);
69
70         LEAVE('i', nPMemMapEnts);
71         return nPMemMapEnts;
72 }
73
74 tBootModule *Multiboot_LoadModules(tMBoot_Info *MBInfo, tVAddr MapOffset, int *ModuleCount)
75 {
76         tMBoot_Module   *mods = (void*)( MBInfo->Modules + MapOffset );
77         *ModuleCount = MBInfo->ModuleCount;
78         tBootModule *ret = malloc( MBInfo->ModuleCount * sizeof(*ret) );
79         for( int i = 0; i < MBInfo->ModuleCount; i ++ )
80         {
81                  int    ofs;
82         
83                 Log_Log("Arch", "Multiboot Module at 0x%08x, 0x%08x bytes (String at 0x%08x)",
84                         mods[i].Start, mods[i].End-mods[i].Start, mods[i].String);
85         
86                 ret[i].PBase = mods[i].Start;
87                 ret[i].Size = mods[i].End - mods[i].Start;
88         
89                 // Always HW map the module data        
90                 ofs = mods[i].Start&0xFFF;
91                 ret[i].Base = (void*)( MM_MapHWPages(mods[i].Start,
92                         (ret[i].Size+ofs+0xFFF) / 0x1000
93                         ) + ofs );
94                 
95                 // Only map the string if needed
96                 if( !MM_GetPhysAddr( (void*)(mods[i].String + MapOffset) ) )
97                 {
98                         // Assumes the string is < 4096 bytes long)
99                         ret[i].ArgString = (void*)(
100                                 MM_MapHWPages(mods[i].String, 2) + (mods[i].String&0xFFF)
101                                 );
102                 }
103                 else
104                         ret[i].ArgString = (char*)(tVAddr)mods[i].String + MapOffset;
105         }
106
107         return ret;
108 }
109

UCC git Repository :: git.ucc.asn.au