vga: do not dynamically allocate chain4_alias

Instead, add a boolean variable to indicate the presence of the region.
This avoids a repeated malloc/free (later we can also avoid the
add_child/unparent by changing the offset/size of the alias).

Reviewed-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Paolo Bonzini 2014-06-11 12:19:25 +02:00
parent 1dd79a237e
commit ad37168cbd
2 changed files with 12 additions and 15 deletions

View File

@ -168,15 +168,18 @@ static uint8_t expand4to8[16];
static void vga_update_memory_access(VGACommonState *s) static void vga_update_memory_access(VGACommonState *s)
{ {
MemoryRegion *region, *old_region = s->chain4_alias;
hwaddr base, offset, size; hwaddr base, offset, size;
if (s->legacy_address_space == NULL) { if (s->legacy_address_space == NULL) {
return; return;
} }
s->chain4_alias = NULL; if (s->has_chain4_alias) {
memory_region_del_subregion(s->legacy_address_space, &s->chain4_alias);
memory_region_destroy(&s->chain4_alias);
s->has_chain4_alias = false;
s->plane_updated = 0xf;
}
if ((s->sr[VGA_SEQ_PLANE_WRITE] & VGA_SR02_ALL_PLANES) == if ((s->sr[VGA_SEQ_PLANE_WRITE] & VGA_SR02_ALL_PLANES) ==
VGA_SR02_ALL_PLANES && s->sr[VGA_SEQ_MEMORY_MODE] & VGA_SR04_CHN_4M) { VGA_SR02_ALL_PLANES && s->sr[VGA_SEQ_MEMORY_MODE] & VGA_SR04_CHN_4M) {
offset = 0; offset = 0;
@ -201,18 +204,11 @@ static void vga_update_memory_access(VGACommonState *s)
break; break;
} }
base += isa_mem_base; base += isa_mem_base;
region = g_malloc(sizeof(*region)); memory_region_init_alias(&s->chain4_alias, memory_region_owner(&s->vram),
memory_region_init_alias(region, memory_region_owner(&s->vram),
"vga.chain4", &s->vram, offset, size); "vga.chain4", &s->vram, offset, size);
memory_region_add_subregion_overlap(s->legacy_address_space, base, memory_region_add_subregion_overlap(s->legacy_address_space, base,
region, 2); &s->chain4_alias, 2);
s->chain4_alias = region; s->has_chain4_alias = true;
}
if (old_region) {
memory_region_del_subregion(s->legacy_address_space, old_region);
memory_region_destroy(old_region);
g_free(old_region);
s->plane_updated = 0xf;
} }
} }
@ -1321,7 +1317,7 @@ static void vga_draw_text(VGACommonState *s, int full_update)
s->font_offsets[1] = offset; s->font_offsets[1] = offset;
full_update = 1; full_update = 1;
} }
if (s->plane_updated & (1 << 2) || s->chain4_alias) { if (s->plane_updated & (1 << 2) || s->has_chain4_alias) {
/* if the plane 2 was modified since the last display, it /* if the plane 2 was modified since the last display, it
indicates the font may have been modified */ indicates the font may have been modified */
s->plane_updated = 0; s->plane_updated = 0;

View File

@ -94,7 +94,8 @@ typedef struct VGACommonState {
uint32_t vram_size; uint32_t vram_size;
uint32_t vram_size_mb; /* property */ uint32_t vram_size_mb; /* property */
uint32_t latch; uint32_t latch;
MemoryRegion *chain4_alias; bool has_chain4_alias;
MemoryRegion chain4_alias;
uint8_t sr_index; uint8_t sr_index;
uint8_t sr[256]; uint8_t sr[256];
uint8_t gr_index; uint8_t gr_index;