Commit a4193c8a4bb36f64311d7d706e343ffabd9eb076
1 parent
170c6f87
support for opaque data on memory I/Os
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@874 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
7 changed files
with
93 additions
and
86 deletions
exec-all.h
... | ... | @@ -377,6 +377,7 @@ do {\ |
377 | 377 | |
378 | 378 | extern CPUWriteMemoryFunc *io_mem_write[IO_MEM_NB_ENTRIES][4]; |
379 | 379 | extern CPUReadMemoryFunc *io_mem_read[IO_MEM_NB_ENTRIES][4]; |
380 | +extern void *io_mem_opaque[IO_MEM_NB_ENTRIES]; | |
380 | 381 | |
381 | 382 | #ifdef __powerpc__ |
382 | 383 | static inline int testandset (int *p) | ... | ... |
exec.c
... | ... | @@ -117,6 +117,7 @@ static unsigned int virt_valid_tag; |
117 | 117 | /* io memory support */ |
118 | 118 | CPUWriteMemoryFunc *io_mem_write[IO_MEM_NB_ENTRIES][4]; |
119 | 119 | CPUReadMemoryFunc *io_mem_read[IO_MEM_NB_ENTRIES][4]; |
120 | +void *io_mem_opaque[IO_MEM_NB_ENTRIES]; | |
120 | 121 | static int io_mem_nb; |
121 | 122 | |
122 | 123 | /* log support */ |
... | ... | @@ -711,10 +712,13 @@ static inline void tb_invalidate_phys_page_fast(target_ulong start, int len) |
711 | 712 | PageDesc *p; |
712 | 713 | int offset, b; |
713 | 714 | #if 0 |
714 | - if (cpu_single_env->cr[0] & CR0_PE_MASK) { | |
715 | - printf("modifying code at 0x%x size=%d EIP=%x\n", | |
716 | - (vaddr & TARGET_PAGE_MASK) | (start & ~TARGET_PAGE_MASK), len, | |
717 | - cpu_single_env->eip); | |
715 | + if (1) { | |
716 | + if (loglevel) { | |
717 | + fprintf(logfile, "modifying code at 0x%x size=%d EIP=%x PC=%08x\n", | |
718 | + cpu_single_env->mem_write_vaddr, len, | |
719 | + cpu_single_env->eip, | |
720 | + cpu_single_env->eip + (long)cpu_single_env->segs[R_CS].base); | |
721 | + } | |
718 | 722 | } |
719 | 723 | #endif |
720 | 724 | p = page_find(start >> TARGET_PAGE_BITS); |
... | ... | @@ -1799,12 +1803,12 @@ void cpu_register_physical_memory(target_phys_addr_t start_addr, |
1799 | 1803 | } |
1800 | 1804 | } |
1801 | 1805 | |
1802 | -static uint32_t unassigned_mem_readb(target_phys_addr_t addr) | |
1806 | +static uint32_t unassigned_mem_readb(void *opaque, target_phys_addr_t addr) | |
1803 | 1807 | { |
1804 | 1808 | return 0; |
1805 | 1809 | } |
1806 | 1810 | |
1807 | -static void unassigned_mem_writeb(target_phys_addr_t addr, uint32_t val) | |
1811 | +static void unassigned_mem_writeb(void *opaque, target_phys_addr_t addr, uint32_t val) | |
1808 | 1812 | { |
1809 | 1813 | } |
1810 | 1814 | |
... | ... | @@ -1823,7 +1827,7 @@ static CPUWriteMemoryFunc *unassigned_mem_write[3] = { |
1823 | 1827 | /* self modifying code support in soft mmu mode : writing to a page |
1824 | 1828 | containing code comes to these functions */ |
1825 | 1829 | |
1826 | -static void code_mem_writeb(target_phys_addr_t addr, uint32_t val) | |
1830 | +static void code_mem_writeb(void *opaque, target_phys_addr_t addr, uint32_t val) | |
1827 | 1831 | { |
1828 | 1832 | unsigned long phys_addr; |
1829 | 1833 | |
... | ... | @@ -1835,7 +1839,7 @@ static void code_mem_writeb(target_phys_addr_t addr, uint32_t val) |
1835 | 1839 | phys_ram_dirty[phys_addr >> TARGET_PAGE_BITS] = 1; |
1836 | 1840 | } |
1837 | 1841 | |
1838 | -static void code_mem_writew(target_phys_addr_t addr, uint32_t val) | |
1842 | +static void code_mem_writew(void *opaque, target_phys_addr_t addr, uint32_t val) | |
1839 | 1843 | { |
1840 | 1844 | unsigned long phys_addr; |
1841 | 1845 | |
... | ... | @@ -1847,7 +1851,7 @@ static void code_mem_writew(target_phys_addr_t addr, uint32_t val) |
1847 | 1851 | phys_ram_dirty[phys_addr >> TARGET_PAGE_BITS] = 1; |
1848 | 1852 | } |
1849 | 1853 | |
1850 | -static void code_mem_writel(target_phys_addr_t addr, uint32_t val) | |
1854 | +static void code_mem_writel(void *opaque, target_phys_addr_t addr, uint32_t val) | |
1851 | 1855 | { |
1852 | 1856 | unsigned long phys_addr; |
1853 | 1857 | |
... | ... | @@ -1871,19 +1875,19 @@ static CPUWriteMemoryFunc *code_mem_write[3] = { |
1871 | 1875 | code_mem_writel, |
1872 | 1876 | }; |
1873 | 1877 | |
1874 | -static void notdirty_mem_writeb(target_phys_addr_t addr, uint32_t val) | |
1878 | +static void notdirty_mem_writeb(void *opaque, target_phys_addr_t addr, uint32_t val) | |
1875 | 1879 | { |
1876 | 1880 | stb_raw((uint8_t *)addr, val); |
1877 | 1881 | tlb_set_dirty(addr, cpu_single_env->mem_write_vaddr); |
1878 | 1882 | } |
1879 | 1883 | |
1880 | -static void notdirty_mem_writew(target_phys_addr_t addr, uint32_t val) | |
1884 | +static void notdirty_mem_writew(void *opaque, target_phys_addr_t addr, uint32_t val) | |
1881 | 1885 | { |
1882 | 1886 | stw_raw((uint8_t *)addr, val); |
1883 | 1887 | tlb_set_dirty(addr, cpu_single_env->mem_write_vaddr); |
1884 | 1888 | } |
1885 | 1889 | |
1886 | -static void notdirty_mem_writel(target_phys_addr_t addr, uint32_t val) | |
1890 | +static void notdirty_mem_writel(void *opaque, target_phys_addr_t addr, uint32_t val) | |
1887 | 1891 | { |
1888 | 1892 | stl_raw((uint8_t *)addr, val); |
1889 | 1893 | tlb_set_dirty(addr, cpu_single_env->mem_write_vaddr); |
... | ... | @@ -1897,10 +1901,10 @@ static CPUWriteMemoryFunc *notdirty_mem_write[3] = { |
1897 | 1901 | |
1898 | 1902 | static void io_mem_init(void) |
1899 | 1903 | { |
1900 | - cpu_register_io_memory(IO_MEM_ROM >> IO_MEM_SHIFT, code_mem_read, unassigned_mem_write); | |
1901 | - cpu_register_io_memory(IO_MEM_UNASSIGNED >> IO_MEM_SHIFT, unassigned_mem_read, unassigned_mem_write); | |
1902 | - cpu_register_io_memory(IO_MEM_CODE >> IO_MEM_SHIFT, code_mem_read, code_mem_write); | |
1903 | - cpu_register_io_memory(IO_MEM_NOTDIRTY >> IO_MEM_SHIFT, code_mem_read, notdirty_mem_write); | |
1904 | + cpu_register_io_memory(IO_MEM_ROM >> IO_MEM_SHIFT, code_mem_read, unassigned_mem_write, NULL); | |
1905 | + cpu_register_io_memory(IO_MEM_UNASSIGNED >> IO_MEM_SHIFT, unassigned_mem_read, unassigned_mem_write, NULL); | |
1906 | + cpu_register_io_memory(IO_MEM_CODE >> IO_MEM_SHIFT, code_mem_read, code_mem_write, NULL); | |
1907 | + cpu_register_io_memory(IO_MEM_NOTDIRTY >> IO_MEM_SHIFT, code_mem_read, notdirty_mem_write, NULL); | |
1904 | 1908 | io_mem_nb = 5; |
1905 | 1909 | |
1906 | 1910 | /* alloc dirty bits array */ |
... | ... | @@ -1915,7 +1919,8 @@ static void io_mem_init(void) |
1915 | 1919 | cpu_register_physical_memory(). (-1) is returned if error. */ |
1916 | 1920 | int cpu_register_io_memory(int io_index, |
1917 | 1921 | CPUReadMemoryFunc **mem_read, |
1918 | - CPUWriteMemoryFunc **mem_write) | |
1922 | + CPUWriteMemoryFunc **mem_write, | |
1923 | + void *opaque) | |
1919 | 1924 | { |
1920 | 1925 | int i; |
1921 | 1926 | |
... | ... | @@ -1932,6 +1937,7 @@ int cpu_register_io_memory(int io_index, |
1932 | 1937 | io_mem_read[io_index][i] = mem_read[i]; |
1933 | 1938 | io_mem_write[io_index][i] = mem_write[i]; |
1934 | 1939 | } |
1940 | + io_mem_opaque[io_index] = opaque; | |
1935 | 1941 | return io_index << IO_MEM_SHIFT; |
1936 | 1942 | } |
1937 | 1943 | |
... | ... | @@ -1994,17 +2000,17 @@ void cpu_physical_memory_rw(target_phys_addr_t addr, uint8_t *buf, |
1994 | 2000 | if (l >= 4 && ((addr & 3) == 0)) { |
1995 | 2001 | /* 32 bit read access */ |
1996 | 2002 | val = ldl_raw(buf); |
1997 | - io_mem_write[io_index][2](addr, val); | |
2003 | + io_mem_write[io_index][2](io_mem_opaque[io_index], addr, val); | |
1998 | 2004 | l = 4; |
1999 | 2005 | } else if (l >= 2 && ((addr & 1) == 0)) { |
2000 | 2006 | /* 16 bit read access */ |
2001 | 2007 | val = lduw_raw(buf); |
2002 | - io_mem_write[io_index][1](addr, val); | |
2008 | + io_mem_write[io_index][1](io_mem_opaque[io_index], addr, val); | |
2003 | 2009 | l = 2; |
2004 | 2010 | } else { |
2005 | 2011 | /* 8 bit access */ |
2006 | 2012 | val = ldub_raw(buf); |
2007 | - io_mem_write[io_index][0](addr, val); | |
2013 | + io_mem_write[io_index][0](io_mem_opaque[io_index], addr, val); | |
2008 | 2014 | l = 1; |
2009 | 2015 | } |
2010 | 2016 | } else { |
... | ... | @@ -2025,17 +2031,17 @@ void cpu_physical_memory_rw(target_phys_addr_t addr, uint8_t *buf, |
2025 | 2031 | io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1); |
2026 | 2032 | if (l >= 4 && ((addr & 3) == 0)) { |
2027 | 2033 | /* 32 bit read access */ |
2028 | - val = io_mem_read[io_index][2](addr); | |
2034 | + val = io_mem_read[io_index][2](io_mem_opaque[io_index], addr); | |
2029 | 2035 | stl_raw(buf, val); |
2030 | 2036 | l = 4; |
2031 | 2037 | } else if (l >= 2 && ((addr & 1) == 0)) { |
2032 | 2038 | /* 16 bit read access */ |
2033 | - val = io_mem_read[io_index][1](addr); | |
2039 | + val = io_mem_read[io_index][1](io_mem_opaque[io_index], addr); | |
2034 | 2040 | stw_raw(buf, val); |
2035 | 2041 | l = 2; |
2036 | 2042 | } else { |
2037 | 2043 | /* 8 bit access */ |
2038 | - val = io_mem_read[io_index][0](addr); | |
2044 | + val = io_mem_read[io_index][0](io_mem_opaque[io_index], addr); | |
2039 | 2045 | stb_raw(buf, val); |
2040 | 2046 | l = 1; |
2041 | 2047 | } | ... | ... |
hw/ppc.c
... | ... | @@ -197,18 +197,18 @@ void cpu_ppc_reset (CPUState *env) |
197 | 197 | } |
198 | 198 | #endif |
199 | 199 | |
200 | -static void PPC_io_writeb (target_phys_addr_t addr, uint32_t value) | |
200 | +static void PPC_io_writeb (void *opaque, target_phys_addr_t addr, uint32_t value) | |
201 | 201 | { |
202 | 202 | cpu_outb(NULL, addr & 0xffff, value); |
203 | 203 | } |
204 | 204 | |
205 | -static uint32_t PPC_io_readb (target_phys_addr_t addr) | |
205 | +static uint32_t PPC_io_readb (void *opaque, target_phys_addr_t addr) | |
206 | 206 | { |
207 | 207 | uint32_t ret = cpu_inb(NULL, addr & 0xffff); |
208 | 208 | return ret; |
209 | 209 | } |
210 | 210 | |
211 | -static void PPC_io_writew (target_phys_addr_t addr, uint32_t value) | |
211 | +static void PPC_io_writew (void *opaque, target_phys_addr_t addr, uint32_t value) | |
212 | 212 | { |
213 | 213 | #ifdef TARGET_WORDS_BIGENDIAN |
214 | 214 | value = bswap16(value); |
... | ... | @@ -216,7 +216,7 @@ static void PPC_io_writew (target_phys_addr_t addr, uint32_t value) |
216 | 216 | cpu_outw(NULL, addr & 0xffff, value); |
217 | 217 | } |
218 | 218 | |
219 | -static uint32_t PPC_io_readw (target_phys_addr_t addr) | |
219 | +static uint32_t PPC_io_readw (void *opaque, target_phys_addr_t addr) | |
220 | 220 | { |
221 | 221 | uint32_t ret = cpu_inw(NULL, addr & 0xffff); |
222 | 222 | #ifdef TARGET_WORDS_BIGENDIAN |
... | ... | @@ -225,7 +225,7 @@ static uint32_t PPC_io_readw (target_phys_addr_t addr) |
225 | 225 | return ret; |
226 | 226 | } |
227 | 227 | |
228 | -static void PPC_io_writel (target_phys_addr_t addr, uint32_t value) | |
228 | +static void PPC_io_writel (void *opaque, target_phys_addr_t addr, uint32_t value) | |
229 | 229 | { |
230 | 230 | #ifdef TARGET_WORDS_BIGENDIAN |
231 | 231 | value = bswap32(value); |
... | ... | @@ -233,7 +233,7 @@ static void PPC_io_writel (target_phys_addr_t addr, uint32_t value) |
233 | 233 | cpu_outl(NULL, addr & 0xffff, value); |
234 | 234 | } |
235 | 235 | |
236 | -static uint32_t PPC_io_readl (target_phys_addr_t addr) | |
236 | +static uint32_t PPC_io_readl (void *opaque, target_phys_addr_t addr) | |
237 | 237 | { |
238 | 238 | uint32_t ret = cpu_inl(NULL, addr & 0xffff); |
239 | 239 | ... | ... |
hw/ppc_chrp.c
... | ... | @@ -64,7 +64,7 @@ void ppc_chrp_init(int ram_size, int vga_ram_size, int boot_device, |
64 | 64 | pci_pmac_init(); |
65 | 65 | |
66 | 66 | /* Register 64 KB of ISA IO space */ |
67 | - PPC_io_memory = cpu_register_io_memory(0, PPC_io_read, PPC_io_write); | |
67 | + PPC_io_memory = cpu_register_io_memory(0, PPC_io_read, PPC_io_write, NULL); | |
68 | 68 | cpu_register_physical_memory(0x80000000, 0x10000, PPC_io_memory); |
69 | 69 | // cpu_register_physical_memory(0xfe000000, 0xfe010000, PPC_io_memory); |
70 | 70 | ... | ... |
hw/ppc_prep.c
... | ... | @@ -98,7 +98,7 @@ static uint32_t speaker_ioport_read(void *opaque, uint32_t addr) |
98 | 98 | |
99 | 99 | /* PCI intack register */ |
100 | 100 | /* Read-only register (?) */ |
101 | -static void _PPC_intack_write (target_phys_addr_t addr, uint32_t value) | |
101 | +static void _PPC_intack_write (void *opaque, target_phys_addr_t addr, uint32_t value) | |
102 | 102 | { |
103 | 103 | // printf("%s: 0x%08x => 0x%08x\n", __func__, addr, value); |
104 | 104 | } |
... | ... | @@ -114,12 +114,12 @@ static inline uint32_t _PPC_intack_read (target_phys_addr_t addr) |
114 | 114 | return retval; |
115 | 115 | } |
116 | 116 | |
117 | -static uint32_t PPC_intack_readb (target_phys_addr_t addr) | |
117 | +static uint32_t PPC_intack_readb (void *opaque, target_phys_addr_t addr) | |
118 | 118 | { |
119 | 119 | return _PPC_intack_read(addr); |
120 | 120 | } |
121 | 121 | |
122 | -static uint32_t PPC_intack_readw (target_phys_addr_t addr) | |
122 | +static uint32_t PPC_intack_readw (void *opaque, target_phys_addr_t addr) | |
123 | 123 | { |
124 | 124 | #ifdef TARGET_WORDS_BIGENDIAN |
125 | 125 | return bswap16(_PPC_intack_read(addr)); |
... | ... | @@ -128,7 +128,7 @@ static uint32_t PPC_intack_readw (target_phys_addr_t addr) |
128 | 128 | #endif |
129 | 129 | } |
130 | 130 | |
131 | -static uint32_t PPC_intack_readl (target_phys_addr_t addr) | |
131 | +static uint32_t PPC_intack_readl (void *opaque, target_phys_addr_t addr) | |
132 | 132 | { |
133 | 133 | #ifdef TARGET_WORDS_BIGENDIAN |
134 | 134 | return bswap32(_PPC_intack_read(addr)); |
... | ... | @@ -177,12 +177,12 @@ static struct { |
177 | 177 | } XCSR; |
178 | 178 | #endif |
179 | 179 | |
180 | -static void PPC_XCSR_writeb (target_phys_addr_t addr, uint32_t value) | |
180 | +static void PPC_XCSR_writeb (void *opaque, target_phys_addr_t addr, uint32_t value) | |
181 | 181 | { |
182 | 182 | printf("%s: 0x%08lx => 0x%08x\n", __func__, (long)addr, value); |
183 | 183 | } |
184 | 184 | |
185 | -static void PPC_XCSR_writew (target_phys_addr_t addr, uint32_t value) | |
185 | +static void PPC_XCSR_writew (void *opaque, target_phys_addr_t addr, uint32_t value) | |
186 | 186 | { |
187 | 187 | #ifdef TARGET_WORDS_BIGENDIAN |
188 | 188 | value = bswap16(value); |
... | ... | @@ -190,7 +190,7 @@ static void PPC_XCSR_writew (target_phys_addr_t addr, uint32_t value) |
190 | 190 | printf("%s: 0x%08lx => 0x%08x\n", __func__, (long)addr, value); |
191 | 191 | } |
192 | 192 | |
193 | -static void PPC_XCSR_writel (target_phys_addr_t addr, uint32_t value) | |
193 | +static void PPC_XCSR_writel (void *opaque, target_phys_addr_t addr, uint32_t value) | |
194 | 194 | { |
195 | 195 | #ifdef TARGET_WORDS_BIGENDIAN |
196 | 196 | value = bswap32(value); |
... | ... | @@ -198,7 +198,7 @@ static void PPC_XCSR_writel (target_phys_addr_t addr, uint32_t value) |
198 | 198 | printf("%s: 0x%08lx => 0x%08x\n", __func__, (long)addr, value); |
199 | 199 | } |
200 | 200 | |
201 | -static uint32_t PPC_XCSR_readb (target_phys_addr_t addr) | |
201 | +static uint32_t PPC_XCSR_readb (void *opaque, target_phys_addr_t addr) | |
202 | 202 | { |
203 | 203 | uint32_t retval = 0; |
204 | 204 | |
... | ... | @@ -207,7 +207,7 @@ static uint32_t PPC_XCSR_readb (target_phys_addr_t addr) |
207 | 207 | return retval; |
208 | 208 | } |
209 | 209 | |
210 | -static uint32_t PPC_XCSR_readw (target_phys_addr_t addr) | |
210 | +static uint32_t PPC_XCSR_readw (void *opaque, target_phys_addr_t addr) | |
211 | 211 | { |
212 | 212 | uint32_t retval = 0; |
213 | 213 | |
... | ... | @@ -219,7 +219,7 @@ static uint32_t PPC_XCSR_readw (target_phys_addr_t addr) |
219 | 219 | return retval; |
220 | 220 | } |
221 | 221 | |
222 | -static uint32_t PPC_XCSR_readl (target_phys_addr_t addr) | |
222 | +static uint32_t PPC_XCSR_readl (void *opaque, target_phys_addr_t addr) | |
223 | 223 | { |
224 | 224 | uint32_t retval = 0; |
225 | 225 | |
... | ... | @@ -480,7 +480,7 @@ void ppc_prep_init(int ram_size, int vga_ram_size, int boot_device, |
480 | 480 | isa_mem_base = 0xc0000000; |
481 | 481 | pci_prep_init(); |
482 | 482 | /* Register 64 KB of ISA IO space */ |
483 | - PPC_io_memory = cpu_register_io_memory(0, PPC_io_read, PPC_io_write); | |
483 | + PPC_io_memory = cpu_register_io_memory(0, PPC_io_read, PPC_io_write, NULL); | |
484 | 484 | cpu_register_physical_memory(0x80000000, 0x00010000, PPC_io_memory); |
485 | 485 | |
486 | 486 | /* init basic PC hardware */ |
... | ... | @@ -525,10 +525,10 @@ void ppc_prep_init(int ram_size, int vga_ram_size, int boot_device, |
525 | 525 | register_ioport_write(0x0800, 0x52, 1, &PREP_io_800_writeb, sysctrl); |
526 | 526 | /* PCI intack location */ |
527 | 527 | PPC_io_memory = cpu_register_io_memory(0, PPC_intack_read, |
528 | - PPC_intack_write); | |
528 | + PPC_intack_write, NULL); | |
529 | 529 | cpu_register_physical_memory(0xBFFFFFF0, 0x4, PPC_io_memory); |
530 | 530 | /* PowerPC control and status register group */ |
531 | - PPC_io_memory = cpu_register_io_memory(0, PPC_XCSR_read, PPC_XCSR_write); | |
531 | + PPC_io_memory = cpu_register_io_memory(0, PPC_XCSR_read, PPC_XCSR_write, NULL); | |
532 | 532 | cpu_register_physical_memory(0xFEFF0000, 0x1000, PPC_io_memory); |
533 | 533 | |
534 | 534 | nvram = m48t59_init(8, 0x0074, NVRAM_SIZE); | ... | ... |
hw/vga.c
... | ... | @@ -656,9 +656,9 @@ static void vbe_ioport_write_data(void *opaque, uint32_t addr, uint32_t val) |
656 | 656 | #endif |
657 | 657 | |
658 | 658 | /* called for accesses between 0xa0000 and 0xc0000 */ |
659 | -static uint32_t vga_mem_readb(target_phys_addr_t addr) | |
659 | +static uint32_t vga_mem_readb(void *opaque, target_phys_addr_t addr) | |
660 | 660 | { |
661 | - VGAState *s = &vga_state; | |
661 | + VGAState *s = opaque; | |
662 | 662 | int memory_map_mode, plane; |
663 | 663 | uint32_t ret; |
664 | 664 | |
... | ... | @@ -712,40 +712,40 @@ static uint32_t vga_mem_readb(target_phys_addr_t addr) |
712 | 712 | return ret; |
713 | 713 | } |
714 | 714 | |
715 | -static uint32_t vga_mem_readw(target_phys_addr_t addr) | |
715 | +static uint32_t vga_mem_readw(void *opaque, target_phys_addr_t addr) | |
716 | 716 | { |
717 | 717 | uint32_t v; |
718 | 718 | #ifdef TARGET_WORDS_BIGENDIAN |
719 | - v = vga_mem_readb(addr) << 8; | |
720 | - v |= vga_mem_readb(addr + 1); | |
719 | + v = vga_mem_readb(opaque, addr) << 8; | |
720 | + v |= vga_mem_readb(opaque, addr + 1); | |
721 | 721 | #else |
722 | - v = vga_mem_readb(addr); | |
723 | - v |= vga_mem_readb(addr + 1) << 8; | |
722 | + v = vga_mem_readb(opaque, addr); | |
723 | + v |= vga_mem_readb(opaque, addr + 1) << 8; | |
724 | 724 | #endif |
725 | 725 | return v; |
726 | 726 | } |
727 | 727 | |
728 | -static uint32_t vga_mem_readl(target_phys_addr_t addr) | |
728 | +static uint32_t vga_mem_readl(void *opaque, target_phys_addr_t addr) | |
729 | 729 | { |
730 | 730 | uint32_t v; |
731 | 731 | #ifdef TARGET_WORDS_BIGENDIAN |
732 | - v = vga_mem_readb(addr) << 24; | |
733 | - v |= vga_mem_readb(addr + 1) << 16; | |
734 | - v |= vga_mem_readb(addr + 2) << 8; | |
735 | - v |= vga_mem_readb(addr + 3); | |
732 | + v = vga_mem_readb(opaque, addr) << 24; | |
733 | + v |= vga_mem_readb(opaque, addr + 1) << 16; | |
734 | + v |= vga_mem_readb(opaque, addr + 2) << 8; | |
735 | + v |= vga_mem_readb(opaque, addr + 3); | |
736 | 736 | #else |
737 | - v = vga_mem_readb(addr); | |
738 | - v |= vga_mem_readb(addr + 1) << 8; | |
739 | - v |= vga_mem_readb(addr + 2) << 16; | |
740 | - v |= vga_mem_readb(addr + 3) << 24; | |
737 | + v = vga_mem_readb(opaque, addr); | |
738 | + v |= vga_mem_readb(opaque, addr + 1) << 8; | |
739 | + v |= vga_mem_readb(opaque, addr + 2) << 16; | |
740 | + v |= vga_mem_readb(opaque, addr + 3) << 24; | |
741 | 741 | #endif |
742 | 742 | return v; |
743 | 743 | } |
744 | 744 | |
745 | 745 | /* called for accesses between 0xa0000 and 0xc0000 */ |
746 | -static void vga_mem_writeb(target_phys_addr_t addr, uint32_t val) | |
746 | +static void vga_mem_writeb(void *opaque, target_phys_addr_t addr, uint32_t val) | |
747 | 747 | { |
748 | - VGAState *s = &vga_state; | |
748 | + VGAState *s = opaque; | |
749 | 749 | int memory_map_mode, plane, write_mode, b, func_select; |
750 | 750 | uint32_t write_mask, bit_mask, set_mask; |
751 | 751 | |
... | ... | @@ -871,29 +871,29 @@ static void vga_mem_writeb(target_phys_addr_t addr, uint32_t val) |
871 | 871 | } |
872 | 872 | } |
873 | 873 | |
874 | -static void vga_mem_writew(target_phys_addr_t addr, uint32_t val) | |
874 | +static void vga_mem_writew(void *opaque, target_phys_addr_t addr, uint32_t val) | |
875 | 875 | { |
876 | 876 | #ifdef TARGET_WORDS_BIGENDIAN |
877 | - vga_mem_writeb(addr, (val >> 8) & 0xff); | |
878 | - vga_mem_writeb(addr + 1, val & 0xff); | |
877 | + vga_mem_writeb(opaque, addr, (val >> 8) & 0xff); | |
878 | + vga_mem_writeb(opaque, addr + 1, val & 0xff); | |
879 | 879 | #else |
880 | - vga_mem_writeb(addr, val & 0xff); | |
881 | - vga_mem_writeb(addr + 1, (val >> 8) & 0xff); | |
880 | + vga_mem_writeb(opaque, addr, val & 0xff); | |
881 | + vga_mem_writeb(opaque, addr + 1, (val >> 8) & 0xff); | |
882 | 882 | #endif |
883 | 883 | } |
884 | 884 | |
885 | -static void vga_mem_writel(target_phys_addr_t addr, uint32_t val) | |
885 | +static void vga_mem_writel(void *opaque, target_phys_addr_t addr, uint32_t val) | |
886 | 886 | { |
887 | 887 | #ifdef TARGET_WORDS_BIGENDIAN |
888 | - vga_mem_writeb(addr, (val >> 24) & 0xff); | |
889 | - vga_mem_writeb(addr + 1, (val >> 16) & 0xff); | |
890 | - vga_mem_writeb(addr + 2, (val >> 8) & 0xff); | |
891 | - vga_mem_writeb(addr + 3, val & 0xff); | |
888 | + vga_mem_writeb(opaque, addr, (val >> 24) & 0xff); | |
889 | + vga_mem_writeb(opaque, addr + 1, (val >> 16) & 0xff); | |
890 | + vga_mem_writeb(opaque, addr + 2, (val >> 8) & 0xff); | |
891 | + vga_mem_writeb(opaque, addr + 3, val & 0xff); | |
892 | 892 | #else |
893 | - vga_mem_writeb(addr, val & 0xff); | |
894 | - vga_mem_writeb(addr + 1, (val >> 8) & 0xff); | |
895 | - vga_mem_writeb(addr + 2, (val >> 16) & 0xff); | |
896 | - vga_mem_writeb(addr + 3, (val >> 24) & 0xff); | |
893 | + vga_mem_writeb(opaque, addr, val & 0xff); | |
894 | + vga_mem_writeb(opaque, addr + 1, (val >> 8) & 0xff); | |
895 | + vga_mem_writeb(opaque, addr + 2, (val >> 16) & 0xff); | |
896 | + vga_mem_writeb(opaque, addr + 3, (val >> 24) & 0xff); | |
897 | 897 | #endif |
898 | 898 | } |
899 | 899 | |
... | ... | @@ -1826,7 +1826,7 @@ int vga_initialize(DisplayState *ds, uint8_t *vga_ram_base, |
1826 | 1826 | #endif |
1827 | 1827 | #endif /* CONFIG_BOCHS_VBE */ |
1828 | 1828 | |
1829 | - vga_io_memory = cpu_register_io_memory(0, vga_mem_read, vga_mem_write); | |
1829 | + vga_io_memory = cpu_register_io_memory(0, vga_mem_read, vga_mem_write, s); | |
1830 | 1830 | cpu_register_physical_memory(isa_mem_base + 0x000a0000, 0x20000, |
1831 | 1831 | vga_io_memory); |
1832 | 1832 | ... | ... |
softmmu_template.h
... | ... | @@ -55,14 +55,14 @@ static inline DATA_TYPE glue(io_read, SUFFIX)(unsigned long physaddr, |
55 | 55 | |
56 | 56 | index = (tlb_addr >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1); |
57 | 57 | #if SHIFT <= 2 |
58 | - res = io_mem_read[index][SHIFT](physaddr); | |
58 | + res = io_mem_read[index][SHIFT](io_mem_opaque[index], physaddr); | |
59 | 59 | #else |
60 | 60 | #ifdef TARGET_WORDS_BIGENDIAN |
61 | - res = (uint64_t)io_mem_read[index][2](physaddr) << 32; | |
62 | - res |= io_mem_read[index][2](physaddr + 4); | |
61 | + res = (uint64_t)io_mem_read[index][2](io_mem_opaque[index], physaddr) << 32; | |
62 | + res |= io_mem_read[index][2](io_mem_opaque[index], physaddr + 4); | |
63 | 63 | #else |
64 | - res = io_mem_read[index][2](physaddr); | |
65 | - res |= (uint64_t)io_mem_read[index][2](physaddr + 4) << 32; | |
64 | + res = io_mem_read[index][2](io_mem_opaque[index], physaddr); | |
65 | + res |= (uint64_t)io_mem_read[index][2](io_mem_opaque[index], physaddr + 4) << 32; | |
66 | 66 | #endif |
67 | 67 | #endif /* SHIFT > 2 */ |
68 | 68 | return res; |
... | ... | @@ -79,14 +79,14 @@ static inline void glue(io_write, SUFFIX)(unsigned long physaddr, |
79 | 79 | env->mem_write_vaddr = tlb_addr; |
80 | 80 | env->mem_write_pc = (unsigned long)retaddr; |
81 | 81 | #if SHIFT <= 2 |
82 | - io_mem_write[index][SHIFT](physaddr, val); | |
82 | + io_mem_write[index][SHIFT](io_mem_opaque[index], physaddr, val); | |
83 | 83 | #else |
84 | 84 | #ifdef TARGET_WORDS_BIGENDIAN |
85 | - io_mem_write[index][2](physaddr, val >> 32); | |
86 | - io_mem_write[index][2](physaddr + 4, val); | |
85 | + io_mem_write[index][2](io_mem_opaque[index], physaddr, val >> 32); | |
86 | + io_mem_write[index][2](io_mem_opaque[index], physaddr + 4, val); | |
87 | 87 | #else |
88 | - io_mem_write[index][2](physaddr, val); | |
89 | - io_mem_write[index][2](physaddr + 4, val >> 32); | |
88 | + io_mem_write[index][2](io_mem_opaque[index], physaddr, val); | |
89 | + io_mem_write[index][2](io_mem_opaque[index], physaddr + 4, val >> 32); | |
90 | 90 | #endif |
91 | 91 | #endif /* SHIFT > 2 */ |
92 | 92 | } | ... | ... |