diff options
Diffstat (limited to 'drivers/bios_emulator/biosemu.c')
-rw-r--r-- | drivers/bios_emulator/biosemu.c | 372 |
1 files changed, 0 insertions, 372 deletions
diff --git a/drivers/bios_emulator/biosemu.c b/drivers/bios_emulator/biosemu.c deleted file mode 100644 index 9d4f07c..0000000 --- a/drivers/bios_emulator/biosemu.c +++ /dev/null @@ -1,372 +0,0 @@ -/**************************************************************************** -* -* BIOS emulator and interface -* to Realmode X86 Emulator Library -* -* Copyright (C) 2007 Freescale Semiconductor, Inc. -* Jason Jin <Jason.jin@freescale.com> -* -* Copyright (C) 1996-1999 SciTech Software, Inc. -* -* ======================================================================== -* -* Permission to use, copy, modify, distribute, and sell this software and -* its documentation for any purpose is hereby granted without fee, -* provided that the above copyright notice appear in all copies and that -* both that copyright notice and this permission notice appear in -* supporting documentation, and that the name of the authors not be used -* in advertising or publicity pertaining to distribution of the software -* without specific, written prior permission. The authors makes no -* representations about the suitability of this software for any purpose. -* It is provided "as is" without express or implied warranty. -* -* THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, -* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO -* EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR -* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF -* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -* PERFORMANCE OF THIS SOFTWARE. -* -* ======================================================================== -* -* Language: ANSI C -* Environment: Any -* Developer: Kendall Bennett -* -* Description: Module implementing the system specific functions. This -* module is always compiled and linked in the OS depedent -* libraries, and never in a binary portable driver. -* -* Jason ported this file to u-boot to run the ATI video card BIOS -* in u-boot. Made all the video memory be emulated during the -* BIOS runing process which may affect the VGA function but the -* frambuffer function can work after run the BIOS. -* -****************************************************************************/ - -#include <malloc.h> -#include <common.h> -#include "biosemui.h" - -BE_sysEnv _BE_env = {{0}}; -static X86EMU_memFuncs _BE_mem __attribute__((section(GOT2_TYPE))) = { - BE_rdb, - BE_rdw, - BE_rdl, - BE_wrb, - BE_wrw, - BE_wrl, - }; - -static X86EMU_pioFuncs _BE_pio __attribute__((section(GOT2_TYPE))) = { - BE_inb, - BE_inw, - BE_inl, - BE_outb, - BE_outw, - BE_outl, - }; - -#define OFF(addr) (u16)(((addr) >> 0) & 0xffff) -#define SEG(addr) (u16)(((addr) >> 4) & 0xf000) - -/**************************************************************************** -PARAMETERS: -debugFlags - Flags to enable debugging options (debug builds only) -memSize - Amount of memory to allocate for real mode machine -info - Pointer to default VGA device information - -REMARKS: -This functions initialises the BElib, and uses the passed in -BIOS image as the BIOS that is used and emulated at 0xC0000. -****************************************************************************/ -int X86API BE_init(u32 debugFlags, int memSize, BE_VGAInfo * info, int shared) -{ -#if !defined(__DRIVER__) && !defined(__KERNEL__) - - PM_init(); -#endif - memset(&M, 0, sizeof(M)); - if (memSize < 20480){ - printf("Emulator requires at least 20Kb of memory!\n"); - return 0; - } - - M.mem_base = malloc(memSize); - - if (M.mem_base == NULL){ - printf("Biosemu:Out of memory!"); - return 0; - } - M.mem_size = memSize; - - _BE_env.emulateVGA = 0; - _BE_env.busmem_base = (unsigned long)malloc(128 * 1024); - if ((void *)_BE_env.busmem_base == NULL){ - printf("Biosemu:Out of memory!"); - return 0; - } - M.x86.debug = debugFlags; - _BE_bios_init((u32*)info->LowMem); - X86EMU_setupMemFuncs(&_BE_mem); - X86EMU_setupPioFuncs(&_BE_pio); - BE_setVGA(info); - return 1; -} - -/**************************************************************************** -PARAMETERS: -info - Pointer to VGA device information to make current - -REMARKS: -This function sets the VGA BIOS functions in the emulator to point to the -specific VGA BIOS in use. This includes swapping the BIOS interrupt -vectors, BIOS image and BIOS data area to the new BIOS. This allows the -real mode BIOS to be swapped without resetting the entire emulator. -****************************************************************************/ -void X86API BE_setVGA(BE_VGAInfo * info) -{ - -#ifdef __KERNEL__ - _BE_env.vgaInfo.function = info->function; - _BE_env.vgaInfo.device = info->device; - _BE_env.vgaInfo.bus = info->bus; - _BE_env.vgaInfo.pcidev = info->pcidev; -#else - _BE_env.vgaInfo.pciInfo = info->pciInfo; -#endif - _BE_env.vgaInfo.BIOSImage = info->BIOSImage; - if (info->BIOSImage) { - _BE_env.biosmem_base = (ulong) info->BIOSImage; - _BE_env.biosmem_limit = 0xC0000 + info->BIOSImageLen - 1; - } else { - _BE_env.biosmem_base = _BE_env.busmem_base + 0x20000; - _BE_env.biosmem_limit = 0xC7FFF; - } - if ((info->LowMem[0] == 0) && (info->LowMem[1] == 0) && - (info->LowMem[2] == 0) && (info->LowMem[3] == 0)) - _BE_bios_init((u32 *) info->LowMem); - memcpy((u8 *) M.mem_base, info->LowMem, sizeof(info->LowMem)); -} - -/**************************************************************************** -PARAMETERS: -info - Pointer to VGA device information to retrieve current - -REMARKS: -This function returns the VGA BIOS functions currently active in the -emulator, so they can be restored at a later date. -****************************************************************************/ -void X86API BE_getVGA(BE_VGAInfo * info) -{ -#ifdef __KERNEL__ - info->function = _BE_env.vgaInfo.function; - info->device = _BE_env.vgaInfo.device; - info->bus = _BE_env.vgaInfo.bus; - info->pcidev = _BE_env.vgaInfo.pcidev; -#else - info->pciInfo = _BE_env.vgaInfo.pciInfo; -#endif - info->BIOSImage = _BE_env.vgaInfo.BIOSImage; - memcpy(info->LowMem, (u8 *) M.mem_base, sizeof(info->LowMem)); -} - -/**************************************************************************** -PARAMETERS: -r_seg - Segment for pointer to convert -r_off - Offset for pointer to convert - -REMARKS: -This function maps a real mode pointer in the emulator memory to a protected -mode pointer that can be used to directly access the memory. - -NOTE: The memory is *always* in little endian format, son on non-x86 - systems you will need to do endian translations to access this - memory. -****************************************************************************/ -void *X86API BE_mapRealPointer(uint r_seg, uint r_off) -{ - u32 addr = ((u32) r_seg << 4) + r_off; - - if (addr >= 0xC0000 && addr <= _BE_env.biosmem_limit) { - return (void *)(_BE_env.biosmem_base + addr - 0xC0000); - } else if (addr >= 0xA0000 && addr <= 0xFFFFF) { - return (void *)(_BE_env.busmem_base + addr - 0xA0000); - } - return (void *)(M.mem_base + addr); -} - -/**************************************************************************** -PARAMETERS: -len - Return the length of the VESA buffer -rseg - Place to store VESA buffer segment -roff - Place to store VESA buffer offset - -REMARKS: -This function returns the address of the VESA transfer buffer in real -_BE_piomode emulator memory. The VESA transfer buffer is always 1024 bytes long, -and located at 15Kb into the start of the real mode memory (16Kb is where -we put the real mode code we execute for issuing interrupts). - -NOTE: The memory is *always* in little endian format, son on non-x86 - systems you will need to do endian translations to access this - memory. -****************************************************************************/ -void *X86API BE_getVESABuf(uint * len, uint * rseg, uint * roff) -{ - *len = 1024; - *rseg = SEG(0x03C00); - *roff = OFF(0x03C00); - return (void *)(M.mem_base + ((u32) * rseg << 4) + *roff); -} - -/**************************************************************************** -REMARKS: -Cleans up and exits the emulator. -****************************************************************************/ -void X86API BE_exit(void) -{ - free(M.mem_base); - free((void *)_BE_env.busmem_base); -} - -/**************************************************************************** -PARAMETERS: -seg - Segment of code to call -off - Offset of code to call -regs - Real mode registers to load -sregs - Real mode segment registers to load - -REMARKS: -This functions calls a real mode far function at the specified address, -and loads all the x86 registers from the passed in registers structure. -On exit the registers returned from the call are returned in the same -structures. -****************************************************************************/ -void X86API BE_callRealMode(uint seg, uint off, RMREGS * regs, RMSREGS * sregs) -{ - M.x86.R_EAX = regs->e.eax; - M.x86.R_EBX = regs->e.ebx; - M.x86.R_ECX = regs->e.ecx; - M.x86.R_EDX = regs->e.edx; - M.x86.R_ESI = regs->e.esi; - M.x86.R_EDI = regs->e.edi; - M.x86.R_DS = sregs->ds; - M.x86.R_ES = sregs->es; - M.x86.R_FS = sregs->fs; - M.x86.R_GS = sregs->gs; - - ((u8 *) M.mem_base)[0x4000] = 0x9A; - ((u8 *) M.mem_base)[0x4001] = (u8) off; - ((u8 *) M.mem_base)[0x4002] = (u8) (off >> 8); - ((u8 *) M.mem_base)[0x4003] = (u8) seg; - ((u8 *) M.mem_base)[0x4004] = (u8) (seg >> 8); - ((u8 *) M.mem_base)[0x4005] = 0xF1; /* Illegal op-code */ - M.x86.R_CS = SEG(0x04000); - M.x86.R_IP = OFF(0x04000); - - M.x86.R_SS = SEG(M.mem_size - 2); - M.x86.R_SP = OFF(M.mem_size - 2) + 2; - - X86EMU_exec(); - - regs->e.cflag = M.x86.R_EFLG & F_CF; - regs->e.eax = M.x86.R_EAX; - regs->e.ebx = M.x86.R_EBX; - regs->e.ecx = M.x86.R_ECX; - regs->e.edx = M.x86.R_EDX; - regs->e.esi = M.x86.R_ESI; - regs->e.edi = M.x86.R_EDI; - sregs->ds = M.x86.R_DS; - sregs->es = M.x86.R_ES; - sregs->fs = M.x86.R_FS; - sregs->gs = M.x86.R_GS; -} - -/**************************************************************************** -PARAMETERS: -intno - Interrupt number to execute -in - Real mode registers to load -out - Place to store resulting real mode registers - -REMARKS: -This functions calls a real mode interrupt function at the specified address, -and loads all the x86 registers from the passed in registers structure. -On exit the registers returned from the call are returned in out stucture. -****************************************************************************/ -int X86API BE_int86(int intno, RMREGS * in, RMREGS * out) -{ - M.x86.R_EAX = in->e.eax; - M.x86.R_EBX = in->e.ebx; - M.x86.R_ECX = in->e.ecx; - M.x86.R_EDX = in->e.edx; - M.x86.R_ESI = in->e.esi; - M.x86.R_EDI = in->e.edi; - ((u8 *) M.mem_base)[0x4000] = 0xCD; - ((u8 *) M.mem_base)[0x4001] = (u8) intno; - ((u8 *) M.mem_base)[0x4002] = 0xF1; - M.x86.R_CS = SEG(0x04000); - M.x86.R_IP = OFF(0x04000); - - M.x86.R_SS = SEG(M.mem_size - 1); - M.x86.R_SP = OFF(M.mem_size - 1) - 1; - - X86EMU_exec(); - out->e.cflag = M.x86.R_EFLG & F_CF; - out->e.eax = M.x86.R_EAX; - out->e.ebx = M.x86.R_EBX; - out->e.ecx = M.x86.R_ECX; - out->e.edx = M.x86.R_EDX; - out->e.esi = M.x86.R_ESI; - out->e.edi = M.x86.R_EDI; - return out->x.ax; -} - -/**************************************************************************** -PARAMETERS: -intno - Interrupt number to execute -in - Real mode registers to load -out - Place to store resulting real mode registers -sregs - Real mode segment registers to load - -REMARKS: -This functions calls a real mode interrupt function at the specified address, -and loads all the x86 registers from the passed in registers structure. -On exit the registers returned from the call are returned in out stucture. -****************************************************************************/ -int X86API BE_int86x(int intno, RMREGS * in, RMREGS * out, RMSREGS * sregs) -{ - M.x86.R_EAX = in->e.eax; - M.x86.R_EBX = in->e.ebx; - M.x86.R_ECX = in->e.ecx; - M.x86.R_EDX = in->e.edx; - M.x86.R_ESI = in->e.esi; - M.x86.R_EDI = in->e.edi; - M.x86.R_DS = sregs->ds; - M.x86.R_ES = sregs->es; - M.x86.R_FS = sregs->fs; - M.x86.R_GS = sregs->gs; - ((u8 *) M.mem_base)[0x4000] = 0xCD; - ((u8 *) M.mem_base)[0x4001] = (u8) intno; - ((u8 *) M.mem_base)[0x4002] = 0xF1; - M.x86.R_CS = SEG(0x04000); - M.x86.R_IP = OFF(0x04000); - - M.x86.R_SS = SEG(M.mem_size - 1); - M.x86.R_SP = OFF(M.mem_size - 1) - 1; - - X86EMU_exec(); - out->e.cflag = M.x86.R_EFLG & F_CF; - out->e.eax = M.x86.R_EAX; - out->e.ebx = M.x86.R_EBX; - out->e.ecx = M.x86.R_ECX; - out->e.edx = M.x86.R_EDX; - out->e.esi = M.x86.R_ESI; - out->e.edi = M.x86.R_EDI; - sregs->ds = M.x86.R_DS; - sregs->es = M.x86.R_ES; - sregs->fs = M.x86.R_FS; - sregs->gs = M.x86.R_GS; - return out->x.ax; -} |