X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FModules%2FDisplay%2FVESA%2Fmain.c;h=0af86cbd65ecc76ee5ae377f722fc28ba52ccf4f;hb=4e407e69bd660e9a32644281733192193ee6e8c8;hp=3422d0e6b5a0768650bf9f07cbc0659e2fe05860;hpb=4be667e4d60a9e4caf76c2366830a5b315bd1e66;p=tpg%2Facess2.git diff --git a/KernelLand/Modules/Display/VESA/main.c b/KernelLand/Modules/Display/VESA/main.c index 3422d0e6..0af86cbd 100644 --- a/KernelLand/Modules/Display/VESA/main.c +++ b/KernelLand/Modules/Display/VESA/main.c @@ -2,7 +2,7 @@ * AcessOS 1 * Video BIOS Extensions (Vesa) Driver */ -#define DEBUG 1 +#define DEBUG 0 #define VERSION 0x100 #include @@ -13,9 +13,14 @@ #include #include "common.h" #include +#include // === CONSTANTS === -#define USE_BIOS 1 +#ifdef ARCHDIR_is_x86 +# define USE_BIOS 1 +#else +# define USE_BIOS 0 +#endif #define VESA_DEFAULT_FRAMEBUFFER (KERNEL_BASE|0xA0000) #define BLINKING_CURSOR 0 #if BLINKING_CURSOR @@ -32,6 +37,7 @@ size_t Vesa_Write(tVFS_Node *Node, off_t Offset, size_t Length, const void *Buff int Vesa_Int_ModeInfo(tVideo_IOCtl_Mode *data); void Vesa_int_HideCursor(void); void Vesa_int_ShowCursor(void); + int Vesa_int_SetCursor(tVideo_IOCtl_Bitmap *Cursor); void Vesa_FlipCursor(void *Arg); Uint16 VBE_int_GetWord(const tVT_Char *Char); void VBE_int_Text_2D_Fill(void *Ent, Uint16 X, Uint16 Y, Uint16 W, Uint16 H, Uint32 Colour); @@ -54,7 +60,7 @@ tVM8086 *gpVesa_BiosState; int giVesaCurrentMode = 0; tVesa_Mode gVesa_BootMode = {0x03, 80*8, 25*16, 80*8*2, 12, FLAG_POPULATED, 80*25*2, 0xB8000}; tVesa_Mode *gVesa_Modes; -tVesa_Mode *gpVesaCurMode; +tVesa_Mode *gpVesaCurMode = &gVesa_BootMode; int giVesaModeCount = 0; int gbVesaModesChecked; // --- Framebuffer --- @@ -123,6 +129,10 @@ int VBE_int_GetModeList(void) // Allocate Info Block info = VM8086_Allocate(gpVesa_BiosState, 512, &infoPtr.seg, &infoPtr.ofs); + if( info == NULL ) { + Log_Warning("VBE", "VM8086 allocation error"); + return MODULE_ERR_NOTNEEDED; + } // Set Requested Version memcpy(info->signature, "VBE2", 4); // Set Registers @@ -360,13 +370,16 @@ int Vesa_IOCtl(tVFS_Node *Node, int ID, void *Data) case VIDEO_IOCTL_SETBUFFORMAT: Vesa_int_HideCursor(); ret = gVesa_BufInfo.BufferFormat; - if(Data) gVesa_BufInfo.BufferFormat = *(int*)Data; + if(Data) + gVesa_BufInfo.BufferFormat = *(int*)Data; if(gVesa_BufInfo.BufferFormat == VIDEO_BUFFMT_TEXT) - DrvUtil_Video_SetCursor( &gVesa_BufInfo, &gDrvUtil_TextModeCursor ); + Vesa_int_SetCursor(&gDrvUtil_TextModeCursor); Vesa_int_ShowCursor(); return ret; case VIDEO_IOCTL_SETCURSOR: // Set cursor position + if( !CheckMem(Data, sizeof(tVideo_IOCtl_Pos)) ) + return -EINVAL; Vesa_int_HideCursor(); giVesaCursorX = ((tVideo_IOCtl_Pos*)Data)->x; giVesaCursorY = ((tVideo_IOCtl_Pos*)Data)->y; @@ -374,9 +387,7 @@ int Vesa_IOCtl(tVFS_Node *Node, int ID, void *Data) return 0; case VIDEO_IOCTL_SETCURSORBITMAP: - if( gpVesaCurMode->flags & FLAG_LFB ) - DrvUtil_Video_SetCursor( &gVesa_BufInfo, Data ); - return 0; + return Vesa_int_SetCursor(Data); } return 0; } @@ -432,16 +443,10 @@ int Vesa_Int_SetMode(int mode) // Map Framebuffer if( gpVesaCurMode ) { - if( gpVesaCurMode->framebuffer < 1024*1024 ) - ; - else - MM_UnmapHWPages((tVAddr)gpVesa_Framebuffer, giVesaPageCount); + MM_UnmapHWPages(gpVesa_Framebuffer, giVesaPageCount); } giVesaPageCount = (modeptr->fbSize + 0xFFF) >> 12; - if( modeptr->framebuffer < 1024*1024 ) - gpVesa_Framebuffer = (void*)(KERNEL_BASE|modeptr->framebuffer); - else - gpVesa_Framebuffer = (void*)MM_MapHWPages(modeptr->framebuffer, giVesaPageCount); + gpVesa_Framebuffer = MM_MapHWPages(modeptr->framebuffer, giVesaPageCount); Log_Log("VBE", "Setting mode to %i 0x%x (%ix%i %ibpp) %p[0x%x] maps %P", mode, modeptr->code, @@ -470,6 +475,11 @@ int Vesa_Int_SetMode(int mode) int VBE_int_MatchModes(tVideo_IOCtl_Mode *ReqMode, tVesa_Mode *ThisMode) { + if( ThisMode->bpp == 0 ) { + Log_Warning("VBE", "VESA mode %x (%ix%i) has 0bpp", + ThisMode->code, ThisMode->width, ThisMode->height); + return INT_MAX; + } LOG("Matching %ix%i %ibpp", ThisMode->width, ThisMode->height, ThisMode->bpp); if(ThisMode->width == ReqMode->width && ThisMode->height == ReqMode->height) { @@ -580,7 +590,7 @@ void Vesa_int_HideCursor(void) void Vesa_int_ShowCursor(void) { - if( gpVesaCurMode->flags & FLAG_LFB ) + if( gpVesaCurMode && gpVesaCurMode->flags & FLAG_LFB ) { gbVesa_CursorVisible = (giVesaCursorX >= 0); if(gVesa_BufInfo.BufferFormat == VIDEO_BUFFMT_TEXT) @@ -607,6 +617,21 @@ void Vesa_int_ShowCursor(void) } } +int Vesa_int_SetCursor(tVideo_IOCtl_Bitmap *Cursor) +{ + if( !CheckMem(Cursor, sizeof(tVideo_IOCtl_Bitmap)) ) + return -EINVAL; + + if( gpVesaCurMode && gpVesaCurMode->flags & FLAG_LFB ) + { + DrvUtil_Video_SetCursor( &gVesa_BufInfo, Cursor ); + } + else + { + } + return 0; +} + /** * \brief Swaps the text cursor on/off */ @@ -615,7 +640,7 @@ void Vesa_FlipCursor(void *Arg) if( gVesa_BufInfo.BufferFormat != VIDEO_BUFFMT_TEXT ) return ; - if( gpVesaCurMode->flags & FLAG_LFB ) + if( gpVesaCurMode && gpVesaCurMode->flags & FLAG_LFB ) { if( gbVesa_CursorVisible ) DrvUtil_Video_RemoveCursor(&gVesa_BufInfo);