X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Modules%2FDisplay%2FVESA%2Fmain.c;h=506a8b5ac54b93a8ff782f5bd7eece12b822cfcc;hb=de2ae10743172075f2d527780bdfd890ccddb8e7;hp=e30d64064f36e598b27cd1402310f912394fbc3c;hpb=1c821df6e9a345c41e0b7e5b71544ec6defb7faf;p=tpg%2Facess2.git diff --git a/Modules/Display/VESA/main.c b/Modules/Display/VESA/main.c index e30d6406..506a8b5a 100644 --- a/Modules/Display/VESA/main.c +++ b/Modules/Display/VESA/main.c @@ -16,7 +16,10 @@ // === CONSTANTS === #define FLAG_LFB 0x1 #define VESA_DEFAULT_FRAMEBUFFER (KERNEL_BASE|0xA0000) -#define VESA_CURSOR_PERIOD 1000 +#define BLINKING_CURSOR 1 +#if BLINKING_CURSOR +# define VESA_CURSOR_PERIOD 1000 +#endif // === PROTOTYPES === int Vesa_Install(char **Arguments); @@ -41,7 +44,7 @@ tDevFS_Driver gVesa_DriverStruct = { .IOCtl = Vesa_Ioctl } }; -tSpinlock glVesa_Lock; +tMutex glVesa_Lock; tVM8086 *gpVesa_BiosState; int giVesaDriverId = -1; // --- Video Modes --- @@ -250,12 +253,17 @@ Uint64 Vesa_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) ); // Sanity Check + if( Offset > (Uint64)(heightInChars*widthInChars) ) { + LEAVE('i', 0); + return 0; + } if(y >= heightInChars) { LEAVE('i', 0); return 0; } - if( Offset + Length > heightInChars*widthInChars ) { + + if( (int)Offset + (int)Length > heightInChars*widthInChars ) { Log_Debug("VESA", "%i + %i > %i*%i (%i)", (int)Offset, (int)Length, heightInChars, widthInChars, heightInChars*widthInChars); Length = heightInChars*widthInChars - Offset; @@ -267,7 +275,7 @@ Uint64 Vesa_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) LOG("dest = %p", dest); - for( i = 0; i < Length; i++ ) + for( i = 0; i < (int)Length; i++ ) { VT_Font_Render( chars->Ch, @@ -358,6 +366,10 @@ int Vesa_Ioctl(tVFS_Node *Node, int ID, void *Data) return ret; case VIDEO_IOCTL_SETCURSOR: // Set cursor position + #if !BLINKING_CURSOR + if(giVesaCursorX > 0) + Vesa_FlipCursor(Node); + #endif giVesaCursorX = ((tVideo_IOCtl_Pos*)Data)->x; giVesaCursorY = ((tVideo_IOCtl_Pos*)Data)->y; //Log_Debug("VESA", "Cursor position (%i,%i)", giVesaCursorX, giVesaCursorY); @@ -366,17 +378,23 @@ int Vesa_Ioctl(tVFS_Node *Node, int ID, void *Data) || giVesaCursorX >= gpVesaCurMode->width/giVT_CharWidth || giVesaCursorY >= gpVesaCurMode->height/giVT_CharHeight) { + #if BLINKING_CURSOR if(giVesaCursorTimer != -1) { Time_RemoveTimer(giVesaCursorTimer); giVesaCursorTimer = -1; } + #endif giVesaCursorX = -1; giVesaCursorY = -1; } else { + #if BLINKING_CURSOR // Log_Debug("VESA", "Updating timer %i?", giVesaCursorTimer); if(giVesaCursorTimer == -1) giVesaCursorTimer = Time_CreateTimer(VESA_CURSOR_PERIOD, Vesa_FlipCursor, Node); + #else + Vesa_FlipCursor(Node); + #endif } //Log_Debug("VESA", "Cursor position (%i,%i) Timer %i", giVesaCursorX, giVesaCursorY, giVesaCursorTimer); return 0; @@ -403,7 +421,7 @@ int Vesa_Int_SetMode(int mode) Time_RemoveTimer(giVesaCursorTimer); giVesaCursorTimer = -1; - LOCK( &glVesa_Lock ); + Mutex_Acquire( &glVesa_Lock ); gpVesa_BiosState->AX = 0x4F02; gpVesa_BiosState->BX = gVesa_Modes[mode].code; @@ -428,7 +446,7 @@ int Vesa_Int_SetMode(int mode) giVesaCurrentMode = mode; gpVesaCurMode = &gVesa_Modes[giVesaCurrentMode]; - RELEASE( &glVesa_Lock ); + Mutex_Release( &glVesa_Lock ); return 1; } @@ -500,7 +518,7 @@ void Vesa_FlipCursor(void *Arg) // Sanity 1 if(giVesaCursorX < 0 || giVesaCursorY < 0 - || y*pitch + x + giVT_CharHeight*pitch > gpVesaCurMode->fbSize/4) { + || y*pitch + x + giVT_CharHeight*pitch > (int)gpVesaCurMode->fbSize/4) { Debug("Cursor OOB (%i,%i)", x, y); giVesaCursorTimer = -1; return; @@ -511,7 +529,9 @@ void Vesa_FlipCursor(void *Arg) for( i = 1; i < giVT_CharHeight-1; i++, fb += pitch ) *fb = ~*fb; + #if BLINKING_CURSOR giVesaCursorTimer = Time_CreateTimer(VESA_CURSOR_PERIOD, Vesa_FlipCursor, Arg); + #endif } // ------------------------