Revision 8da3ff18
b/cpu-all.h | ||
---|---|---|
877 | 877 |
typedef void CPUWriteMemoryFunc(void *opaque, target_phys_addr_t addr, uint32_t value); |
878 | 878 |
typedef uint32_t CPUReadMemoryFunc(void *opaque, target_phys_addr_t addr); |
879 | 879 |
|
880 |
void cpu_register_physical_memory(target_phys_addr_t start_addr, |
|
881 |
ram_addr_t size, |
|
882 |
ram_addr_t phys_offset); |
|
880 |
void cpu_register_physical_memory_offset(target_phys_addr_t start_addr, |
|
881 |
ram_addr_t size, |
|
882 |
ram_addr_t phys_offset, |
|
883 |
ram_addr_t region_offset); |
|
884 |
static inline void cpu_register_physical_memory(target_phys_addr_t start_addr, |
|
885 |
ram_addr_t size, |
|
886 |
ram_addr_t phys_offset) |
|
887 |
{ |
|
888 |
cpu_register_physical_memory_offset(start_addr, size, phys_offset, 0); |
|
889 |
} |
|
890 |
|
|
883 | 891 |
ram_addr_t cpu_get_physical_page_desc(target_phys_addr_t addr); |
884 | 892 |
ram_addr_t qemu_ram_alloc(ram_addr_t); |
885 | 893 |
void qemu_ram_free(ram_addr_t addr); |
b/exec.c | ||
---|---|---|
146 | 146 |
typedef struct PhysPageDesc { |
147 | 147 |
/* offset in host memory of the page + io_index in the low bits */ |
148 | 148 |
ram_addr_t phys_offset; |
149 |
ram_addr_t region_offset; |
|
149 | 150 |
} PhysPageDesc; |
150 | 151 |
|
151 | 152 |
#define L2_BITS 10 |
... | ... | |
199 | 200 |
CPUReadMemoryFunc **mem_read[TARGET_PAGE_SIZE][4]; |
200 | 201 |
CPUWriteMemoryFunc **mem_write[TARGET_PAGE_SIZE][4]; |
201 | 202 |
void *opaque[TARGET_PAGE_SIZE][2][4]; |
203 |
ram_addr_t region_offset[TARGET_PAGE_SIZE][2][4]; |
|
202 | 204 |
} subpage_t; |
203 | 205 |
|
204 | 206 |
#ifdef _WIN32 |
... | ... | |
1969 | 1971 |
and avoid full address decoding in every device. |
1970 | 1972 |
We can't use the high bits of pd for this because |
1971 | 1973 |
IO_MEM_ROMD uses these as a ram address. */ |
1972 |
iotlb = (pd & ~TARGET_PAGE_MASK) + paddr; |
|
1974 |
iotlb = (pd & ~TARGET_PAGE_MASK); |
|
1975 |
if (p) { |
|
1976 |
/* FIXME: What if this isn't page aligned? */ |
|
1977 |
iotlb += p->region_offset; |
|
1978 |
} else { |
|
1979 |
iotlb += paddr; |
|
1980 |
} |
|
1973 | 1981 |
} |
1974 | 1982 |
|
1975 | 1983 |
code_address = address; |
... | ... | |
2209 | 2217 |
#endif /* defined(CONFIG_USER_ONLY) */ |
2210 | 2218 |
|
2211 | 2219 |
#if !defined(CONFIG_USER_ONLY) |
2220 |
|
|
2212 | 2221 |
static int subpage_register (subpage_t *mmio, uint32_t start, uint32_t end, |
2213 |
ram_addr_t memory); |
|
2222 |
ram_addr_t memory, ram_addr_t region_offset);
|
|
2214 | 2223 |
static void *subpage_init (target_phys_addr_t base, ram_addr_t *phys, |
2215 |
ram_addr_t orig_memory); |
|
2224 |
ram_addr_t orig_memory, ram_addr_t region_offset);
|
|
2216 | 2225 |
#define CHECK_SUBPAGE(addr, start_addr, start_addr2, end_addr, end_addr2, \ |
2217 | 2226 |
need_subpage) \ |
2218 | 2227 |
do { \ |
... | ... | |
2235 | 2244 |
|
2236 | 2245 |
/* register physical memory. 'size' must be a multiple of the target |
2237 | 2246 |
page size. If (phys_offset & ~TARGET_PAGE_MASK) != 0, then it is an |
2238 |
io memory page */ |
|
2239 |
void cpu_register_physical_memory(target_phys_addr_t start_addr, |
|
2240 |
ram_addr_t size, |
|
2241 |
ram_addr_t phys_offset) |
|
2247 |
io memory page. The address used when calling the IO function is |
|
2248 |
the offset from the start of the region, plus region_offset. Both |
|
2249 |
start_region and regon_offset are rounded down to a page boundary |
|
2250 |
before calculating this offset. This should not be a problem unless |
|
2251 |
the low bits of start_addr and region_offset differ. */ |
|
2252 |
void cpu_register_physical_memory_offset(target_phys_addr_t start_addr, |
|
2253 |
ram_addr_t size, |
|
2254 |
ram_addr_t phys_offset, |
|
2255 |
ram_addr_t region_offset) |
|
2242 | 2256 |
{ |
2243 | 2257 |
target_phys_addr_t addr, end_addr; |
2244 | 2258 |
PhysPageDesc *p; |
... | ... | |
2256 | 2270 |
if (kvm_enabled()) |
2257 | 2271 |
kvm_set_phys_mem(start_addr, size, phys_offset); |
2258 | 2272 |
|
2273 |
region_offset &= TARGET_PAGE_MASK; |
|
2259 | 2274 |
size = (size + TARGET_PAGE_SIZE - 1) & TARGET_PAGE_MASK; |
2260 | 2275 |
end_addr = start_addr + (target_phys_addr_t)size; |
2261 | 2276 |
for(addr = start_addr; addr != end_addr; addr += TARGET_PAGE_SIZE) { |
... | ... | |
2270 | 2285 |
if (need_subpage || phys_offset & IO_MEM_SUBWIDTH) { |
2271 | 2286 |
if (!(orig_memory & IO_MEM_SUBPAGE)) { |
2272 | 2287 |
subpage = subpage_init((addr & TARGET_PAGE_MASK), |
2273 |
&p->phys_offset, orig_memory); |
|
2288 |
&p->phys_offset, orig_memory, |
|
2289 |
p->region_offset); |
|
2274 | 2290 |
} else { |
2275 | 2291 |
subpage = io_mem_opaque[(orig_memory & ~TARGET_PAGE_MASK) |
2276 | 2292 |
>> IO_MEM_SHIFT]; |
2277 | 2293 |
} |
2278 |
subpage_register(subpage, start_addr2, end_addr2, phys_offset); |
|
2294 |
subpage_register(subpage, start_addr2, end_addr2, phys_offset, |
|
2295 |
region_offset); |
|
2296 |
p->region_offset = 0; |
|
2279 | 2297 |
} else { |
2280 | 2298 |
p->phys_offset = phys_offset; |
2281 | 2299 |
if ((phys_offset & ~TARGET_PAGE_MASK) <= IO_MEM_ROM || |
... | ... | |
2285 | 2303 |
} else { |
2286 | 2304 |
p = phys_page_find_alloc(addr >> TARGET_PAGE_BITS, 1); |
2287 | 2305 |
p->phys_offset = phys_offset; |
2306 |
p->region_offset = region_offset; |
|
2288 | 2307 |
if ((phys_offset & ~TARGET_PAGE_MASK) <= IO_MEM_ROM || |
2289 |
(phys_offset & IO_MEM_ROMD)) |
|
2308 |
(phys_offset & IO_MEM_ROMD)) {
|
|
2290 | 2309 |
phys_offset += TARGET_PAGE_SIZE; |
2291 |
else { |
|
2310 |
}else {
|
|
2292 | 2311 |
target_phys_addr_t start_addr2, end_addr2; |
2293 | 2312 |
int need_subpage = 0; |
2294 | 2313 |
|
... | ... | |
2297 | 2316 |
|
2298 | 2317 |
if (need_subpage || phys_offset & IO_MEM_SUBWIDTH) { |
2299 | 2318 |
subpage = subpage_init((addr & TARGET_PAGE_MASK), |
2300 |
&p->phys_offset, IO_MEM_UNASSIGNED); |
|
2319 |
&p->phys_offset, IO_MEM_UNASSIGNED, |
|
2320 |
0); |
|
2301 | 2321 |
subpage_register(subpage, start_addr2, end_addr2, |
2302 |
phys_offset); |
|
2322 |
phys_offset, region_offset); |
|
2323 |
p->region_offset = 0; |
|
2303 | 2324 |
} |
2304 | 2325 |
} |
2305 | 2326 |
} |
2327 |
region_offset += TARGET_PAGE_SIZE; |
|
2306 | 2328 |
} |
2307 | 2329 |
|
2308 | 2330 |
/* since each CPU stores ram addresses in its TLB cache, we must |
... | ... | |
2609 | 2631 |
uint32_t ret; |
2610 | 2632 |
unsigned int idx; |
2611 | 2633 |
|
2612 |
idx = SUBPAGE_IDX(addr - mmio->base);
|
|
2634 |
idx = SUBPAGE_IDX(addr); |
|
2613 | 2635 |
#if defined(DEBUG_SUBPAGE) |
2614 | 2636 |
printf("%s: subpage %p len %d addr " TARGET_FMT_plx " idx %d\n", __func__, |
2615 | 2637 |
mmio, len, addr, idx); |
2616 | 2638 |
#endif |
2617 |
ret = (**mmio->mem_read[idx][len])(mmio->opaque[idx][0][len], addr); |
|
2639 |
ret = (**mmio->mem_read[idx][len])(mmio->opaque[idx][0][len], |
|
2640 |
addr + mmio->region_offset[idx][0][len]); |
|
2618 | 2641 |
|
2619 | 2642 |
return ret; |
2620 | 2643 |
} |
... | ... | |
2624 | 2647 |
{ |
2625 | 2648 |
unsigned int idx; |
2626 | 2649 |
|
2627 |
idx = SUBPAGE_IDX(addr - mmio->base);
|
|
2650 |
idx = SUBPAGE_IDX(addr); |
|
2628 | 2651 |
#if defined(DEBUG_SUBPAGE) |
2629 | 2652 |
printf("%s: subpage %p len %d addr " TARGET_FMT_plx " idx %d value %08x\n", __func__, |
2630 | 2653 |
mmio, len, addr, idx, value); |
2631 | 2654 |
#endif |
2632 |
(**mmio->mem_write[idx][len])(mmio->opaque[idx][1][len], addr, value); |
|
2655 |
(**mmio->mem_write[idx][len])(mmio->opaque[idx][1][len], |
|
2656 |
addr + mmio->region_offset[idx][1][len], |
|
2657 |
value); |
|
2633 | 2658 |
} |
2634 | 2659 |
|
2635 | 2660 |
static uint32_t subpage_readb (void *opaque, target_phys_addr_t addr) |
... | ... | |
2699 | 2724 |
}; |
2700 | 2725 |
|
2701 | 2726 |
static int subpage_register (subpage_t *mmio, uint32_t start, uint32_t end, |
2702 |
ram_addr_t memory) |
|
2727 |
ram_addr_t memory, ram_addr_t region_offset)
|
|
2703 | 2728 |
{ |
2704 | 2729 |
int idx, eidx; |
2705 | 2730 |
unsigned int i; |
... | ... | |
2718 | 2743 |
if (io_mem_read[memory][i]) { |
2719 | 2744 |
mmio->mem_read[idx][i] = &io_mem_read[memory][i]; |
2720 | 2745 |
mmio->opaque[idx][0][i] = io_mem_opaque[memory]; |
2746 |
mmio->region_offset[idx][0][i] = region_offset; |
|
2721 | 2747 |
} |
2722 | 2748 |
if (io_mem_write[memory][i]) { |
2723 | 2749 |
mmio->mem_write[idx][i] = &io_mem_write[memory][i]; |
2724 | 2750 |
mmio->opaque[idx][1][i] = io_mem_opaque[memory]; |
2751 |
mmio->region_offset[idx][1][i] = region_offset; |
|
2725 | 2752 |
} |
2726 | 2753 |
} |
2727 | 2754 |
} |
... | ... | |
2730 | 2757 |
} |
2731 | 2758 |
|
2732 | 2759 |
static void *subpage_init (target_phys_addr_t base, ram_addr_t *phys, |
2733 |
ram_addr_t orig_memory) |
|
2760 |
ram_addr_t orig_memory, ram_addr_t region_offset)
|
|
2734 | 2761 |
{ |
2735 | 2762 |
subpage_t *mmio; |
2736 | 2763 |
int subpage_memory; |
... | ... | |
2744 | 2771 |
mmio, base, TARGET_PAGE_SIZE, subpage_memory); |
2745 | 2772 |
#endif |
2746 | 2773 |
*phys = subpage_memory | IO_MEM_SUBPAGE; |
2747 |
subpage_register(mmio, 0, TARGET_PAGE_SIZE - 1, orig_memory); |
|
2774 |
subpage_register(mmio, 0, TARGET_PAGE_SIZE - 1, orig_memory, |
|
2775 |
region_offset); |
|
2748 | 2776 |
} |
2749 | 2777 |
|
2750 | 2778 |
return mmio; |
... | ... | |
2878 | 2906 |
if (is_write) { |
2879 | 2907 |
if ((pd & ~TARGET_PAGE_MASK) != IO_MEM_RAM) { |
2880 | 2908 |
io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1); |
2909 |
if (p) |
|
2910 |
addr = (addr & ~TARGET_PAGE_MASK) + p->region_offset; |
|
2881 | 2911 |
/* XXX: could force cpu_single_env to NULL to avoid |
2882 | 2912 |
potential bugs */ |
2883 | 2913 |
if (l >= 4 && ((addr & 3) == 0)) { |
... | ... | |
2915 | 2945 |
!(pd & IO_MEM_ROMD)) { |
2916 | 2946 |
/* I/O case */ |
2917 | 2947 |
io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1); |
2948 |
if (p) |
|
2949 |
addr = (addr & ~TARGET_PAGE_MASK) + p->region_offset; |
|
2918 | 2950 |
if (l >= 4 && ((addr & 3) == 0)) { |
2919 | 2951 |
/* 32 bit read access */ |
2920 | 2952 |
val = io_mem_read[io_index][2](io_mem_opaque[io_index], addr); |
... | ... | |
3004 | 3036 |
!(pd & IO_MEM_ROMD)) { |
3005 | 3037 |
/* I/O case */ |
3006 | 3038 |
io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1); |
3039 |
if (p) |
|
3040 |
addr = (addr & ~TARGET_PAGE_MASK) + p->region_offset; |
|
3007 | 3041 |
val = io_mem_read[io_index][2](io_mem_opaque[io_index], addr); |
3008 | 3042 |
} else { |
3009 | 3043 |
/* RAM case */ |
... | ... | |
3034 | 3068 |
!(pd & IO_MEM_ROMD)) { |
3035 | 3069 |
/* I/O case */ |
3036 | 3070 |
io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1); |
3071 |
if (p) |
|
3072 |
addr = (addr & ~TARGET_PAGE_MASK) + p->region_offset; |
|
3037 | 3073 |
#ifdef TARGET_WORDS_BIGENDIAN |
3038 | 3074 |
val = (uint64_t)io_mem_read[io_index][2](io_mem_opaque[io_index], addr) << 32; |
3039 | 3075 |
val |= io_mem_read[io_index][2](io_mem_opaque[io_index], addr + 4); |
... | ... | |
3085 | 3121 |
|
3086 | 3122 |
if ((pd & ~TARGET_PAGE_MASK) != IO_MEM_RAM) { |
3087 | 3123 |
io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1); |
3124 |
if (p) |
|
3125 |
addr = (addr & ~TARGET_PAGE_MASK) + p->region_offset; |
|
3088 | 3126 |
io_mem_write[io_index][2](io_mem_opaque[io_index], addr, val); |
3089 | 3127 |
} else { |
3090 | 3128 |
unsigned long addr1 = (pd & TARGET_PAGE_MASK) + (addr & ~TARGET_PAGE_MASK); |
... | ... | |
3119 | 3157 |
|
3120 | 3158 |
if ((pd & ~TARGET_PAGE_MASK) != IO_MEM_RAM) { |
3121 | 3159 |
io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1); |
3160 |
if (p) |
|
3161 |
addr = (addr & ~TARGET_PAGE_MASK) + p->region_offset; |
|
3122 | 3162 |
#ifdef TARGET_WORDS_BIGENDIAN |
3123 | 3163 |
io_mem_write[io_index][2](io_mem_opaque[io_index], addr, val >> 32); |
3124 | 3164 |
io_mem_write[io_index][2](io_mem_opaque[io_index], addr + 4, val); |
... | ... | |
3150 | 3190 |
|
3151 | 3191 |
if ((pd & ~TARGET_PAGE_MASK) != IO_MEM_RAM) { |
3152 | 3192 |
io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1); |
3193 |
if (p) |
|
3194 |
addr = (addr & ~TARGET_PAGE_MASK) + p->region_offset; |
|
3153 | 3195 |
io_mem_write[io_index][2](io_mem_opaque[io_index], addr, val); |
3154 | 3196 |
} else { |
3155 | 3197 |
unsigned long addr1; |
b/hw/arm_gic.c | ||
---|---|---|
23 | 23 |
#ifdef NVIC |
24 | 24 |
static const uint8_t gic_id[] = |
25 | 25 |
{ 0x00, 0xb0, 0x1b, 0x00, 0x0d, 0xe0, 0x05, 0xb1 }; |
26 |
#define GIC_DIST_OFFSET 0 |
|
27 | 26 |
/* The NVIC has 16 internal vectors. However these are not exposed |
28 | 27 |
through the normal GIC interface. */ |
29 | 28 |
#define GIC_BASE_IRQ 32 |
30 | 29 |
#else |
31 | 30 |
static const uint8_t gic_id[] = |
32 | 31 |
{ 0x90, 0x13, 0x04, 0x00, 0x0d, 0xf0, 0x05, 0xb1 }; |
33 |
#define GIC_DIST_OFFSET 0x1000 |
|
34 | 32 |
#define GIC_BASE_IRQ 0 |
35 | 33 |
#endif |
36 | 34 |
|
... | ... | |
76 | 74 |
|
77 | 75 |
typedef struct gic_state |
78 | 76 |
{ |
79 |
uint32_t base; |
|
80 | 77 |
qemu_irq parent_irq[NCPU]; |
81 | 78 |
int enabled; |
82 | 79 |
int cpu_enabled[NCPU]; |
... | ... | |
252 | 249 |
|
253 | 250 |
cpu = gic_get_current_cpu(); |
254 | 251 |
cm = 1 << cpu; |
255 |
offset -= s->base + GIC_DIST_OFFSET; |
|
256 | 252 |
if (offset < 0x100) { |
257 | 253 |
#ifndef NVIC |
258 | 254 |
if (offset == 0) |
... | ... | |
365 | 361 |
#ifdef NVIC |
366 | 362 |
gic_state *s = (gic_state *)opaque; |
367 | 363 |
uint32_t addr; |
368 |
addr = offset - s->base;
|
|
364 |
addr = offset; |
|
369 | 365 |
if (addr < 0x100 || addr > 0xd00) |
370 | 366 |
return nvic_readl(s->nvic, addr); |
371 | 367 |
#endif |
... | ... | |
383 | 379 |
int cpu; |
384 | 380 |
|
385 | 381 |
cpu = gic_get_current_cpu(); |
386 |
offset -= s->base + GIC_DIST_OFFSET; |
|
387 | 382 |
if (offset < 0x100) { |
388 | 383 |
#ifdef NVIC |
389 | 384 |
goto bad_reg; |
... | ... | |
526 | 521 |
gic_state *s = (gic_state *)opaque; |
527 | 522 |
#ifdef NVIC |
528 | 523 |
uint32_t addr; |
529 |
addr = offset - s->base;
|
|
524 |
addr = offset; |
|
530 | 525 |
if (addr < 0x100 || (addr > 0xd00 && addr != 0xf00)) { |
531 | 526 |
nvic_writel(s->nvic, addr, value); |
532 | 527 |
return; |
533 | 528 |
} |
534 | 529 |
#endif |
535 |
if (offset - s->base == GIC_DIST_OFFSET + 0xf00) {
|
|
530 |
if (offset == 0xf00) {
|
|
536 | 531 |
int cpu; |
537 | 532 |
int irq; |
538 | 533 |
int mask; |
... | ... | |
723 | 718 |
return 0; |
724 | 719 |
} |
725 | 720 |
|
726 |
static gic_state *gic_init(uint32_t base, qemu_irq *parent_irq) |
|
721 |
static gic_state *gic_init(uint32_t dist_base, qemu_irq *parent_irq)
|
|
727 | 722 |
{ |
728 | 723 |
gic_state *s; |
729 | 724 |
int iomemtype; |
... | ... | |
738 | 733 |
} |
739 | 734 |
iomemtype = cpu_register_io_memory(0, gic_dist_readfn, |
740 | 735 |
gic_dist_writefn, s); |
741 |
cpu_register_physical_memory(base + GIC_DIST_OFFSET, 0x00001000,
|
|
736 |
cpu_register_physical_memory(dist_base, 0x00001000,
|
|
742 | 737 |
iomemtype); |
743 |
s->base = base; |
|
744 | 738 |
gic_reset(s); |
745 | 739 |
register_savevm("arm_gic", -1, 1, gic_save, gic_load, s); |
746 | 740 |
return s; |
b/hw/arm_sysctl.c | ||
---|---|---|
14 | 14 |
#define LOCK_VALUE 0xa05f |
15 | 15 |
|
16 | 16 |
typedef struct { |
17 |
uint32_t base; |
|
18 | 17 |
uint32_t sys_id; |
19 | 18 |
uint32_t leds; |
20 | 19 |
uint16_t lockval; |
... | ... | |
29 | 28 |
{ |
30 | 29 |
arm_sysctl_state *s = (arm_sysctl_state *)opaque; |
31 | 30 |
|
32 |
offset -= s->base; |
|
33 | 31 |
switch (offset) { |
34 | 32 |
case 0x00: /* ID */ |
35 | 33 |
return s->sys_id; |
... | ... | |
108 | 106 |
uint32_t val) |
109 | 107 |
{ |
110 | 108 |
arm_sysctl_state *s = (arm_sysctl_state *)opaque; |
111 |
offset -= s->base; |
|
112 | 109 |
|
113 | 110 |
switch (offset) { |
114 | 111 |
case 0x08: /* LED */ |
... | ... | |
199 | 196 |
s = (arm_sysctl_state *)qemu_mallocz(sizeof(arm_sysctl_state)); |
200 | 197 |
if (!s) |
201 | 198 |
return; |
202 |
s->base = base; |
|
203 | 199 |
s->sys_id = sys_id; |
204 | 200 |
/* The MPcore bootloader uses these flags to start secondary CPUs. |
205 | 201 |
We don't use a bootloader, so do this here. */ |
b/hw/arm_timer.c | ||
---|---|---|
190 | 190 |
typedef struct { |
191 | 191 |
void *timer[2]; |
192 | 192 |
int level[2]; |
193 |
uint32_t base; |
|
194 | 193 |
qemu_irq irq; |
195 | 194 |
} sp804_state; |
196 | 195 |
|
... | ... | |
208 | 207 |
sp804_state *s = (sp804_state *)opaque; |
209 | 208 |
|
210 | 209 |
/* ??? Don't know the PrimeCell ID for this device. */ |
211 |
offset -= s->base; |
|
212 | 210 |
if (offset < 0x20) { |
213 | 211 |
return arm_timer_read(s->timer[0], offset); |
214 | 212 |
} else { |
... | ... | |
221 | 219 |
{ |
222 | 220 |
sp804_state *s = (sp804_state *)opaque; |
223 | 221 |
|
224 |
offset -= s->base; |
|
225 | 222 |
if (offset < 0x20) { |
226 | 223 |
arm_timer_write(s->timer[0], offset, value); |
227 | 224 |
} else { |
... | ... | |
268 | 265 |
|
269 | 266 |
s = (sp804_state *)qemu_mallocz(sizeof(sp804_state)); |
270 | 267 |
qi = qemu_allocate_irqs(sp804_set_irq, s, 2); |
271 |
s->base = base; |
|
272 | 268 |
s->irq = irq; |
273 | 269 |
/* ??? The timers are actually configurable between 32kHz and 1MHz, but |
274 | 270 |
we don't implement that. */ |
... | ... | |
285 | 281 |
|
286 | 282 |
typedef struct { |
287 | 283 |
void *timer[3]; |
288 |
uint32_t base; |
|
289 | 284 |
} icp_pit_state; |
290 | 285 |
|
291 | 286 |
static uint32_t icp_pit_read(void *opaque, target_phys_addr_t offset) |
... | ... | |
294 | 289 |
int n; |
295 | 290 |
|
296 | 291 |
/* ??? Don't know the PrimeCell ID for this device. */ |
297 |
offset -= s->base; |
|
298 | 292 |
n = offset >> 8; |
299 | 293 |
if (n > 3) |
300 | 294 |
cpu_abort(cpu_single_env, "sp804_read: Bad timer %d\n", n); |
... | ... | |
308 | 302 |
icp_pit_state *s = (icp_pit_state *)opaque; |
309 | 303 |
int n; |
310 | 304 |
|
311 |
offset -= s->base; |
|
312 | 305 |
n = offset >> 8; |
313 | 306 |
if (n > 3) |
314 | 307 |
cpu_abort(cpu_single_env, "sp804_write: Bad timer %d\n", n); |
... | ... | |
335 | 328 |
icp_pit_state *s; |
336 | 329 |
|
337 | 330 |
s = (icp_pit_state *)qemu_mallocz(sizeof(icp_pit_state)); |
338 |
s->base = base; |
|
339 | 331 |
/* Timer 0 runs at the system clock speed (40MHz). */ |
340 | 332 |
s->timer[0] = arm_timer_init(40000000, pic[irq]); |
341 | 333 |
/* The other two timers run at 1MHz. */ |
b/hw/armv7m.c | ||
---|---|---|
14 | 14 |
/* Bitbanded IO. Each word corresponds to a single bit. */ |
15 | 15 |
|
16 | 16 |
/* Get the byte address of the real memory for a bitband acess. */ |
17 |
static inline uint32_t bitband_addr(uint32_t addr) |
|
17 |
static inline uint32_t bitband_addr(void * opaque, uint32_t addr)
|
|
18 | 18 |
{ |
19 | 19 |
uint32_t res; |
20 | 20 |
|
21 |
res = addr & 0xe0000000;
|
|
21 |
res = *(uint32_t *)opaque;
|
|
22 | 22 |
res |= (addr & 0x1ffffff) >> 5; |
23 | 23 |
return res; |
24 | 24 |
|
... | ... | |
27 | 27 |
static uint32_t bitband_readb(void *opaque, target_phys_addr_t offset) |
28 | 28 |
{ |
29 | 29 |
uint8_t v; |
30 |
cpu_physical_memory_read(bitband_addr(offset), &v, 1); |
|
30 |
cpu_physical_memory_read(bitband_addr(opaque, offset), &v, 1);
|
|
31 | 31 |
return (v & (1 << ((offset >> 2) & 7))) != 0; |
32 | 32 |
} |
33 | 33 |
|
... | ... | |
37 | 37 |
uint32_t addr; |
38 | 38 |
uint8_t mask; |
39 | 39 |
uint8_t v; |
40 |
addr = bitband_addr(offset); |
|
40 |
addr = bitband_addr(opaque, offset);
|
|
41 | 41 |
mask = (1 << ((offset >> 2) & 7)); |
42 | 42 |
cpu_physical_memory_read(addr, &v, 1); |
43 | 43 |
if (value & 1) |
... | ... | |
52 | 52 |
uint32_t addr; |
53 | 53 |
uint16_t mask; |
54 | 54 |
uint16_t v; |
55 |
addr = bitband_addr(offset) & ~1; |
|
55 |
addr = bitband_addr(opaque, offset) & ~1;
|
|
56 | 56 |
mask = (1 << ((offset >> 2) & 15)); |
57 | 57 |
mask = tswap16(mask); |
58 | 58 |
cpu_physical_memory_read(addr, (uint8_t *)&v, 2); |
... | ... | |
65 | 65 |
uint32_t addr; |
66 | 66 |
uint16_t mask; |
67 | 67 |
uint16_t v; |
68 |
addr = bitband_addr(offset) & ~1; |
|
68 |
addr = bitband_addr(opaque, offset) & ~1;
|
|
69 | 69 |
mask = (1 << ((offset >> 2) & 15)); |
70 | 70 |
mask = tswap16(mask); |
71 | 71 |
cpu_physical_memory_read(addr, (uint8_t *)&v, 2); |
... | ... | |
81 | 81 |
uint32_t addr; |
82 | 82 |
uint32_t mask; |
83 | 83 |
uint32_t v; |
84 |
addr = bitband_addr(offset) & ~3; |
|
84 |
addr = bitband_addr(opaque, offset) & ~3;
|
|
85 | 85 |
mask = (1 << ((offset >> 2) & 31)); |
86 | 86 |
mask = tswap32(mask); |
87 | 87 |
cpu_physical_memory_read(addr, (uint8_t *)&v, 4); |
... | ... | |
94 | 94 |
uint32_t addr; |
95 | 95 |
uint32_t mask; |
96 | 96 |
uint32_t v; |
97 |
addr = bitband_addr(offset) & ~3; |
|
97 |
addr = bitband_addr(opaque, offset) & ~3;
|
|
98 | 98 |
mask = (1 << ((offset >> 2) & 31)); |
99 | 99 |
mask = tswap32(mask); |
100 | 100 |
cpu_physical_memory_read(addr, (uint8_t *)&v, 4); |
... | ... | |
120 | 120 |
static void armv7m_bitband_init(void) |
121 | 121 |
{ |
122 | 122 |
int iomemtype; |
123 |
static uint32_t bitband1_offset = 0x20000000; |
|
124 |
static uint32_t bitband2_offset = 0x40000000; |
|
123 | 125 |
|
124 | 126 |
iomemtype = cpu_register_io_memory(0, bitband_readfn, bitband_writefn, |
125 |
NULL);
|
|
127 |
&bitband1_offset);
|
|
126 | 128 |
cpu_register_physical_memory(0x22000000, 0x02000000, iomemtype); |
129 |
iomemtype = cpu_register_io_memory(0, bitband_readfn, bitband_writefn, |
|
130 |
&bitband2_offset); |
|
127 | 131 |
cpu_register_physical_memory(0x42000000, 0x02000000, iomemtype); |
128 | 132 |
} |
129 | 133 |
|
b/hw/ds1225y.c | ||
---|---|---|
30 | 30 |
|
31 | 31 |
typedef struct ds1225y_t |
32 | 32 |
{ |
33 |
target_phys_addr_t mem_base; |
|
34 | 33 |
uint32_t chip_size; |
35 | 34 |
QEMUFile *file; |
36 | 35 |
uint8_t *contents; |
... | ... | |
41 | 40 |
static uint32_t nvram_readb (void *opaque, target_phys_addr_t addr) |
42 | 41 |
{ |
43 | 42 |
ds1225y_t *s = opaque; |
44 |
int64_t pos; |
|
45 | 43 |
uint32_t val; |
46 | 44 |
|
47 |
pos = addr - s->mem_base; |
|
48 |
if (pos >= s->chip_size) |
|
49 |
pos -= s->chip_size; |
|
50 |
|
|
51 |
val = s->contents[pos]; |
|
45 |
val = s->contents[addr]; |
|
52 | 46 |
|
53 | 47 |
#ifdef DEBUG_NVRAM |
54 | 48 |
printf("nvram: read 0x%x at " TARGET_FMT_lx "\n", val, addr); |
... | ... | |
77 | 71 |
static void nvram_writeb (void *opaque, target_phys_addr_t addr, uint32_t val) |
78 | 72 |
{ |
79 | 73 |
ds1225y_t *s = opaque; |
80 |
int64_t pos; |
|
81 | 74 |
|
82 | 75 |
#ifdef DEBUG_NVRAM |
83 | 76 |
printf("nvram: write 0x%x at " TARGET_FMT_lx "\n", val, addr); |
84 | 77 |
#endif |
85 | 78 |
|
86 |
pos = addr - s->mem_base; |
|
87 |
s->contents[pos] = val & 0xff; |
|
79 |
s->contents[addr] = val & 0xff; |
|
88 | 80 |
if (s->file) { |
89 |
qemu_fseek(s->file, pos, SEEK_SET);
|
|
81 |
qemu_fseek(s->file, addr, SEEK_SET);
|
|
90 | 82 |
qemu_put_byte(s->file, (int)val); |
91 | 83 |
qemu_fflush(s->file); |
92 | 84 |
} |
... | ... | |
117 | 109 |
return; |
118 | 110 |
} |
119 | 111 |
|
120 |
nvram_writeb(opaque, addr - s->chip_size, val);
|
|
112 |
nvram_writeb(opaque, addr, val); |
|
121 | 113 |
} |
122 | 114 |
|
123 | 115 |
static void nvram_writew_protected (void *opaque, target_phys_addr_t addr, uint32_t val) |
... | ... | |
167 | 159 |
if (!s->contents) { |
168 | 160 |
return NULL; |
169 | 161 |
} |
170 |
s->mem_base = mem_base; |
|
171 | 162 |
s->protection = 7; |
172 | 163 |
|
173 | 164 |
/* Read current file */ |
b/hw/e1000.c | ||
---|---|---|
76 | 76 |
PCIDevice dev; |
77 | 77 |
VLANClientState *vc; |
78 | 78 |
NICInfo *nd; |
79 |
uint32_t mmio_base; |
|
80 | 79 |
int mmio_index; |
81 | 80 |
|
82 | 81 |
uint32_t mac_reg[0x8000]; |
... | ... | |
786 | 785 |
e1000_mmio_writel(void *opaque, target_phys_addr_t addr, uint32_t val) |
787 | 786 |
{ |
788 | 787 |
E1000State *s = opaque; |
789 |
unsigned int index = ((addr - s->mmio_base) & 0x1ffff) >> 2;
|
|
788 |
unsigned int index = (addr & 0x1ffff) >> 2;
|
|
790 | 789 |
|
791 | 790 |
#ifdef TARGET_WORDS_BIGENDIAN |
792 | 791 |
val = bswap32(val); |
... | ... | |
820 | 819 |
e1000_mmio_readl(void *opaque, target_phys_addr_t addr) |
821 | 820 |
{ |
822 | 821 |
E1000State *s = opaque; |
823 |
unsigned int index = ((addr - s->mmio_base) & 0x1ffff) >> 2;
|
|
822 |
unsigned int index = (addr & 0x1ffff) >> 2;
|
|
824 | 823 |
|
825 | 824 |
if (index < NREADOPS && macreg_readops[index]) |
826 | 825 |
{ |
... | ... | |
870 | 869 |
int i, j; |
871 | 870 |
|
872 | 871 |
pci_device_save(&s->dev, f); |
873 |
qemu_put_be32s(f, &s->mmio_base);
|
|
872 |
qemu_put_be32(f, 0);
|
|
874 | 873 |
qemu_put_be32s(f, &s->rxbuf_size); |
875 | 874 |
qemu_put_be32s(f, &s->rxbuf_min_shift); |
876 | 875 |
qemu_put_be32s(f, &s->eecd_state.val_in); |
... | ... | |
916 | 915 |
return ret; |
917 | 916 |
if (version_id == 1) |
918 | 917 |
qemu_get_sbe32s(f, &i); /* once some unused instance id */ |
919 |
qemu_get_be32s(f, &s->mmio_base);
|
|
918 |
qemu_get_be32(f); /* Ignored. Was mmio_base. */
|
|
920 | 919 |
qemu_get_be32s(f, &s->rxbuf_size); |
921 | 920 |
qemu_get_be32s(f, &s->rxbuf_min_shift); |
922 | 921 |
qemu_get_be32s(f, &s->eecd_state.val_in); |
... | ... | |
1005 | 1004 |
|
1006 | 1005 |
DBGOUT(MMIO, "e1000_mmio_map addr=0x%08x 0x%08x\n", addr, size); |
1007 | 1006 |
|
1008 |
d->mmio_base = addr; |
|
1009 | 1007 |
cpu_register_physical_memory(addr, PNPMMIO_SIZE, d->mmio_index); |
1010 | 1008 |
} |
1011 | 1009 |
|
b/hw/eepro100.c | ||
---|---|---|
1392 | 1392 |
static void pci_mmio_writeb(void *opaque, target_phys_addr_t addr, uint32_t val) |
1393 | 1393 |
{ |
1394 | 1394 |
EEPRO100State *s = opaque; |
1395 |
addr -= s->region[0]; |
|
1396 | 1395 |
//~ logout("addr=%s val=0x%02x\n", regname(addr), val); |
1397 | 1396 |
eepro100_write1(s, addr, val); |
1398 | 1397 |
} |
... | ... | |
1400 | 1399 |
static void pci_mmio_writew(void *opaque, target_phys_addr_t addr, uint32_t val) |
1401 | 1400 |
{ |
1402 | 1401 |
EEPRO100State *s = opaque; |
1403 |
addr -= s->region[0]; |
|
1404 | 1402 |
//~ logout("addr=%s val=0x%02x\n", regname(addr), val); |
1405 | 1403 |
eepro100_write2(s, addr, val); |
1406 | 1404 |
} |
... | ... | |
1408 | 1406 |
static void pci_mmio_writel(void *opaque, target_phys_addr_t addr, uint32_t val) |
1409 | 1407 |
{ |
1410 | 1408 |
EEPRO100State *s = opaque; |
1411 |
addr -= s->region[0]; |
|
1412 | 1409 |
//~ logout("addr=%s val=0x%02x\n", regname(addr), val); |
1413 | 1410 |
eepro100_write4(s, addr, val); |
1414 | 1411 |
} |
... | ... | |
1416 | 1413 |
static uint32_t pci_mmio_readb(void *opaque, target_phys_addr_t addr) |
1417 | 1414 |
{ |
1418 | 1415 |
EEPRO100State *s = opaque; |
1419 |
addr -= s->region[0]; |
|
1420 | 1416 |
//~ logout("addr=%s\n", regname(addr)); |
1421 | 1417 |
return eepro100_read1(s, addr); |
1422 | 1418 |
} |
... | ... | |
1424 | 1420 |
static uint32_t pci_mmio_readw(void *opaque, target_phys_addr_t addr) |
1425 | 1421 |
{ |
1426 | 1422 |
EEPRO100State *s = opaque; |
1427 |
addr -= s->region[0]; |
|
1428 | 1423 |
//~ logout("addr=%s\n", regname(addr)); |
1429 | 1424 |
return eepro100_read2(s, addr); |
1430 | 1425 |
} |
... | ... | |
1432 | 1427 |
static uint32_t pci_mmio_readl(void *opaque, target_phys_addr_t addr) |
1433 | 1428 |
{ |
1434 | 1429 |
EEPRO100State *s = opaque; |
1435 |
addr -= s->region[0]; |
|
1436 | 1430 |
//~ logout("addr=%s\n", regname(addr)); |
1437 | 1431 |
return eepro100_read4(s, addr); |
1438 | 1432 |
} |
b/hw/etraxfs_dma.c | ||
---|---|---|
188 | 188 |
struct fs_dma_ctrl |
189 | 189 |
{ |
190 | 190 |
CPUState *env; |
191 |
target_phys_addr_t base; |
|
192 | 191 |
|
193 | 192 |
int nr_channels; |
194 | 193 |
struct fs_dma_channel *channels; |
... | ... | |
212 | 211 |
&& ctrl->channels[c].client; |
213 | 212 |
} |
214 | 213 |
|
215 |
static inline int fs_channel(target_phys_addr_t base, target_phys_addr_t addr)
|
|
214 |
static inline int fs_channel(target_phys_addr_t addr) |
|
216 | 215 |
{ |
217 | 216 |
/* Every channel has a 0x2000 ctrl register map. */ |
218 |
return (addr - base) >> 13;
|
|
217 |
return addr >> 13;
|
|
219 | 218 |
} |
220 | 219 |
|
221 | 220 |
#ifdef USE_THIS_DEAD_CODE |
... | ... | |
572 | 571 |
uint32_t r = 0; |
573 | 572 |
|
574 | 573 |
/* Make addr relative to this instances base. */ |
575 |
c = fs_channel(ctrl->base, addr);
|
|
574 |
c = fs_channel(addr); |
|
576 | 575 |
addr &= 0x1fff; |
577 | 576 |
switch (addr) |
578 | 577 |
{ |
... | ... | |
618 | 617 |
int c; |
619 | 618 |
|
620 | 619 |
/* Make addr relative to this instances base. */ |
621 |
c = fs_channel(ctrl->base, addr);
|
|
620 |
c = fs_channel(addr); |
|
622 | 621 |
addr &= 0x1fff; |
623 | 622 |
switch (addr) |
624 | 623 |
{ |
... | ... | |
753 | 752 |
|
754 | 753 |
ctrl->bh = qemu_bh_new(DMA_run, ctrl); |
755 | 754 |
|
756 |
ctrl->base = base; |
|
757 | 755 |
ctrl->env = env; |
758 | 756 |
ctrl->nr_channels = nr_channels; |
759 | 757 |
ctrl->channels = qemu_mallocz(sizeof ctrl->channels[0] * nr_channels); |
... | ... | |
766 | 764 |
dma_read, |
767 | 765 |
dma_write, |
768 | 766 |
ctrl); |
769 |
cpu_register_physical_memory (base + i * 0x2000, |
|
770 |
sizeof ctrl->channels[i].regs,
|
|
771 |
ctrl->channels[i].regmap);
|
|
767 |
cpu_register_physical_memory_offset (base + i * 0x2000,
|
|
768 |
sizeof ctrl->channels[i].regs, ctrl->channels[i].regmap,
|
|
769 |
i * 0x2000);
|
|
772 | 770 |
} |
773 | 771 |
|
774 | 772 |
return ctrl; |
b/hw/etraxfs_eth.c | ||
---|---|---|
314 | 314 |
{ |
315 | 315 |
CPUState *env; |
316 | 316 |
qemu_irq *irq; |
317 |
target_phys_addr_t base; |
|
318 | 317 |
VLANClientState *vc; |
319 | 318 |
int ethregs; |
320 | 319 |
|
... | ... | |
375 | 374 |
struct fs_eth *eth = opaque; |
376 | 375 |
uint32_t r = 0; |
377 | 376 |
|
378 |
/* Make addr relative to this instances base. */ |
|
379 |
addr -= eth->base; |
|
380 | 377 |
switch (addr) { |
381 | 378 |
case R_STAT: |
382 | 379 |
/* Attach an MDIO/PHY abstraction. */ |
... | ... | |
428 | 425 |
{ |
429 | 426 |
struct fs_eth *eth = opaque; |
430 | 427 |
|
431 |
/* Make addr relative to this instances base. */ |
|
432 |
addr -= eth->base; |
|
433 | 428 |
switch (addr) |
434 | 429 |
{ |
435 | 430 |
case RW_MA0_LO: |
... | ... | |
589 | 584 |
dma[1].client.pull = NULL; |
590 | 585 |
|
591 | 586 |
eth->env = env; |
592 |
eth->base = base; |
|
593 | 587 |
eth->irq = irq; |
594 | 588 |
eth->dma_out = dma; |
595 | 589 |
eth->dma_in = dma + 1; |
b/hw/etraxfs_pic.c | ||
---|---|---|
31 | 31 |
struct fs_pic_state_t |
32 | 32 |
{ |
33 | 33 |
CPUState *env; |
34 |
target_phys_addr_t base; |
|
35 | 34 |
|
36 | 35 |
uint32_t rw_mask; |
37 | 36 |
/* Active interrupt lines. */ |
... | ... | |
56 | 55 |
struct fs_pic_state_t *fs = opaque; |
57 | 56 |
uint32_t rval; |
58 | 57 |
|
59 |
/* Transform this to a relative addr. */ |
|
60 |
addr -= fs->base; |
|
61 | 58 |
switch (addr) |
62 | 59 |
{ |
63 | 60 |
case 0x0: |
... | ... | |
99 | 96 |
{ |
100 | 97 |
struct fs_pic_state_t *fs = opaque; |
101 | 98 |
D(printf("%s addr=%x val=%x\n", __func__, addr, value)); |
102 |
/* Transform this to a relative addr. */ |
|
103 |
addr -= fs->base; |
|
104 | 99 |
switch (addr) |
105 | 100 |
{ |
106 | 101 |
case 0x0: |
... | ... | |
233 | 228 |
|
234 | 229 |
intr_vect_regs = cpu_register_io_memory(0, pic_read, pic_write, fs); |
235 | 230 |
cpu_register_physical_memory(base, 0x14, intr_vect_regs); |
236 |
fs->base = base; |
|
237 | 231 |
|
238 | 232 |
return pic; |
239 | 233 |
err: |
b/hw/etraxfs_ser.c | ||
---|---|---|
50 | 50 |
CharDriverState *chr; |
51 | 51 |
qemu_irq *irq; |
52 | 52 |
|
53 |
target_phys_addr_t base; |
|
54 |
|
|
55 | 53 |
int pending_tx; |
56 | 54 |
|
57 | 55 |
/* Control registers. */ |
... | ... | |
240 | 238 |
|
241 | 239 |
s->env = env; |
242 | 240 |
s->irq = irq; |
243 |
s->base = base; |
|
244 |
|
|
245 | 241 |
s->chr = chr; |
246 | 242 |
|
247 | 243 |
/* transmitter begins ready and idle. */ |
b/hw/etraxfs_timer.c | ||
---|---|---|
47 | 47 |
CPUState *env; |
48 | 48 |
qemu_irq *irq; |
49 | 49 |
qemu_irq *nmi; |
50 |
target_phys_addr_t base; |
|
51 | 50 |
|
52 | 51 |
QEMUBH *bh_t0; |
53 | 52 |
QEMUBH *bh_t1; |
... | ... | |
90 | 89 |
struct fs_timer_t *t = opaque; |
91 | 90 |
uint32_t r = 0; |
92 | 91 |
|
93 |
/* Make addr relative to this instances base. */ |
|
94 |
addr -= t->base; |
|
95 | 92 |
switch (addr) { |
96 | 93 |
case R_TMR0_DATA: |
97 | 94 |
break; |
... | ... | |
273 | 270 |
{ |
274 | 271 |
struct fs_timer_t *t = opaque; |
275 | 272 |
|
276 |
/* Make addr relative to this instances base. */ |
|
277 |
addr -= t->base; |
|
278 | 273 |
switch (addr) |
279 | 274 |
{ |
280 | 275 |
case RW_TMR0_DIV: |
... | ... | |
357 | 352 |
t->irq = irqs; |
358 | 353 |
t->nmi = nmi; |
359 | 354 |
t->env = env; |
360 |
t->base = base; |
|
361 | 355 |
|
362 | 356 |
timer_regs = cpu_register_io_memory(0, timer_read, timer_write, t); |
363 | 357 |
cpu_register_physical_memory (base, 0x5c, timer_regs); |
b/hw/g364fb.c | ||
---|---|---|
26 | 26 |
//#define DEBUG_G364 |
27 | 27 |
|
28 | 28 |
typedef struct G364State { |
29 |
target_phys_addr_t vram_base; |
|
30 | 29 |
unsigned int vram_size; |
31 | 30 |
uint8_t *vram_buffer; |
32 | 31 |
uint32_t ctla; |
... | ... | |
300 | 299 |
static uint32_t g364fb_mem_readb(void *opaque, target_phys_addr_t addr) |
301 | 300 |
{ |
302 | 301 |
G364State *s = opaque; |
303 |
target_phys_addr_t relative_addr = addr - s->vram_base; |
|
304 | 302 |
|
305 |
return s->vram_buffer[relative_addr];
|
|
303 |
return s->vram_buffer[addr]; |
|
306 | 304 |
} |
307 | 305 |
|
308 | 306 |
static uint32_t g364fb_mem_readw(void *opaque, target_phys_addr_t addr) |
... | ... | |
326 | 324 |
static void g364fb_mem_writeb(void *opaque, target_phys_addr_t addr, uint32_t val) |
327 | 325 |
{ |
328 | 326 |
G364State *s = opaque; |
329 |
target_phys_addr_t relative_addr = addr - s->vram_base; |
|
330 | 327 |
|
331 |
s->vram_buffer[relative_addr] = val;
|
|
328 |
s->vram_buffer[addr] = val; |
|
332 | 329 |
} |
333 | 330 |
|
334 | 331 |
static void g364fb_mem_writew(void *opaque, target_phys_addr_t addr, uint32_t val) |
... | ... | |
375 | 372 |
g364fb_reset(s); |
376 | 373 |
|
377 | 374 |
s->ds = ds; |
378 |
s->vram_base = vram_base; |
|
379 | 375 |
|
380 | 376 |
s->console = graphic_console_init(ds, g364fb_update_display, |
381 | 377 |
g364fb_invalidate_display, |
382 | 378 |
g364fb_screen_dump, NULL, s); |
383 | 379 |
|
384 | 380 |
io_vram = cpu_register_io_memory(0, g364fb_mem_read, g364fb_mem_write, s); |
385 |
cpu_register_physical_memory(s->vram_base, vram_size, io_vram);
|
|
381 |
cpu_register_physical_memory(vram_base, vram_size, io_vram); |
|
386 | 382 |
|
387 | 383 |
io_ctrl = cpu_register_io_memory(0, g364fb_ctrl_read, g364fb_ctrl_write, s); |
388 | 384 |
cpu_register_physical_memory(ctrl_base, 0x10000, io_ctrl); |
b/hw/integratorcp.c | ||
---|---|---|
38 | 38 |
static uint32_t integratorcm_read(void *opaque, target_phys_addr_t offset) |
39 | 39 |
{ |
40 | 40 |
integratorcm_state *s = (integratorcm_state *)opaque; |
41 |
offset -= 0x10000000; |
|
42 | 41 |
if (offset >= 0x100 && offset < 0x200) { |
43 | 42 |
/* CM_SPD */ |
44 | 43 |
if (offset >= 0x180) |
... | ... | |
141 | 140 |
uint32_t value) |
142 | 141 |
{ |
143 | 142 |
integratorcm_state *s = (integratorcm_state *)opaque; |
144 |
offset -= 0x10000000; |
|
145 | 143 |
switch (offset >> 2) { |
146 | 144 |
case 2: /* CM_OSC */ |
147 | 145 |
if (s->cm_lock == 0xa05f) |
... | ... | |
268 | 266 |
|
269 | 267 |
typedef struct icp_pic_state |
270 | 268 |
{ |
271 |
uint32_t base; |
|
272 | 269 |
uint32_t level; |
273 | 270 |
uint32_t irq_enabled; |
274 | 271 |
uint32_t fiq_enabled; |
... | ... | |
300 | 297 |
{ |
301 | 298 |
icp_pic_state *s = (icp_pic_state *)opaque; |
302 | 299 |
|
303 |
offset -= s->base; |
|
304 | 300 |
switch (offset >> 2) { |
305 | 301 |
case 0: /* IRQ_STATUS */ |
306 | 302 |
return s->level & s->irq_enabled; |
... | ... | |
329 | 325 |
uint32_t value) |
330 | 326 |
{ |
331 | 327 |
icp_pic_state *s = (icp_pic_state *)opaque; |
332 |
offset -= s->base; |
|
333 | 328 |
|
334 | 329 |
switch (offset >> 2) { |
335 | 330 |
case 2: /* IRQ_ENABLESET */ |
... | ... | |
386 | 381 |
if (!s) |
387 | 382 |
return NULL; |
388 | 383 |
qi = qemu_allocate_irqs(icp_pic_set_irq, s, 32); |
389 |
s->base = base; |
|
390 | 384 |
s->parent_irq = parent_irq; |
391 | 385 |
s->parent_fiq = parent_fiq; |
392 | 386 |
iomemtype = cpu_register_io_memory(0, icp_pic_readfn, |
... | ... | |
397 | 391 |
} |
398 | 392 |
|
399 | 393 |
/* CP control registers. */ |
400 |
typedef struct { |
|
401 |
uint32_t base; |
|
402 |
} icp_control_state; |
|
403 |
|
|
404 | 394 |
static uint32_t icp_control_read(void *opaque, target_phys_addr_t offset) |
405 | 395 |
{ |
406 |
icp_control_state *s = (icp_control_state *)opaque; |
|
407 |
offset -= s->base; |
|
408 | 396 |
switch (offset >> 2) { |
409 | 397 |
case 0: /* CP_IDFIELD */ |
410 | 398 |
return 0x41034003; |
... | ... | |
424 | 412 |
static void icp_control_write(void *opaque, target_phys_addr_t offset, |
425 | 413 |
uint32_t value) |
426 | 414 |
{ |
427 |
icp_control_state *s = (icp_control_state *)opaque; |
|
428 |
offset -= s->base; |
|
429 | 415 |
switch (offset >> 2) { |
430 | 416 |
case 1: /* CP_FLASHPROG */ |
431 | 417 |
case 2: /* CP_INTREG */ |
... | ... | |
452 | 438 |
static void icp_control_init(uint32_t base) |
453 | 439 |
{ |
454 | 440 |
int iomemtype; |
455 |
icp_control_state *s; |
|
456 | 441 |
|
457 |
s = (icp_control_state *)qemu_mallocz(sizeof(icp_control_state)); |
|
458 | 442 |
iomemtype = cpu_register_io_memory(0, icp_control_readfn, |
459 |
icp_control_writefn, s);
|
|
443 |
icp_control_writefn, NULL);
|
|
460 | 444 |
cpu_register_physical_memory(base, 0x00800000, iomemtype); |
461 |
s->base = base; |
|
462 | 445 |
/* ??? Save/restore. */ |
463 | 446 |
} |
464 | 447 |
|
b/hw/iommu.c | ||
---|---|---|
114 | 114 |
#define PAGE_MASK (PAGE_SIZE - 1) |
115 | 115 |
|
116 | 116 |
typedef struct IOMMUState { |
117 |
target_phys_addr_t addr; |
|
118 | 117 |
uint32_t regs[IOMMU_NREGS]; |
119 | 118 |
target_phys_addr_t iostart; |
120 | 119 |
uint32_t version; |
... | ... | |
127 | 126 |
target_phys_addr_t saddr; |
128 | 127 |
uint32_t ret; |
129 | 128 |
|
130 |
saddr = (addr - s->addr) >> 2;
|
|
129 |
saddr = addr >> 2;
|
|
131 | 130 |
switch (saddr) { |
132 | 131 |
default: |
133 | 132 |
ret = s->regs[saddr]; |
... | ... | |
148 | 147 |
IOMMUState *s = opaque; |
149 | 148 |
target_phys_addr_t saddr; |
150 | 149 |
|
151 |
saddr = (addr - s->addr) >> 2;
|
|
150 |
saddr = addr >> 2;
|
|
152 | 151 |
DPRINTF("write reg[%d] = %x\n", (int)saddr, val); |
153 | 152 |
switch (saddr) { |
154 | 153 |
case IOMMU_CTRL: |
... | ... | |
358 | 357 |
if (!s) |
359 | 358 |
return NULL; |
360 | 359 |
|
361 |
s->addr = addr; |
|
362 | 360 |
s->version = version; |
363 | 361 |
s->irq = irq; |
364 | 362 |
|
b/hw/jazz_led.c | ||
---|---|---|
34 | 34 |
} screen_state_t; |
35 | 35 |
|
36 | 36 |
typedef struct LedState { |
37 |
target_phys_addr_t base; |
|
38 | 37 |
uint8_t segments; |
39 | 38 |
DisplayState *ds; |
40 | 39 |
QEMUConsole *console; |
... | ... | |
44 | 43 |
static uint32_t led_readb(void *opaque, target_phys_addr_t addr) |
45 | 44 |
{ |
46 | 45 |
LedState *s = opaque; |
47 |
int relative_addr = addr - s->base; |
|
48 | 46 |
uint32_t val; |
49 | 47 |
|
50 |
switch (relative_addr) {
|
|
48 |
switch (addr) { |
|
51 | 49 |
case 0: |
52 | 50 |
val = s->segments; |
53 | 51 |
break; |
... | ... | |
94 | 92 |
static void led_writeb(void *opaque, target_phys_addr_t addr, uint32_t val) |
95 | 93 |
{ |
96 | 94 |
LedState *s = opaque; |
97 |
int relative_addr = addr - s->base; |
|
98 | 95 |
|
99 |
switch (relative_addr) {
|
|
96 |
switch (addr) { |
|
100 | 97 |
case 0: |
101 | 98 |
s->segments = val; |
102 | 99 |
s->state |= REDRAW_SEGMENTS; |
... | ... | |
311 | 308 |
if (!s) |
312 | 309 |
return; |
313 | 310 |
|
314 |
s->base = base; |
|
315 | 311 |
s->ds = ds; |
316 | 312 |
s->state = REDRAW_SEGMENTS | REDRAW_BACKGROUND; |
317 | 313 |
|
318 | 314 |
io = cpu_register_io_memory(0, led_read, led_write, s); |
319 |
cpu_register_physical_memory(s->base, 1, io);
|
|
315 |
cpu_register_physical_memory(base, 1, io); |
|
320 | 316 |
|
321 | 317 |
s->console = graphic_console_init(ds, jazz_led_update_display, |
322 | 318 |
jazz_led_invalidate_display, |
b/hw/m48t59.c | ||
---|---|---|
46 | 46 |
/* Hardware parameters */ |
47 | 47 |
qemu_irq IRQ; |
48 | 48 |
int mem_index; |
49 |
target_phys_addr_t mem_base; |
|
50 | 49 |
uint32_t io_base; |
51 | 50 |
uint16_t size; |
52 | 51 |
/* RTC management */ |
... | ... | |
514 | 513 |
{ |
515 | 514 |
m48t59_t *NVRAM = opaque; |
516 | 515 |
|
517 |
addr -= NVRAM->mem_base; |
|
518 | 516 |
m48t59_write(NVRAM, addr, value & 0xff); |
519 | 517 |
} |
520 | 518 |
|
... | ... | |
522 | 520 |
{ |
523 | 521 |
m48t59_t *NVRAM = opaque; |
524 | 522 |
|
525 |
addr -= NVRAM->mem_base; |
|
526 | 523 |
m48t59_write(NVRAM, addr, (value >> 8) & 0xff); |
527 | 524 |
m48t59_write(NVRAM, addr + 1, value & 0xff); |
528 | 525 |
} |
... | ... | |
531 | 528 |
{ |
532 | 529 |
m48t59_t *NVRAM = opaque; |
533 | 530 |
|
534 |
addr -= NVRAM->mem_base; |
|
535 | 531 |
m48t59_write(NVRAM, addr, (value >> 24) & 0xff); |
536 | 532 |
m48t59_write(NVRAM, addr + 1, (value >> 16) & 0xff); |
537 | 533 |
m48t59_write(NVRAM, addr + 2, (value >> 8) & 0xff); |
... | ... | |
543 | 539 |
m48t59_t *NVRAM = opaque; |
544 | 540 |
uint32_t retval; |
545 | 541 |
|
546 |
addr -= NVRAM->mem_base; |
|
547 | 542 |
retval = m48t59_read(NVRAM, addr); |
548 | 543 |
return retval; |
549 | 544 |
} |
... | ... | |
553 | 548 |
m48t59_t *NVRAM = opaque; |
554 | 549 |
uint32_t retval; |
555 | 550 |
|
556 |
addr -= NVRAM->mem_base; |
|
557 | 551 |
retval = m48t59_read(NVRAM, addr) << 8; |
558 | 552 |
retval |= m48t59_read(NVRAM, addr + 1); |
559 | 553 |
return retval; |
... | ... | |
564 | 558 |
m48t59_t *NVRAM = opaque; |
565 | 559 |
uint32_t retval; |
566 | 560 |
|
567 |
addr -= NVRAM->mem_base; |
|
568 | 561 |
retval = m48t59_read(NVRAM, addr) << 24; |
569 | 562 |
retval |= m48t59_read(NVRAM, addr + 1) << 16; |
570 | 563 |
retval |= m48t59_read(NVRAM, addr + 2) << 8; |
... | ... | |
636 | 629 |
} |
637 | 630 |
s->IRQ = IRQ; |
638 | 631 |
s->size = size; |
639 |
s->mem_base = mem_base; |
|
640 | 632 |
s->io_base = io_base; |
641 | 633 |
s->addr = 0; |
642 | 634 |
s->type = type; |
b/hw/mac_nvram.c | ||
---|---|---|
26 | 26 |
#include "ppc_mac.h" |
27 | 27 |
|
28 | 28 |
struct MacIONVRAMState { |
29 |
target_phys_addr_t mem_base; |
|
30 | 29 |
target_phys_addr_t size; |
31 | 30 |
int mem_index; |
32 | 31 |
uint8_t data[0x2000]; |
... | ... | |
62 | 61 |
{ |
63 | 62 |
MacIONVRAMState *s = opaque; |
64 | 63 |
|
65 |
addr -= s->mem_base; |
|
66 | 64 |
addr = (addr >> 4) & 0x1fff; |
67 | 65 |
s->data[addr] = value; |
68 | 66 |
// printf("macio_nvram_writeb %04x = %02x\n", addr, value); |
... | ... | |
73 | 71 |
MacIONVRAMState *s = opaque; |
74 | 72 |
uint32_t value; |
75 | 73 |
|
76 |
addr -= s->mem_base; |
|
77 | 74 |
addr = (addr >> 4) & 0x1fff; |
78 | 75 |
value = s->data[addr]; |
79 | 76 |
// printf("macio_nvram_readb %04x = %02x\n", addr, value); |
... | ... | |
112 | 109 |
MacIONVRAMState *s; |
113 | 110 |
|
114 | 111 |
s = opaque; |
115 |
s->mem_base = mem_base; |
|
116 | 112 |
cpu_register_physical_memory(mem_base, s->size, s->mem_index); |
117 | 113 |
} |
118 | 114 |
|
b/hw/mc146818rtc.c | ||
---|---|---|
59 | 59 |
uint8_t cmos_index; |
60 | 60 |
struct tm current_tm; |
61 | 61 |
qemu_irq irq; |
62 |
target_phys_addr_t base; |
|
63 | 62 |
int it_shift; |
64 | 63 |
/* periodic timer */ |
65 | 64 |
QEMUTimer *periodic_timer; |
... | ... | |
492 | 491 |
{ |
493 | 492 |
RTCState *s = opaque; |
494 | 493 |
|
495 |
return cmos_ioport_read(s, (addr - s->base) >> s->it_shift) & 0xFF;
|
|
494 |
return cmos_ioport_read(s, addr >> s->it_shift) & 0xFF;
|
|
496 | 495 |
} |
497 | 496 |
|
498 | 497 |
static void cmos_mm_writeb (void *opaque, |
... | ... | |
500 | 499 |
{ |
501 | 500 |
RTCState *s = opaque; |
502 | 501 |
|
503 |
cmos_ioport_write(s, (addr - s->base) >> s->it_shift, value & 0xFF);
|
|
502 |
cmos_ioport_write(s, addr >> s->it_shift, value & 0xFF);
|
|
504 | 503 |
} |
505 | 504 |
|
506 | 505 |
static uint32_t cmos_mm_readw (void *opaque, target_phys_addr_t addr) |
... | ... | |
508 | 507 |
RTCState *s = opaque; |
509 | 508 |
uint32_t val; |
510 | 509 |
|
511 |
val = cmos_ioport_read(s, (addr - s->base) >> s->it_shift) & 0xFFFF;
|
|
510 |
val = cmos_ioport_read(s, addr >> s->it_shift) & 0xFFFF;
|
|
512 | 511 |
#ifdef TARGET_WORDS_BIGENDIAN |
513 | 512 |
val = bswap16(val); |
514 | 513 |
#endif |
... | ... | |
522 | 521 |
#ifdef TARGET_WORDS_BIGENDIAN |
523 | 522 |
value = bswap16(value); |
524 | 523 |
#endif |
525 |
cmos_ioport_write(s, (addr - s->base) >> s->it_shift, value & 0xFFFF);
|
|
524 |
cmos_ioport_write(s, addr >> s->it_shift, value & 0xFFFF);
|
|
526 | 525 |
} |
527 | 526 |
|
528 | 527 |
static uint32_t cmos_mm_readl (void *opaque, target_phys_addr_t addr) |
... | ... | |
530 | 529 |
RTCState *s = opaque; |
531 | 530 |
uint32_t val; |
532 | 531 |
|
533 |
val = cmos_ioport_read(s, (addr - s->base) >> s->it_shift);
|
|
532 |
val = cmos_ioport_read(s, addr >> s->it_shift);
|
|
534 | 533 |
#ifdef TARGET_WORDS_BIGENDIAN |
535 | 534 |
val = bswap32(val); |
536 | 535 |
#endif |
... | ... | |
544 | 543 |
#ifdef TARGET_WORDS_BIGENDIAN |
545 | 544 |
value = bswap32(value); |
546 | 545 |
#endif |
547 |
cmos_ioport_write(s, (addr - s->base) >> s->it_shift, value);
|
|
546 |
cmos_ioport_write(s, addr >> s->it_shift, value);
|
|
548 | 547 |
} |
549 | 548 |
|
550 | 549 |
static CPUReadMemoryFunc *rtc_mm_read[] = { |
... | ... | |
573 | 572 |
s->cmos_data[RTC_REG_B] = 0x02; |
574 | 573 |
s->cmos_data[RTC_REG_C] = 0x00; |
575 | 574 |
s->cmos_data[RTC_REG_D] = 0x80; |
576 |
s->base = base; |
|
577 | 575 |
|
578 | 576 |
rtc_set_date_from_host(s); |
579 | 577 |
|
b/hw/mcf5208.c | ||
---|---|---|
40 | 40 |
qemu_irq_lower(s->irq); |
41 | 41 |
} |
42 | 42 |
|
43 |
static void m5208_timer_write(m5208_timer_state *s, int offset,
|
|
43 |
static void m5208_timer_write(void *opaque, target_phys_addr_t offset,
|
|
44 | 44 |
uint32_t value) |
45 | 45 |
{ |
46 |
m5208_timer_state *s = (m5208_timer_state *)opaque; |
|
46 | 47 |
int prescale; |
47 | 48 |
int limit; |
48 | 49 |
switch (offset) { |
... | ... | |
88 | 89 |
case 4: |
89 | 90 |
break; |
90 | 91 |
default: |
91 |
/* Should never happen. */ |
|
92 |
abort(); |
|
92 |
cpu_abort(cpu_single_env, "m5208_timer_write: Bad offset 0x%x\n", |
|
93 |
(int)offset); |
|
94 |
break; |
|
93 | 95 |
} |
94 | 96 |
m5208_timer_update(s); |
95 | 97 |
} |
... | ... | |
101 | 103 |
m5208_timer_update(s); |
102 | 104 |
} |
103 | 105 |
|
104 |
typedef struct { |
|
105 |
m5208_timer_state timer[2]; |
|
106 |
} m5208_sys_state; |
|
106 |
static uint32_t m5208_timer_read(void *opaque, target_phys_addr_t addr) |
|
107 |
{ |
|
108 |
m5208_timer_state *s = (m5208_timer_state *)opaque; |
|
109 |
switch (addr) { |
|
110 |
case 0: |
|
111 |
return s->pcsr; |
|
112 |
case 2: |
|
113 |
return s->pmr; |
|
114 |
case 4: |
|
115 |
return ptimer_get_count(s->timer); |
|
116 |
default: |
|
117 |
cpu_abort(cpu_single_env, "m5208_timer_read: Bad offset 0x%x\n", |
|
118 |
(int)addr); |
|
119 |
return 0; |
|
120 |
} |
|
121 |
} |
|
122 |
|
|
123 |
static CPUReadMemoryFunc *m5208_timer_readfn[] = { |
|
124 |
m5208_timer_read, |
|
125 |
m5208_timer_read, |
|
126 |
m5208_timer_read |
|
127 |
}; |
|
128 |
|
|
129 |
static CPUWriteMemoryFunc *m5208_timer_writefn[] = { |
|
130 |
m5208_timer_write, |
|
131 |
m5208_timer_write, |
|
132 |
m5208_timer_write |
|
133 |
}; |
|
107 | 134 |
|
108 | 135 |
static uint32_t m5208_sys_read(void *opaque, target_phys_addr_t addr) |
109 | 136 |
{ |
110 |
m5208_sys_state *s = (m5208_sys_state *)opaque; |
|
111 | 137 |
switch (addr) { |
112 |
/* PIT0 */ |
|
113 |
case 0xfc080000: |
|
114 |
return s->timer[0].pcsr; |
|
115 |
case 0xfc080002: |
|
116 |
return s->timer[0].pmr; |
|
117 |
case 0xfc080004: |
|
118 |
return ptimer_get_count(s->timer[0].timer); |
|
119 |
/* PIT1 */ |
|
120 |
case 0xfc084000: |
|
121 |
return s->timer[1].pcsr; |
|
122 |
case 0xfc084002: |
|
123 |
return s->timer[1].pmr; |
|
124 |
case 0xfc084004: |
|
125 |
return ptimer_get_count(s->timer[1].timer); |
|
126 |
|
|
127 |
/* SDRAM Controller. */ |
|
128 |
case 0xfc0a8110: /* SDCS0 */ |
|
138 |
case 0x110: /* SDCS0 */ |
|
129 | 139 |
{ |
130 | 140 |
int n; |
131 | 141 |
for (n = 0; n < 32; n++) { |
... | ... | |
134 | 144 |
} |
135 | 145 |
return (n - 1) | 0x40000000; |
136 | 146 |
} |
137 |
case 0xfc0a8114: /* SDCS1 */
|
|
147 |
case 0x114: /* SDCS1 */ |
|
138 | 148 |
return 0; |
139 | 149 |
|
140 | 150 |
default: |
... | ... | |
147 | 157 |
static void m5208_sys_write(void *opaque, target_phys_addr_t addr, |
148 | 158 |
uint32_t value) |
149 | 159 |
{ |
150 |
m5208_sys_state *s = (m5208_sys_state *)opaque; |
|
151 |
switch (addr) { |
|
152 |
/* PIT0 */ |
|
153 |
case 0xfc080000: |
|
154 |
case 0xfc080002: |
|
155 |
case 0xfc080004: |
|
156 |
m5208_timer_write(&s->timer[0], addr & 0xf, value); |
|
157 |
return; |
|
158 |
/* PIT1 */ |
|
159 |
case 0xfc084000: |
|
160 |
case 0xfc084002: |
|
161 |
case 0xfc084004: |
|
162 |
m5208_timer_write(&s->timer[1], addr & 0xf, value); |
|
163 |
return; |
|
164 |
default: |
|
165 |
cpu_abort(cpu_single_env, "m5208_sys_write: Bad offset 0x%x\n", |
|
166 |
(int)addr); |
|
167 |
break; |
|
168 |
} |
|
160 |
cpu_abort(cpu_single_env, "m5208_sys_write: Bad offset 0x%x\n", |
|
161 |
(int)addr); |
|
169 | 162 |
} |
170 | 163 |
|
171 | 164 |
static CPUReadMemoryFunc *m5208_sys_readfn[] = { |
... | ... | |
183 | 176 |
static void mcf5208_sys_init(qemu_irq *pic) |
184 | 177 |
{ |
185 | 178 |
int iomemtype; |
186 |
m5208_sys_state *s;
|
|
179 |
m5208_timer_state *s;
|
|
187 | 180 |
QEMUBH *bh; |
188 | 181 |
int i; |
189 | 182 |
|
190 |
s = (m5208_sys_state *)qemu_mallocz(sizeof(m5208_sys_state)); |
|
191 | 183 |
iomemtype = cpu_register_io_memory(0, m5208_sys_readfn, |
192 |
m5208_sys_writefn, s);
|
|
184 |
m5208_sys_writefn, NULL);
|
|
193 | 185 |
/* SDRAMC. */ |
194 | 186 |
cpu_register_physical_memory(0xfc0a8000, 0x00004000, iomemtype); |
195 | 187 |
/* Timers. */ |
196 | 188 |
for (i = 0; i < 2; i++) { |
Also available in: Unified diff