1 /* *********************************************************************
2 * Broadcom Common Firmware Environment (CFE)
4 * X86 simulator sparse memory File: X86MEM.H
6 * This module implements X86 memory for the X86 emulator
7 * used by the BIOS simulator. To avoid allocating the
8 * entire 1MB of PC's addressable memory, this is a "sparse"
9 * memory model, allocating chunks of storage as needed.
10 * VGA BIOSes seem to do all sorts of bizarre things to memory
11 * so this helps reduce the total amount we need to allocate
14 * In addition, this module lets the simulator "hook"
15 * ranges of memory to be handled by a callback
16 * routine. This is used so that we can redirect
17 * accesses to VGA memory space to the PCI bus handler.
19 * Author: Mitch Lichtenberg (mpl@broadcom.com)
21 *********************************************************************
23 * Copyright 2000,2001,2002,2003
24 * Broadcom Corporation. All rights reserved.
26 * This software is furnished under license and may be used and
27 * copied only in accordance with the following terms and
28 * conditions. Subject to these conditions, you may download,
29 * copy, install, use, modify and distribute modified or unmodified
30 * copies of this software in source and/or binary form. No title
31 * or ownership is transferred hereby.
33 * 1) Any source code used, modified or distributed must reproduce
34 * and retain this copyright notice and list of conditions
35 * as they appear in the source file.
37 * 2) No right is granted to use any trade name, trademark, or
38 * logo of Broadcom Corporation. The "Broadcom Corporation"
39 * name may not be used to endorse or promote products derived
40 * from this software without the prior written permission of
41 * Broadcom Corporation.
43 * 3) THIS SOFTWARE IS PROVIDED "AS-IS" AND ANY EXPRESS OR
44 * IMPLIED WARRANTIES, INCLUDING BUT NOT LIMITED TO, ANY IMPLIED
45 * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
46 * PURPOSE, OR NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT
47 * SHALL BROADCOM BE LIABLE FOR ANY DAMAGES WHATSOEVER, AND IN
48 * PARTICULAR, BROADCOM SHALL NOT BE LIABLE FOR DIRECT, INDIRECT,
49 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
50 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
51 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
52 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
53 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
54 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE), EVEN IF ADVISED OF
55 * THE POSSIBILITY OF SUCH DAMAGE.
56 ********************************************************************* */
59 /* *********************************************************************
61 ********************************************************************* */
63 #define X86MEM_CHUNKBITS 15
64 #define X86MEM_ADDRESSBITS 20
65 #define X86MEM_CHUNKSIZE (1<<X86MEM_CHUNKBITS)
66 #define X86MEM_CHUNKS (1<<(X86MEM_ADDRESSBITS-X86MEM_CHUNKBITS))
67 #define X86MEM_REGION(addr) (((addr) >> X86MEM_CHUNKBITS) & (X86MEM_CHUNKS-1))
68 #define X86MEM_OFFSET(addr) ((addr) & (X86MEM_CHUNKSIZE-1))
74 /* *********************************************************************
76 ********************************************************************* */
78 typedef struct x86mem_s
{
79 uint8_t *data
[X86MEM_CHUNKS
];
80 uint32_t (*read
[X86MEM_CHUNKS
])(struct x86mem_s
*x86mem
,
81 uint32_t addr
,int size
);
82 void (*write
[X86MEM_CHUNKS
])(struct x86mem_s
*x86mem
,
83 uint32_t addr
,uint32_t val
,int size
);
86 /* *********************************************************************
88 ********************************************************************* */
90 void x86mem_init(x86mem_t
*mem
);
91 void x86mem_uninit(x86mem_t
*mem
);
94 uint8_t x86mem_readb(x86mem_t
*mem
,uint32_t addr
);
95 uint16_t x86mem_readw(x86mem_t
*mem
,uint32_t addr
);
96 uint32_t x86mem_readl(x86mem_t
*mem
,uint32_t addr
);
99 void x86mem_writeb(x86mem_t
*mem
,uint32_t addr
,uint8_t data
);
100 void x86mem_writew(x86mem_t
*mem
,uint32_t addr
,uint16_t data
);
101 void x86mem_writel(x86mem_t
*mem
,uint32_t addr
,uint32_t data
);
102 void x86mem_memcpy(x86mem_t
*mem
,uint32_t destaddr
,uint8_t *src
,int count
);
103 void x86mem_hook(x86mem_t
*mem
,uint32_t chunkaddr
,
104 uint32_t (*readf
)(x86mem_t
*mem
,uint32_t addr
,int size
),
105 void (*writef
)(x86mem_t
*mem
,uint32_t addr
,uint32_t val
,int size
));
106 void x86mem_hook_range(x86mem_t
*mem
,uint32_t chunkaddr
,int size
,
107 uint32_t (*readf
)(x86mem_t
*mem
,uint32_t addr
,int size
),
108 void (*writef
)(x86mem_t
*mem
,uint32_t addr
,uint32_t val
,int size
));