From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:54042) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aHZMl-0000fw-C9 for qemu-devel@nongnu.org; Fri, 08 Jan 2016 10:54:16 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aHZMi-0006bX-1x for qemu-devel@nongnu.org; Fri, 08 Jan 2016 10:54:15 -0500 Received: from mail-wm0-x22c.google.com ([2a00:1450:400c:c09::22c]:33810) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aHZMh-0006bQ-RR for qemu-devel@nongnu.org; Fri, 08 Jan 2016 10:54:11 -0500 Received: by mail-wm0-x22c.google.com with SMTP id u188so142044594wmu.1 for ; Fri, 08 Jan 2016 07:54:11 -0800 (PST) Sender: Paolo Bonzini References: <1452265115-27177-1-git-send-email-markmb@redhat.com> From: Paolo Bonzini Message-ID: <568FDB9F.7080709@redhat.com> Date: Fri, 8 Jan 2016 16:54:07 +0100 MIME-Version: 1.0 In-Reply-To: <1452265115-27177-1-git-send-email-markmb@redhat.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Subject: Re: [Qemu-devel] [PATCH] Add optionrom compatible with fw_cfg DMA version List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: =?UTF-8?Q?Marc_Mar=c3=ad?= , qemu-devel , "Gabriel L. Somlo" , Kevin O'Connor , Laszlo Ersek , Stefan Hajnoczi On 08/01/2016 15:58, Marc MarĂ­ wrote: > > +static inline uint16_t readw_addr32(const void *addr) { > + uint16_t val; > + asm("addr32 movw %1, %0" : "=r"(val) : "g"(addr)); > + barrier(); > + return val; > +} > + Does SeaBIOS ensure that DS base is zero here? > +static void transition32(void) > +{ > + extern void *gdt; > + uint32_t data_segment; > + struct length_addr rombios_gdt; > + > + data_segment = read_ds(); > + rombios_gdt.addr = (uint32_t)((data_segment << 4) + (uint32_t)(&gdt)); > + rombios_gdt.length = (3 * 8) - 1; > + > + /* Load GDT */ > + asm("data32 lgdt %0" : : "m"(rombios_gdt): "memory"); > + > + /* Get us to protected mode and set ES to a 32 bit segment */ > + asm("mov $1, %%eax\n" > + "mov %%eax, %%cr0\n" > + "mov $0x10, %%eax\n" > + "mov %%eax, %%es\n" > + : : : "eax"); > + > + /* We're now running in 16-bit CS, but 32-bit ES! */ > +} Do you even need to go to 32-bit mode? The only reason to do so in the original ROM was to do a "rep insb" above 1 GB, but here fw_cfg can do DMA to high addresses for you. Paolo