1 /****************************************************************************
2 *
3 *			 BIOS emulator and interface
4 *		       to Realmode X86 Emulator Library
5 *
6 *  Copyright (C) 2007 Freescale Semiconductor, Inc.
7 *  Jason Jin <Jason.jin@freescale.com>
8 *
9 *		Copyright (C) 1996-1999 SciTech Software, Inc.
10 *
11 *  ========================================================================
12 *
13 *  Permission to use, copy, modify, distribute, and sell this software and
14 *  its documentation for any purpose is hereby granted without fee,
15 *  provided that the above copyright notice appear in all copies and that
16 *  both that copyright notice and this permission notice appear in
17 *  supporting documentation, and that the name of the authors not be used
18 *  in advertising or publicity pertaining to distribution of the software
19 *  without specific, written prior permission.	The authors makes no
20 *  representations about the suitability of this software for any purpose.
21 *  It is provided "as is" without express or implied warranty.
22 *
23 *  THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
24 *  INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
25 *  EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
26 *  CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
27 *  USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
28 *  OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
29 *  PERFORMANCE OF THIS SOFTWARE.
30 *
31 *  ========================================================================
32 *
33 * Language:	ANSI C
34 * Environment:	Any
35 * Developer:	Kendall Bennett
36 *
37 * Description:	Internal header file for the BIOS emulator library.
38 *
39 *		Jason ported this file to u-boot, Added some architecture
40 *		related Macro.
41 *
42 ****************************************************************************/
43 
44 #ifndef __BIOSEMUI_H
45 #define __BIOSEMUI_H
46 
47 #include "biosemu.h"
48 #include <asm/io.h>
49 /*---------------------- Macros and type definitions ----------------------*/
50 
51 #ifdef CONFIG_X86EMU_DEBUG
52 #define DB(x)	x
53 #else
54 #define DB(x)	do{}while(0);
55 #endif
56 
57 #define BIOS_SEG	0xfff0
58 extern X86EMU_sysEnv _X86EMU_env;
59 #define M		_X86EMU_env
60 
61 /* Macros to read and write values to x86 emulator memory. Memory is always
62  * considered to be little endian, so we use macros to do endian swapping
63  * where necessary.
64  */
65 
66 #ifdef __BIG_ENDIAN__
67 #define readb_le(base)	    *((u8*)(base))
68 #define readw_le(base)	    ((u16)readb_le(base) | ((u16)readb_le((base) + 1) << 8))
69 #define readl_le(base)	    ((u32)readb_le((base) + 0) | ((u32)readb_le((base) + 1) << 8) | \
70 			    ((u32)readb_le((base) + 2) << 16) | ((u32)readb_le((base) + 3) << 24))
71 #define writeb_le(base, v)  *((u8*)(base)) = (v)
72 #define writew_le(base, v)  writeb_le(base + 0, (v >> 0) & 0xff),	\
73 			    writeb_le(base + 1, (v >> 8) & 0xff)
74 #define writel_le(base, v)  writeb_le(base + 0, (v >> 0) & 0xff),	\
75 			    writeb_le(base + 1, (v >> 8) & 0xff),	\
76 			    writeb_le(base + 2, (v >> 16) & 0xff),	\
77 			    writeb_le(base + 3, (v >> 24) & 0xff)
78 #else
79 #define readb_le(base)	    *((u8*)(base))
80 #define readw_le(base)	    *((u16*)(base))
81 #define readl_le(base)	    *((u32*)(base))
82 #define writeb_le(base, v)  *((u8*)(base)) = (v)
83 #define writew_le(base, v)  *((u16*)(base)) = (v)
84 #define writel_le(base, v)  *((u32*)(base)) = (v)
85 #endif
86 
87 /****************************************************************************
88 REMARKS:
89 Function codes passed to the emulated I/O port functions to determine the
90 type of operation to perform.
91 ****************************************************************************/
92 typedef enum {
93 	REG_READ_BYTE = 0,
94 	REG_READ_WORD = 1,
95 	REG_READ_DWORD = 2,
96 	REG_WRITE_BYTE = 3,
97 	REG_WRITE_WORD = 4,
98 	REG_WRITE_DWORD = 5
99 } RegisterFlags;
100 
101 /****************************************************************************
102 REMARKS:
103 Function codes passed to the emulated I/O port functions to determine the
104 type of operation to perform.
105 ****************************************************************************/
106 typedef enum {
107 	PORT_BYTE = 1,
108 	PORT_WORD = 2,
109 	PORT_DWORD = 3,
110 } PortInfoFlags;
111 
112 /****************************************************************************
113 REMARKS:
114 Data structure used to describe the details for the BIOS emulator system
115 environment as used by the X86 emulator library.
116 
117 HEADER:
118 biosemu.h
119 
120 MEMBERS:
121 type	    - Type of port access (1 = byte, 2 = word, 3 = dword)
122 defVal	    - Default power on value
123 finalVal    - Final value
124 ****************************************************************************/
125 typedef struct {
126 	u8 type;
127 	u32 defVal;
128 	u32 finalVal;
129 } BE_portInfo;
130 
131 #if defined(X86EMU_RAW_IO)
132 #define PM_inpb(port)	inb(port)
133 #define PM_inpw(port)	inw(port)
134 #define PM_inpd(port)	inl(port)
135 #define PM_outpb(port, val)	outb(val, port)
136 #define PM_outpw(port, val)	outw(val, port)
137 #define PM_outpd(port, val)	outl(val, port)
138 
139 #else
140 
141 /*
142  * Until the emulator code is fixed, at least print warnings.
143  */
144 
PM_inpb(u16 port)145 static inline u8 PM_inpb(u16 port)
146 {
147 	printf("x86 port 0x%x read attempt, returning 0\n", port);
148 	return 0;
149 }
150 
PM_inpw(u16 port)151 static inline u16 PM_inpw(u16 port)
152 {
153 	printf("x86 port 0x%x read attempt, returning 0\n", port);
154 	return 0;
155 }
156 
PM_inpd(u16 port)157 static inline u32 PM_inpd(u16 port)
158 {
159 	printf("x86 port 0x%x read attempt, returning 0\n", port);
160 	return 0;
161 }
162 
PM_outpb(u16 port,u8 val)163 static inline void PM_outpb(u16 port, u8 val)
164 {
165 	printf("x86 port 0x%x write attempt, ignoring\n", port);
166 }
167 
PM_outpw(u16 port,u16 val)168 static inline void PM_outpw(u16 port, u16 val)
169 {
170 	printf("x86 port 0x%x write attempt, ignoring\n", port);
171 }
172 
PM_outpd(u16 port,u32 val)173 static inline void PM_outpd(u16 port, u32 val)
174 {
175 	printf("x86 port 0x%x write attempt, ignoring\n", port);
176 }
177 #endif
178 
179 #define LOG_inpb(port)	PM_inpb(port)
180 #define LOG_inpw(port)	PM_inpw(port)
181 #define LOG_inpd(port)	PM_inpd(port)
182 #define LOG_outpb(port, val)	PM_outpb(port, val)
183 #define LOG_outpw(port, val)	PM_outpw(port, val)
184 #define LOG_outpd(port, val)	PM_outpd(port, val)
185 
186 /*-------------------------- Function Prototypes --------------------------*/
187 
188 /* bios.c */
189 
190 void _BE_bios_init(u32 * intrTab);
191 void _BE_setup_funcs(void);
192 
193 /* besys.c */
194 #define DEBUG_IO()	(M.x86.debug & DEBUG_IO_TRACE_F)
195 
196 u8 X86API BE_rdb(u32 addr);
197 u16 X86API BE_rdw(u32 addr);
198 u32 X86API BE_rdl(u32 addr);
199 void X86API BE_wrb(u32 addr, u8 val);
200 void X86API BE_wrw(u32 addr, u16 val);
201 void X86API BE_wrl(u32 addr, u32 val);
202 
203 u8 X86API BE_inb(X86EMU_pioAddr port);
204 u16 X86API BE_inw(X86EMU_pioAddr port);
205 u32 X86API BE_inl(X86EMU_pioAddr port);
206 void X86API BE_outb(X86EMU_pioAddr port, u8 val);
207 void X86API BE_outw(X86EMU_pioAddr port, u16 val);
208 void X86API BE_outl(X86EMU_pioAddr port, u32 val);
209 #endif
210 /* __BIOSEMUI_H */
211