mirror of https://gitee.com/openkylin/qemu.git
cirrus_vga: adapt to memory mutators API
Simplify the code by avoiding dynamic creation and destruction of memory regions. Signed-off-by: Avi Kivity <avi@redhat.com>
This commit is contained in:
parent
e87c099f1c
commit
7969d9ed5c
|
@ -205,7 +205,7 @@ typedef struct CirrusVGAState {
|
|||
bool linear_vram; /* vga.vram mapped over cirrus_linear_io */
|
||||
MemoryRegion low_mem_container; /* container for 0xa0000-0xc0000 */
|
||||
MemoryRegion low_mem; /* always mapped, overridden by: */
|
||||
MemoryRegion *cirrus_bank[2]; /* aliases at 0xa0000-0xb0000 */
|
||||
MemoryRegion cirrus_bank[2]; /* aliases at 0xa0000-0xb0000 */
|
||||
uint32_t cirrus_addr_mask;
|
||||
uint32_t linear_mmio_mask;
|
||||
uint8_t cirrus_shadow_gr0;
|
||||
|
@ -2363,40 +2363,16 @@ static const MemoryRegionOps cirrus_linear_bitblt_io_ops = {
|
|||
},
|
||||
};
|
||||
|
||||
static void unmap_bank(CirrusVGAState *s, unsigned bank)
|
||||
{
|
||||
if (s->cirrus_bank[bank]) {
|
||||
memory_region_del_subregion(&s->low_mem_container,
|
||||
s->cirrus_bank[bank]);
|
||||
memory_region_destroy(s->cirrus_bank[bank]);
|
||||
g_free(s->cirrus_bank[bank]);
|
||||
s->cirrus_bank[bank] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static void map_linear_vram_bank(CirrusVGAState *s, unsigned bank)
|
||||
{
|
||||
MemoryRegion *mr;
|
||||
static const char *names[] = { "vga.bank0", "vga.bank1" };
|
||||
|
||||
if (!(s->cirrus_srcptr != s->cirrus_srcptr_end)
|
||||
MemoryRegion *mr = &s->cirrus_bank[bank];
|
||||
bool enabled = !(s->cirrus_srcptr != s->cirrus_srcptr_end)
|
||||
&& !((s->vga.sr[0x07] & 0x01) == 0)
|
||||
&& !((s->vga.gr[0x0B] & 0x14) == 0x14)
|
||||
&& !(s->vga.gr[0x0B] & 0x02)) {
|
||||
&& !(s->vga.gr[0x0B] & 0x02);
|
||||
|
||||
mr = g_malloc(sizeof(*mr));
|
||||
memory_region_init_alias(mr, names[bank], &s->vga.vram,
|
||||
s->cirrus_bank_base[bank], 0x8000);
|
||||
memory_region_add_subregion_overlap(
|
||||
&s->low_mem_container,
|
||||
0x8000 * bank,
|
||||
mr,
|
||||
1);
|
||||
unmap_bank(s, bank);
|
||||
s->cirrus_bank[bank] = mr;
|
||||
} else {
|
||||
unmap_bank(s, bank);
|
||||
}
|
||||
memory_region_set_enabled(mr, enabled);
|
||||
memory_region_set_alias_offset(mr, s->cirrus_bank_base[bank]);
|
||||
}
|
||||
|
||||
static void map_linear_vram(CirrusVGAState *s)
|
||||
|
@ -2415,8 +2391,8 @@ static void unmap_linear_vram(CirrusVGAState *s)
|
|||
s->linear_vram = false;
|
||||
memory_region_del_subregion(&s->pci_bar, &s->vga.vram);
|
||||
}
|
||||
unmap_bank(s, 0);
|
||||
unmap_bank(s, 1);
|
||||
memory_region_set_enabled(&s->cirrus_bank[0], false);
|
||||
memory_region_set_enabled(&s->cirrus_bank[1], false);
|
||||
}
|
||||
|
||||
/* Compute the memory access functions */
|
||||
|
@ -2856,6 +2832,14 @@ static void cirrus_init_common(CirrusVGAState * s, int device_id, int is_pci,
|
|||
memory_region_init_io(&s->low_mem, &cirrus_vga_mem_ops, s,
|
||||
"cirrus-low-memory", 0x20000);
|
||||
memory_region_add_subregion(&s->low_mem_container, 0, &s->low_mem);
|
||||
for (i = 0; i < 2; ++i) {
|
||||
static const char *names[] = { "vga.bank0", "vga.bank1" };
|
||||
MemoryRegion *bank = &s->cirrus_bank[i];
|
||||
memory_region_init_alias(bank, names[i], &s->vga.vram, 0, 0x8000);
|
||||
memory_region_set_enabled(bank, false);
|
||||
memory_region_add_subregion_overlap(&s->low_mem_container, i * 0x8000,
|
||||
bank, 1);
|
||||
}
|
||||
memory_region_add_subregion_overlap(system_memory,
|
||||
isa_mem_base + 0x000a0000,
|
||||
&s->low_mem_container,
|
||||
|
|
Loading…
Reference in New Issue