|
|
|
/****************************************************************************
|
|
|
|
*
|
|
|
|
* 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: Internal header file for the BIOS emulator library.
|
|
|
|
*
|
|
|
|
* Jason ported this file to u-boot, Added some architecture
|
|
|
|
* related Macro.
|
|
|
|
*
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
#ifndef __BIOSEMUI_H
|
|
|
|
#define __BIOSEMUI_H
|
|
|
|
|
|
|
|
#include "biosemu.h"
|
|
|
|
#include <asm/io.h>
|
|
|
|
/*---------------------- Macros and type definitions ----------------------*/
|
|
|
|
|
|
|
|
#ifdef DEBUG
|
|
|
|
#define DB(x) x
|
|
|
|
#else
|
|
|
|
#define DB(x) do{}while(0);
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#define BIOS_SEG 0xfff0
|
|
|
|
extern X86EMU_sysEnv _X86EMU_env;
|
|
|
|
#define M _X86EMU_env
|
|
|
|
|
|
|
|
/* Macros to read and write values to x86 emulator memory. Memory is always
|
|
|
|
* considered to be little endian, so we use macros to do endian swapping
|
|
|
|
* where necessary.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifdef __BIG_ENDIAN__
|
|
|
|
#define readb_le(base) *((u8*)(base))
|
|
|
|
#define readw_le(base) ((u16)readb_le(base) | ((u16)readb_le((base) + 1) << 8))
|
|
|
|
#define readl_le(base) ((u32)readb_le((base) + 0) | ((u32)readb_le((base) + 1) << 8) | \
|
|
|
|
((u32)readb_le((base) + 2) << 16) | ((u32)readb_le((base) + 3) << 24))
|
|
|
|
#define writeb_le(base, v) *((u8*)(base)) = (v)
|
|
|
|
#define writew_le(base, v) writeb_le(base + 0, (v >> 0) & 0xff), \
|
|
|
|
writeb_le(base + 1, (v >> 8) & 0xff)
|
|
|
|
#define writel_le(base, v) writeb_le(base + 0, (v >> 0) & 0xff), \
|
|
|
|
writeb_le(base + 1, (v >> 8) & 0xff), \
|
|
|
|
writeb_le(base + 2, (v >> 16) & 0xff), \
|
|
|
|
writeb_le(base + 3, (v >> 24) & 0xff)
|
|
|
|
#else
|
|
|
|
#define readb_le(base) *((u8*)(base))
|
|
|
|
#define readw_le(base) *((u16*)(base))
|
|
|
|
#define readl_le(base) *((u32*)(base))
|
|
|
|
#define writeb_le(base, v) *((u8*)(base)) = (v)
|
|
|
|
#define writew_le(base, v) *((u16*)(base)) = (v)
|
|
|
|
#define writel_le(base, v) *((u32*)(base)) = (v)
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
REMARKS:
|
|
|
|
Function codes passed to the emulated I/O port functions to determine the
|
|
|
|
type of operation to perform.
|
|
|
|
****************************************************************************/
|
|
|
|
typedef enum {
|
|
|
|
REG_READ_BYTE = 0,
|
|
|
|
REG_READ_WORD = 1,
|
|
|
|
REG_READ_DWORD = 2,
|
|
|
|
REG_WRITE_BYTE = 3,
|
|
|
|
REG_WRITE_WORD = 4,
|
|
|
|
REG_WRITE_DWORD = 5
|
|
|
|
} RegisterFlags;
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
REMARKS:
|
|
|
|
Function codes passed to the emulated I/O port functions to determine the
|
|
|
|
type of operation to perform.
|
|
|
|
****************************************************************************/
|
|
|
|
typedef enum {
|
|
|
|
PORT_BYTE = 1,
|
|
|
|
PORT_WORD = 2,
|
|
|
|
PORT_DWORD = 3,
|
|
|
|
} PortInfoFlags;
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
REMARKS:
|
|
|
|
Data structure used to describe the details for the BIOS emulator system
|
|
|
|
environment as used by the X86 emulator library.
|
|
|
|
|
|
|
|
HEADER:
|
|
|
|
biosemu.h
|
|
|
|
|
|
|
|
MEMBERS:
|
|
|
|
type - Type of port access (1 = byte, 2 = word, 3 = dword)
|
|
|
|
defVal - Default power on value
|
|
|
|
finalVal - Final value
|
|
|
|
****************************************************************************/
|
|
|
|
typedef struct {
|
|
|
|
u8 type;
|
|
|
|
u32 defVal;
|
|
|
|
u32 finalVal;
|
|
|
|
} BE_portInfo;
|
|
|
|
|
|
|
|
#define PM_inpb(port) inb(port+VIDEO_IO_OFFSET)
|
|
|
|
#define PM_inpw(port) inw(port+VIDEO_IO_OFFSET)
|
|
|
|
#define PM_inpd(port) inl(port+VIDEO_IO_OFFSET)
|
|
|
|
#define PM_outpb(port,val) outb(val,port+VIDEO_IO_OFFSET)
|
|
|
|
#define PM_outpw(port,val) outw(val,port+VIDEO_IO_OFFSET)
|
|
|
|
#define PM_outpd(port,val) outl(val,port+VIDEO_IO_OFFSET)
|
|
|
|
|
|
|
|
#define LOG_inpb(port) PM_inpb(port)
|
|
|
|
#define LOG_inpw(port) PM_inpw(port)
|
|
|
|
#define LOG_inpd(port) PM_inpd(port)
|
|
|
|
#define LOG_outpb(port,val) PM_outpb(port,val)
|
|
|
|
#define LOG_outpw(port,val) PM_outpw(port,val)
|
|
|
|
#define LOG_outpd(port,val) PM_outpd(port,val)
|
|
|
|
|
|
|
|
/*-------------------------- Function Prototypes --------------------------*/
|
|
|
|
|
|
|
|
/* bios.c */
|
|
|
|
|
|
|
|
void _BE_bios_init(u32 * intrTab);
|
|
|
|
void _BE_setup_funcs(void);
|
|
|
|
|
|
|
|
/* besys.c */
|
|
|
|
#define DEBUG_IO() (M.x86.debug & DEBUG_IO_TRACE_F)
|
|
|
|
|
|
|
|
u8 X86API BE_rdb(u32 addr);
|
|
|
|
u16 X86API BE_rdw(u32 addr);
|
|
|
|
u32 X86API BE_rdl(u32 addr);
|
|
|
|
void X86API BE_wrb(u32 addr, u8 val);
|
|
|
|
void X86API BE_wrw(u32 addr, u16 val);
|
|
|
|
void X86API BE_wrl(u32 addr, u32 val);
|
|
|
|
|
|
|
|
u8 X86API BE_inb(X86EMU_pioAddr port);
|
|
|
|
u16 X86API BE_inw(X86EMU_pioAddr port);
|
|
|
|
u32 X86API BE_inl(X86EMU_pioAddr port);
|
|
|
|
void X86API BE_outb(X86EMU_pioAddr port, u8 val);
|
|
|
|
void X86API BE_outw(X86EMU_pioAddr port, u16 val);
|
|
|
|
void X86API BE_outl(X86EMU_pioAddr port, u32 val);
|
|
|
|
#endif
|
|
|
|
/* __BIOSEMUI_H */
|