Commit 3ee89922578269b37eedfeada17caeb7f74d9f24
1 parent
e3a79bca
Fix dynamically changed memory callbacks and passed opaque parameter
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3884 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
16 additions
and
11 deletions
exec.c
... | ... | @@ -163,9 +163,9 @@ static int tb_phys_invalidate_count; |
163 | 163 | #define SUBPAGE_IDX(addr) ((addr) & ~TARGET_PAGE_MASK) |
164 | 164 | typedef struct subpage_t { |
165 | 165 | target_phys_addr_t base; |
166 | - CPUReadMemoryFunc *mem_read[TARGET_PAGE_SIZE][4]; | |
167 | - CPUWriteMemoryFunc *mem_write[TARGET_PAGE_SIZE][4]; | |
168 | - void *opaque[TARGET_PAGE_SIZE]; | |
166 | + CPUReadMemoryFunc **mem_read[TARGET_PAGE_SIZE][4]; | |
167 | + CPUWriteMemoryFunc **mem_write[TARGET_PAGE_SIZE][4]; | |
168 | + void *opaque[TARGET_PAGE_SIZE][2][4]; | |
169 | 169 | } subpage_t; |
170 | 170 | |
171 | 171 | static void page_init(void) |
... | ... | @@ -2316,7 +2316,7 @@ static inline uint32_t subpage_readlen (subpage_t *mmio, target_phys_addr_t addr |
2316 | 2316 | printf("%s: subpage %p len %d addr " TARGET_FMT_plx " idx %d\n", __func__, |
2317 | 2317 | mmio, len, addr, idx); |
2318 | 2318 | #endif |
2319 | - ret = (*mmio->mem_read[idx][len])(mmio->opaque[idx], addr); | |
2319 | + ret = (**mmio->mem_read[idx][len])(mmio->opaque[idx][0][len], addr); | |
2320 | 2320 | |
2321 | 2321 | return ret; |
2322 | 2322 | } |
... | ... | @@ -2331,7 +2331,7 @@ static inline void subpage_writelen (subpage_t *mmio, target_phys_addr_t addr, |
2331 | 2331 | printf("%s: subpage %p len %d addr " TARGET_FMT_plx " idx %d value %08x\n", __func__, |
2332 | 2332 | mmio, len, addr, idx, value); |
2333 | 2333 | #endif |
2334 | - (*mmio->mem_write[idx][len])(mmio->opaque[idx], addr, value); | |
2334 | + (**mmio->mem_write[idx][len])(mmio->opaque[idx][1][len], addr, value); | |
2335 | 2335 | } |
2336 | 2336 | |
2337 | 2337 | static uint32_t subpage_readb (void *opaque, target_phys_addr_t addr) |
... | ... | @@ -2417,12 +2417,15 @@ static int subpage_register (subpage_t *mmio, uint32_t start, uint32_t end, |
2417 | 2417 | memory >>= IO_MEM_SHIFT; |
2418 | 2418 | for (; idx <= eidx; idx++) { |
2419 | 2419 | for (i = 0; i < 4; i++) { |
2420 | - if (io_mem_read[memory][i]) | |
2421 | - mmio->mem_read[idx][i] = io_mem_read[memory][i]; | |
2422 | - if (io_mem_write[memory][i]) | |
2423 | - mmio->mem_write[idx][i] = io_mem_write[memory][i]; | |
2420 | + if (io_mem_read[memory][i]) { | |
2421 | + mmio->mem_read[idx][i] = &io_mem_read[memory][i]; | |
2422 | + mmio->opaque[idx][0][i] = io_mem_opaque[memory]; | |
2423 | + } | |
2424 | + if (io_mem_write[memory][i]) { | |
2425 | + mmio->mem_write[idx][i] = &io_mem_write[memory][i]; | |
2426 | + mmio->opaque[idx][1][i] = io_mem_opaque[memory]; | |
2427 | + } | |
2424 | 2428 | } |
2425 | - mmio->opaque[idx] = io_mem_opaque[memory]; | |
2426 | 2429 | } |
2427 | 2430 | |
2428 | 2431 | return 0; |
... | ... | @@ -2467,7 +2470,9 @@ static void io_mem_init(void) |
2467 | 2470 | |
2468 | 2471 | /* mem_read and mem_write are arrays of functions containing the |
2469 | 2472 | function to access byte (index 0), word (index 1) and dword (index |
2470 | - 2). If io_index is non zero, the corresponding io zone is | |
2473 | + 2). Functions can be omitted with a NULL function pointer. The | |
2474 | + registered functions may be modified dynamically later. | |
2475 | + If io_index is non zero, the corresponding io zone is | |
2471 | 2476 | modified. If it is zero, a new io zone is allocated. The return |
2472 | 2477 | value can be used with cpu_register_physical_memory(). (-1) is |
2473 | 2478 | returned if error. */ | ... | ... |