⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vflat.c

📁 gumstiz u-boot loader in linux
💻 C
字号:
/******************************************************************************                   SciTech OS Portability Manager Library**  ========================================================================**    The contents of this file are subject to the SciTech MGL Public*    License Version 1.0 (the "License"); you may not use this file*    except in compliance with the License. You may obtain a copy of*    the License at http://www.scitechsoft.com/mgl-license.txt**    Software distributed under the License is distributed on an*    "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or*    implied. See the License for the specific language governing*    rights and limitations under the License.**    The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc.**    The Initial Developer of the Original Code is SciTech Software, Inc.*    All Rights Reserved.**  ========================================================================** Language:     ANSI C* Environment:  32-bit DOS** Description:  Main C module for the VFlat framebuffer routines. The page*               fault handler is always installed to handle up to a 4Mb*               framebuffer with a window size of 4Kb or 64Kb in size.*****************************************************************************/#include "pmapi.h"#include <stdlib.h>#include <dos.h>/*-------------------------------------------------------------------------*//* DOS4G/W, PMODE/W and CauseWay support.                                  *//*-------------------------------------------------------------------------*/#if defined(DOS4GW)#define VFLAT_START_ADDR    0xF0000000U#define VFLAT_END_ADDR      0xF03FFFFFU#define VFLAT_LIMIT         (VFLAT_END_ADDR - VFLAT_START_ADDR)#define PAGE_PRESENT        1#define PAGE_NOTPRESENT     0#define PAGE_READ           0#define PAGE_WRITE          2PRIVATE ibool   installed = false;PRIVATE ibool   haveDPMI = false;PUBLIC  ibool   _ASMAPI VF_haveCauseWay = false;PUBLIC  uchar * _ASMAPI VF_zeroPtr = NULL;/* Low level assembler code */int     _ASMAPI InitPaging(void);void    _ASMAPI ClosePaging(void);void    _ASMAPI MapPhysical2Linear(ulong pAddr, ulong lAddr, int pages, int flags);void    _ASMAPI InstallFaultHandler(ulong baseAddr,int bankSize);void    _ASMAPI RemoveFaultHandler(void);void    _ASMAPI InstallBankFunc(int codeLen,void *bankFunc);void * _ASMAPI VF_malloc(uint size){ return PM_malloc(size); }void _ASMAPI VF_free(void *p){ PM_free(p); }PRIVATE ibool CheckDPMI(void)/****************************************************************************** Function:     CheckDPMI* Returns:      True if we are running under DPMI*****************************************************************************/{    PMREGS  regs;    if (haveDPMI)	return true;    /* Check if we are running under DPMI in which case we will not be     * able to install our page fault handlers. We can however use the     * DVA.386 or VFLATD.386 virtual device drivers if they are present.     */    regs.x.ax = 0xFF00;    PM_int386(0x31,&regs,&regs);    if (!regs.x.cflag && (regs.e.edi & 8))	return (haveDPMI = true);    return false;}ibool PMAPI VF_available(void)/****************************************************************************** Function:     VF_available* Returns:      True if virtual buffer is available, false if not.*****************************************************************************/{    if (!VF_zeroPtr)	VF_zeroPtr = PM_mapPhysicalAddr(0,0xFFFFFFFF,true);    if (CheckDPMI())	return false;    /* Standard DOS4GW, PMODE/W and Causeway */    if (InitPaging() == -1)	return false;    ClosePaging();    return true;}void * PMAPI InitDPMI(ulong baseAddr,int bankSize,int codeLen,void *bankFunc)/****************************************************************************** Function:     InitDOS4GW* Parameters:   baseAddr    - Base address of framebuffer bank window*               bankSize    - Physical size of banks in Kb (4 or 64)*               codeLen     - Length of 32 bit bank switch function*               bankFunc    - Pointer to protected mode bank function* Returns:      Near pointer to virtual framebuffer, or NULL on failure.** Description:  Installs the virtual linear framebuffer handling for*               DPMI environments. This requires the DVA.386 or VFLATD.386*               virtual device drivers to be installed and functioning.*****************************************************************************/{    (void)baseAddr;    (void)bankSize;    (void)codeLen;    (void)bankFunc;    return NULL;}void * PMAPI InitDOS4GW(ulong baseAddr,int bankSize,int codeLen,void *bankFunc)/****************************************************************************** Function:     InitDOS4GW* Parameters:   baseAddr    - Base address of framebuffer bank window*               bankSize    - Physical size of banks in Kb (4 or 64)*               codeLen     - Length of 32 bit bank switch function*               bankFunc    - Pointer to protected mode bank function* Returns:      Near pointer to virtual framebuffer, or NULL on failure.** Description:  Installs the virtual linear framebuffer handling for*               the DOS4GW extender.*****************************************************************************/{    int     i;    if (InitPaging() == -1)	return NULL;            /* Cannot do hardware paging!       */    /* Map 4MB of video memory into linear address space (read/write) */    if (bankSize == 64) {	for (i = 0; i < 64; i++) {	    MapPhysical2Linear(baseAddr,VFLAT_START_ADDR+(i<<16),16,		PAGE_WRITE | PAGE_NOTPRESENT);	    }	}    else {	for (i = 0; i < 1024; i++) {	    MapPhysical2Linear(baseAddr,VFLAT_START_ADDR+(i<<12),1,		PAGE_WRITE | PAGE_NOTPRESENT);	    }	}    /* Install our page fault handler and banks switch function */    InstallFaultHandler(baseAddr,bankSize);    InstallBankFunc(codeLen,bankFunc);    installed = true;    return (void*)VFLAT_START_ADDR;}void * PMAPI VF_init(ulong baseAddr,int bankSize,int codeLen,void *bankFunc)/****************************************************************************** Function:     VF_init* Parameters:   baseAddr    - Base address of framebuffer bank window*               bankSize    - Physical size of banks in Kb (4 or 64)*               codeLen     - Length of 32 bit bank switch function*               bankFunc    - Pointer to protected mode bank function* Returns:      Near pointer to virtual framebuffer, or NULL on failure.** Description:  Installs the virtual linear framebuffer handling.*****************************************************************************/{    if (installed)	return (void*)VFLAT_START_ADDR;    if (codeLen > 100)	return NULL;                /* Bank function is too large!      */    if (!VF_zeroPtr)	VF_zeroPtr = PM_mapPhysicalAddr(0,0xFFFFFFFF,true);    if (CheckDPMI())	return InitDPMI(baseAddr,bankSize,codeLen,bankFunc);    return InitDOS4GW(baseAddr,bankSize,codeLen,bankFunc);}void PMAPI VF_exit(void)/****************************************************************************** Function:     VF_exit** Description:  Closes down the virtual framebuffer services and*               restores the previous page fault handler.*****************************************************************************/{    if (installed) {	if (haveDPMI) {	    /* DPMI support */	    }	else {	    /* Standard DOS4GW and PMODE/W support */	    RemoveFaultHandler();	    ClosePaging();	    }	installed = false;	}}/*-------------------------------------------------------------------------*//* Support mapped out for other compilers.                                 *//*-------------------------------------------------------------------------*/#elseibool PMAPI VF_available(void){    return false;}void * PMAPI VF_init(ulong baseAddr,int bankSize,int codeLen,void *bankFunc){    (void)baseAddr;    (void)bankSize;    (void)codeLen;    (void)bankFunc;    return NULL;}void PMAPI VF_exit(void){}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -