[SeaBIOS] [PATCH 00/11] Relocate init code to high memory
Gleb Natapov
gleb at redhat.com
Mon Sep 20 16:07:12 CEST 2010
On Mon, Sep 20, 2010 at 02:30:10PM +0200, Gleb Natapov wrote:
> On Wed, Sep 15, 2010 at 10:31:36PM -0400, Kevin O'Connor wrote:
> > Unfortunately, both qemu and kvm don't appear to have a reliable way
> > to hard-reboot - normal reboots don't reset the 0xc0000-0xfffff
> > memory. I've worked around this on qemu by manually resetting that
> > memory. However, kvm doesn't keep a pristine copy of the bios at
> > 0xffff0000. Until this is fixed, this patch series will cause a
> > soft-reboot on kvm to result in a shutdown instead of a reboot.
> >
>
> Can you check if with this patch kvm keeps pristine copy of the bios at
> 0xffff0000?
>
> diff --git a/hw/piix_pci.c b/hw/piix_pci.c
> index 933ad86..f224ce7 100644
> --- a/hw/piix_pci.c
> +++ b/hw/piix_pci.c
> @@ -99,10 +99,6 @@ static void i440fx_update_memory_mappings(PCII440FXState *d)
> int i, r;
> uint32_t smram, addr;
>
> - if (kvm_enabled()) {
> - /* FIXME: Support remappings and protection changes. */
> - return;
> - }
> update_pam(d, 0xf0000, 0x100000, (d->dev.config[I440FX_PAM] >> 4) & 3);
> for(i = 0; i < 12; i++) {
> r = (d->dev.config[(i >> 1) + (I440FX_PAM + 1)] >> ((i & 1) * 4)) & 3;
And check with patch below if reset works correctly without your hack of
copying bios from high mem (works only with qemu for now):
diff --git a/hw/piix_pci.c b/hw/piix_pci.c
index 933ad86..0bf435d 100644
--- a/hw/piix_pci.c
+++ b/hw/piix_pci.c
@@ -205,6 +201,20 @@ static int i440fx_pcihost_initfn(SysBusDevice *dev)
return 0;
}
+static void i440fx_reset(void *opaque)
+{
+ PCII440FXState *d = opaque;
+ int i;
+
+ printf("i440fx_reset called\n");
+ /* restor memory mappings */
+ for (i = 0; i < I440FX_PAM_SIZE; i++)
+ d->dev.config[I440FX_PAM] = 0x00;
+ d->dev.config[I440FX_SMRAM] = 0x02;
+ d->smm_enabled = 0;
+ i440fx_update_memory_mappings(d);
+}
+
static int i440fx_initfn(PCIDevice *dev)
{
PCII440FXState *d = DO_UPCAST(PCII440FXState, dev, dev);
@@ -217,6 +227,7 @@ static int i440fx_initfn(PCIDevice *dev)
d->dev.config[I440FX_SMRAM] = 0x02;
cpu_smm_register(&i440fx_set_smm, d);
+ qemu_register_reset(i440fx_reset, d);
return 0;
}
--
Gleb.
More information about the SeaBIOS
mailing list