[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH] Add optionrom compatible with fw_cfg DMA versio
From: |
Marc Marí |
Subject: |
Re: [Qemu-devel] [PATCH] Add optionrom compatible with fw_cfg DMA version |
Date: |
Fri, 8 Jan 2016 17:05:51 +0100 |
On Fri, 8 Jan 2016 16:54:07 +0100
Paolo Bonzini <address@hidden> wrote:
>
>
> 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?
DS = CS:
" movw %cs, %ax\n"
" movw %ax, %ds\n"
At the beginning of the ROM.
> > +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.
There's no need of course. I was looking at the original ROM and I did
not think this through.
Thanks for your comments
Marc