From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:36515) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Qtph0-00059h-Qv for qemu-devel@nongnu.org; Wed, 17 Aug 2011 19:38:39 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Qtpgz-0006tY-NO for qemu-devel@nongnu.org; Wed, 17 Aug 2011 19:38:38 -0400 Received: from mx1.redhat.com ([209.132.183.28]:12204) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Qtpgz-0006tU-FD for qemu-devel@nongnu.org; Wed, 17 Aug 2011 19:38:37 -0400 Message-ID: <4E4C50F6.20208@redhat.com> Date: Wed, 17 Aug 2011 16:38:30 -0700 From: Avi Kivity MIME-Version: 1.0 References: <4da1c5e91e8f61b6c17aa0756006d030013bedd8.1313620857.git.jan.kiszka@web.de> In-Reply-To: <4da1c5e91e8f61b6c17aa0756006d030013bedd8.1313620857.git.jan.kiszka@web.de> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH v2 5/6] vga: Use linear mapping + dirty logging in chain 4 memory access mode List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Jan Kiszka Cc: Anthony Liguori , qemu-devel , Gerd Hoffmann On 08/17/2011 03:41 PM, Jan Kiszka wrote: > From: Jan Kiszka > > Most VGA memory access modes require MMIO handling as they demand weird > logic to get a byte from or into the video RAM. However, there is one > exception: chain 4 mode with all memory planes enabled for writing. This > mode actually allows lineary mapping, which can then be combined with > dirty logging to accelerate KVM. > > This patch accelerates specifically VBE accesses like they are used by > grub in graphical mode. Not only the standard VGA adapter benefits from > this, also vmware and spice in VGA mode. Excellent, this slowness is very annoying. > > +static void vga_update_memory_access(VGACommonState *s) > +{ > + MemoryRegion *region, *old_region = s->chain4_alias; > + target_phys_addr_t base, offset, size; > + > + s->chain4_alias = NULL; > + > + if ((s->sr[0x02]& 0xf) == 0xf&& s->sr[0x04]& 0x08) { > + offset = 0; > + switch ((s->gr[6]>> 2)& 3) { > + case 0: > + base = 0xa0000; > + size = 0x20000; > + break; > + case 1: > + base = 0xa0000; > + size = 0x10000; > + offset = s->bank_offset; > + break; > + case 2: > + base = 0xb0000; > + size = 0x8000; > + break; > + case 3: > + base = 0xb8000; > + size = 0x8000; > + break; > + } > + region = qemu_malloc(sizeof(*region)); > + memory_region_init_alias(region, "vga.chain4",&s->vram, offset, size); > + memory_region_add_subregion_overlap(get_system_memory(), base, > + region, 2); get_system_memory() has been excised from vga in batch 4 of my patches, please adjust. > + s->chain4_alias = region; > + } > + if (old_region) { > + memory_region_del_subregion(get_system_memory(), old_region); > + memory_region_destroy(old_region); > + qemu_free(old_region); > + } > +} > + > The mmio code has s->plane_updated |= mask; /* only used to detect font change */ aren't we losing it? we could easily recover it via dirty logging. -- I have a truly marvellous patch that fixes the bug which this signature is too narrow to contain.