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:
parent
1dd79a237e
commit
ad37168cbd
@ -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;
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user