Fixed VM8086/Vesa memory allocation bug
authorJohn Hodge <[email protected]>
Tue, 6 Apr 2010 15:31:32 +0000 (23:31 +0800)
committerJohn Hodge <[email protected]>
Tue, 6 Apr 2010 15:31:32 +0000 (23:31 +0800)
Kernel/Makefile.BuildNum
Kernel/arch/x86/vm8086.c
Kernel/logging.c
Modules/Display/VESA/main.c

index 7bb7ce6..093dcc6 100644 (file)
@@ -1 +1 @@
-BUILD_NUM = 1793
+BUILD_NUM = 1800
index c837475..6853cbf 100644 (file)
@@ -294,23 +294,25 @@ void *VM8086_Allocate(tVM8086 *State, int Size, Uint16 *Segment, Uint16 *Offset)
 {
         int    i, j, base = 0;
         int    nBlocks, rem;
-       Uint32  bmp;
        
        Size = (Size + 127) & ~127;
-       nBlocks = Size >> 7;
+       nBlocks = Size / 128;
        
        if(Size > 4096) return NULL;
        
        for( i = 0; i < VM8086_PAGES_PER_INST; i++ )
        {
                if( State->Internal->AllocatedPages[i].VirtBase == 0 )  continue;
-               bmp = State->Internal->AllocatedPages[i].Bitmap;
+               
+               
+               //Log_Debug("VM8086", "AllocatedPages[%i].Bitmap = 0b%b", i, State->Internal->AllocatedPages[i].Bitmap);
+               
                rem = nBlocks;
                base = 0;
                // Scan the bitmap for a free block
-               for( j = 0; j < 32-nBlocks; j++ ) {
-                       if( bmp & (1 << j) ) {
-                               base = 0;
+               for( j = 0; j < 32; j++ ) {
+                       if( State->Internal->AllocatedPages[i].Bitmap & (1 << j) ) {
+                               base = j;
                                rem = nBlocks;
                        }
                        else {
@@ -321,6 +323,7 @@ void *VM8086_Allocate(tVM8086 *State, int Size, Uint16 *Segment, Uint16 *Offset)
                                                State->Internal->AllocatedPages[i].Bitmap |= 1 << (base + j);
                                        *Segment = State->Internal->AllocatedPages[i].PhysAddr / 16 + base * 8;
                                        *Offset = 0;
+                                       //Log_Debug("VM8086", "Allocated at #%i,%04x", i, base*128);
                                        return (void*)( State->Internal->AllocatedPages[i].VirtBase + base * 128 );
                                }
                        }
@@ -344,6 +347,7 @@ void *VM8086_Allocate(tVM8086 *State, int Size, Uint16 *Segment, Uint16 *Offset)
                
        for( j = 0; j < nBlocks; j++ )
                State->Internal->AllocatedPages[i].Bitmap |= 1 << j;
+       //Log_Debug("VM8086", "AllocatedPages[%i].Bitmap = 0b%b", i, State->Internal->AllocatedPages[i].Bitmap);
        *Segment = State->Internal->AllocatedPages[i].PhysAddr / 16;
        *Offset = 0;
        return (void*) State->Internal->AllocatedPages[i].VirtBase;
index 72856db..6eac233 100644 (file)
@@ -118,7 +118,7 @@ void Log_AddEvent(char *Ident, int Level, char *Format, va_list Args)
  */
 void Log_Int_PrintMessage(tLogEntry *Entry)
 {
-       LogF("%018lli%s [%8s] %s\n",
+       LogF("%018lli%s [%+8s] %s\n",
                Entry->Time,
                csaLevelCodes[Entry->Level],
                Entry->Ident,
index e960888..6929293 100644 (file)
@@ -70,10 +70,11 @@ int Vesa_Install(char **Arguments)
                return MODULE_ERR_NOTNEEDED;\r
        }\r
        \r
+       Log_Debug("Vesa", "info->VideoModes = %04x:%04x", info->VideoModes.seg, info->VideoModes.ofs);\r
        modes = (Uint16 *) VM8086_GetPointer(gpVesa_BiosState, info->VideoModes.seg, info->VideoModes.ofs);\r
        \r
        // Read Modes\r
-       for( giVesaModeCount = 1; modes[giVesaModeCount] != 0xFFFF; giVesaModeCount++ );\r
+       for( giVesaModeCount = 0; modes[giVesaModeCount] != 0xFFFF; giVesaModeCount++ );\r
        gVesa_Modes = (tVesa_Mode *)malloc( giVesaModeCount * sizeof(tVesa_Mode) );\r
        \r
        // Insert Text Mode\r
@@ -95,8 +96,6 @@ int Vesa_Install(char **Arguments)
                gpVesa_BiosState->DI = modeinfoPtr.ofs;\r
                VM8086_Int(gpVesa_BiosState, 0x10);\r
                \r
-               Log_Debug("Vesa", "gpVesa_BiosState->AX = 0x%04x", gpVesa_BiosState->AX);\r
-               \r
                // Parse Info\r
                gVesa_Modes[i].flags = 0;\r
                if ( (modeinfo->attributes & 0x90) == 0x90 )\r

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