diff mbox

[v15,2/2] patch dsdt to use passed-in pvpanic ioport

Message ID 1363856914-23399-2-git-send-email-hutao@cn.fujitsu.com
State New
Headers show

Commit Message

Hu Tao March 21, 2013, 9:08 a.m. UTC
Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
---
 src/acpi-dsdt-isa.dsl | 14 ++++++++++++--
 src/acpi.c            |  9 +++++++++
 2 files changed, 21 insertions(+), 2 deletions(-)

Comments

Paolo Bonzini March 21, 2013, 9:11 a.m. UTC | #1
Il 21/03/2013 10:08, Hu Tao ha scritto:
> Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
> ---
>  src/acpi-dsdt-isa.dsl | 14 ++++++++++++--
>  src/acpi.c            |  9 +++++++++
>  2 files changed, 21 insertions(+), 2 deletions(-)
> 
> diff --git a/src/acpi-dsdt-isa.dsl b/src/acpi-dsdt-isa.dsl
> index 87a31b9..43fe719 100644
> --- a/src/acpi-dsdt-isa.dsl
> +++ b/src/acpi-dsdt-isa.dsl
> @@ -102,7 +102,9 @@ Scope(\_SB.PCI0.ISA) {
>  
>      Device(PEVT) {
>          Name(_HID, "QEMU0001")
> -        OperationRegion(PEOR, SystemIO, 0x0505, 0x01)
> +        ACPI_EXTRACT_NAME_WORD_CONST dsdt_isa_pest
> +        Name(PEST, 0x505)
> +        OperationRegion(PEOR, SystemIO, PEST, 0x01)
>          Field(PEOR, ByteAcc, NoLock, Preserve) {
>              PEPT,   8,
>          }
> @@ -126,7 +128,15 @@ Scope(\_SB.PCI0.ISA) {
>          }
>  
>          Name(_CRS, ResourceTemplate() {
> -            IO(Decode16, 0x0505, 0x0505, 0x01, 0x01)
> +            IO(Decode16, 0x0505, 0x0505, 0x01, 0x01, IO)
>          })
> +
> +        CreateWordField(_CRS, IO._MIN, IOMN)
> +        CreateWordField(_CRS, IO._MAX, IOMX)
> +
> +        Method(_INI, 0, NotSerialized) {
> +            Store(PEST, IOMN)
> +            Store(PEST, IOMX)
> +        }
>      }
>  }
> diff --git a/src/acpi.c b/src/acpi.c
> index 119d1c1..42fa06e 100644
> --- a/src/acpi.c
> +++ b/src/acpi.c
> @@ -286,11 +286,20 @@ static const struct pci_device_id fadt_init_tbl[] = {
>      PCI_DEVICE_END
>  };
>  
> +static void patch_dsdt(void *dsdt)
> +{
> +    u8 *dsdt_ptr = dsdt;
> +    int pvpanic_port = romfile_loadint("etc/pvpanic-port", 0x505);

The default must be 0.

Also, here:


+
+        Method(_STA, 0, NotSerialized) {
+            Store(PEPT, Local0)
+            If (LEqual(Local0, Zero)) {
+                Return (0x00)
+            } Else {
+                Return (0x0F)
+            }
+        }
+

You must change it to look at PEST instead of PEPT (i.e. do not probe,
just see if you have a meaningful address).

Just squash the patches, it's simpler that way probably.

Paolo

> +    *(u16 *)(dsdt_ptr + *dsdt_isa_pest) = pvpanic_port;
> +}
> +
>  static void fill_dsdt(struct fadt_descriptor_rev1 *fadt, void *dsdt)
>  {
>      if (fadt->dsdt) {
>          free((void *)le32_to_cpu(fadt->dsdt));
>      }
> +    patch_dsdt(dsdt);
>      fadt->dsdt = cpu_to_le32((u32)dsdt);
>      fadt->checksum -= checksum(fadt, sizeof(*fadt));
>      dprintf(1, "ACPI DSDT=%p\n", dsdt);
>
Hu Tao March 21, 2013, 9:17 a.m. UTC | #2
On Thu, Mar 21, 2013 at 10:11:54AM +0100, Paolo Bonzini wrote:
> Il 21/03/2013 10:08, Hu Tao ha scritto:
> > Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
> > ---
> >  src/acpi-dsdt-isa.dsl | 14 ++++++++++++--
> >  src/acpi.c            |  9 +++++++++
> >  2 files changed, 21 insertions(+), 2 deletions(-)
> > 
> > diff --git a/src/acpi-dsdt-isa.dsl b/src/acpi-dsdt-isa.dsl
> > index 87a31b9..43fe719 100644
> > --- a/src/acpi-dsdt-isa.dsl
> > +++ b/src/acpi-dsdt-isa.dsl
> > @@ -102,7 +102,9 @@ Scope(\_SB.PCI0.ISA) {
> >  
> >      Device(PEVT) {
> >          Name(_HID, "QEMU0001")
> > -        OperationRegion(PEOR, SystemIO, 0x0505, 0x01)
> > +        ACPI_EXTRACT_NAME_WORD_CONST dsdt_isa_pest
> > +        Name(PEST, 0x505)
> > +        OperationRegion(PEOR, SystemIO, PEST, 0x01)
> >          Field(PEOR, ByteAcc, NoLock, Preserve) {
> >              PEPT,   8,
> >          }
> > @@ -126,7 +128,15 @@ Scope(\_SB.PCI0.ISA) {
> >          }
> >  
> >          Name(_CRS, ResourceTemplate() {
> > -            IO(Decode16, 0x0505, 0x0505, 0x01, 0x01)
> > +            IO(Decode16, 0x0505, 0x0505, 0x01, 0x01, IO)
> >          })
> > +
> > +        CreateWordField(_CRS, IO._MIN, IOMN)
> > +        CreateWordField(_CRS, IO._MAX, IOMX)
> > +
> > +        Method(_INI, 0, NotSerialized) {
> > +            Store(PEST, IOMN)
> > +            Store(PEST, IOMX)
> > +        }
> >      }
> >  }
> > diff --git a/src/acpi.c b/src/acpi.c
> > index 119d1c1..42fa06e 100644
> > --- a/src/acpi.c
> > +++ b/src/acpi.c
> > @@ -286,11 +286,20 @@ static const struct pci_device_id fadt_init_tbl[] = {
> >      PCI_DEVICE_END
> >  };
> >  
> > +static void patch_dsdt(void *dsdt)
> > +{
> > +    u8 *dsdt_ptr = dsdt;
> > +    int pvpanic_port = romfile_loadint("etc/pvpanic-port", 0x505);
> 
> The default must be 0.
> 
> Also, here:
> 
> 
> +
> +        Method(_STA, 0, NotSerialized) {
> +            Store(PEPT, Local0)
> +            If (LEqual(Local0, Zero)) {
> +                Return (0x00)
> +            } Else {
> +                Return (0x0F)
> +            }
> +        }
> +
> 
> You must change it to look at PEST instead of PEPT (i.e. do not probe,
> just see if you have a meaningful address).
> 
> Just squash the patches, it's simpler that way probably.

I forgot to add RFC to the title. This patch doesn't work for q35 with
custom ioport.

> 
> Paolo
> 
> > +    *(u16 *)(dsdt_ptr + *dsdt_isa_pest) = pvpanic_port;
> > +}
> > +
> >  static void fill_dsdt(struct fadt_descriptor_rev1 *fadt, void *dsdt)
> >  {
> >      if (fadt->dsdt) {
> >          free((void *)le32_to_cpu(fadt->dsdt));
> >      }
> > +    patch_dsdt(dsdt);
> >      fadt->dsdt = cpu_to_le32((u32)dsdt);
> >      fadt->checksum -= checksum(fadt, sizeof(*fadt));
> >      dprintf(1, "ACPI DSDT=%p\n", dsdt);
> >
Michael S. Tsirkin March 21, 2013, 9:54 a.m. UTC | #3
On Thu, Mar 21, 2013 at 05:08:34PM +0800, Hu Tao wrote:
> Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>

OK now you need to ACK GPLv2+ relicensing too :)

Could you please review that message "make acpi bits GPLv2 compatible"
and respond?

> ---
>  src/acpi-dsdt-isa.dsl | 14 ++++++++++++--
>  src/acpi.c            |  9 +++++++++
>  2 files changed, 21 insertions(+), 2 deletions(-)
> 
> diff --git a/src/acpi-dsdt-isa.dsl b/src/acpi-dsdt-isa.dsl
> index 87a31b9..43fe719 100644
> --- a/src/acpi-dsdt-isa.dsl
> +++ b/src/acpi-dsdt-isa.dsl
> @@ -102,7 +102,9 @@ Scope(\_SB.PCI0.ISA) {
>  
>      Device(PEVT) {
>          Name(_HID, "QEMU0001")
> -        OperationRegion(PEOR, SystemIO, 0x0505, 0x01)
> +        ACPI_EXTRACT_NAME_WORD_CONST dsdt_isa_pest
> +        Name(PEST, 0x505)
> +        OperationRegion(PEOR, SystemIO, PEST, 0x01)
>          Field(PEOR, ByteAcc, NoLock, Preserve) {
>              PEPT,   8,
>          }
> @@ -126,7 +128,15 @@ Scope(\_SB.PCI0.ISA) {
>          }
>  
>          Name(_CRS, ResourceTemplate() {
> -            IO(Decode16, 0x0505, 0x0505, 0x01, 0x01)
> +            IO(Decode16, 0x0505, 0x0505, 0x01, 0x01, IO)
>          })
> +
> +        CreateWordField(_CRS, IO._MIN, IOMN)
> +        CreateWordField(_CRS, IO._MAX, IOMX)
> +
> +        Method(_INI, 0, NotSerialized) {
> +            Store(PEST, IOMN)
> +            Store(PEST, IOMX)
> +        }
>      }
>  }
> diff --git a/src/acpi.c b/src/acpi.c
> index 119d1c1..42fa06e 100644
> --- a/src/acpi.c
> +++ b/src/acpi.c
> @@ -286,11 +286,20 @@ static const struct pci_device_id fadt_init_tbl[] = {
>      PCI_DEVICE_END
>  };
>  
> +static void patch_dsdt(void *dsdt)
> +{
> +    u8 *dsdt_ptr = dsdt;
> +    int pvpanic_port = romfile_loadint("etc/pvpanic-port", 0x505);
> +
> +    *(u16 *)(dsdt_ptr + *dsdt_isa_pest) = pvpanic_port;
> +}
> +
>  static void fill_dsdt(struct fadt_descriptor_rev1 *fadt, void *dsdt)
>  {
>      if (fadt->dsdt) {
>          free((void *)le32_to_cpu(fadt->dsdt));
>      }
> +    patch_dsdt(dsdt);
>      fadt->dsdt = cpu_to_le32((u32)dsdt);
>      fadt->checksum -= checksum(fadt, sizeof(*fadt));
>      dprintf(1, "ACPI DSDT=%p\n", dsdt);
> -- 
> 1.8.1.4
Kevin O'Connor March 21, 2013, 10:54 p.m. UTC | #4
On Thu, Mar 21, 2013 at 05:08:34PM +0800, Hu Tao wrote:
> Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>

I don't think it is a good idea to dynamically modify the DSDT.  We've
been using the SSDT for that.

In any case, I think this would be a good candidate for merging after
the ACPI stuff is moved into QEMU.

-Kevin
Hu Tao March 22, 2013, 7:23 a.m. UTC | #5
On Thu, Mar 21, 2013 at 06:54:59PM -0400, Kevin O'Connor wrote:
> On Thu, Mar 21, 2013 at 05:08:34PM +0800, Hu Tao wrote:
> > Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
> 
> I don't think it is a good idea to dynamically modify the DSDT.  We've
> been using the SSDT for that.
> 
> In any case, I think this would be a good candidate for merging after
> the ACPI stuff is moved into QEMU.

Agreed. What do you think about patch 1? (of course with Paolo's
suggestion applied)

> 
> -Kevin
Hu Tao March 22, 2013, 7:25 a.m. UTC | #6
On Thu, Mar 21, 2013 at 11:54:25AM +0200, Michael S. Tsirkin wrote:
> On Thu, Mar 21, 2013 at 05:08:34PM +0800, Hu Tao wrote:
> > Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
> 
> OK now you need to ACK GPLv2+ relicensing too :)
> 
> Could you please review that message "make acpi bits GPLv2 compatible"
> and respond?

Done. Thanks for reminding!
Gleb Natapov March 22, 2013, 7:48 a.m. UTC | #7
On Thu, Mar 21, 2013 at 05:17:11PM +0800, Hu Tao wrote:
> On Thu, Mar 21, 2013 at 10:11:54AM +0100, Paolo Bonzini wrote:
> > Il 21/03/2013 10:08, Hu Tao ha scritto:
> > > Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
> > > ---
> > >  src/acpi-dsdt-isa.dsl | 14 ++++++++++++--
> > >  src/acpi.c            |  9 +++++++++
> > >  2 files changed, 21 insertions(+), 2 deletions(-)
> > > 
> > > diff --git a/src/acpi-dsdt-isa.dsl b/src/acpi-dsdt-isa.dsl
> > > index 87a31b9..43fe719 100644
> > > --- a/src/acpi-dsdt-isa.dsl
> > > +++ b/src/acpi-dsdt-isa.dsl
> > > @@ -102,7 +102,9 @@ Scope(\_SB.PCI0.ISA) {
> > >  
> > >      Device(PEVT) {
> > >          Name(_HID, "QEMU0001")
> > > -        OperationRegion(PEOR, SystemIO, 0x0505, 0x01)
> > > +        ACPI_EXTRACT_NAME_WORD_CONST dsdt_isa_pest
> > > +        Name(PEST, 0x505)
> > > +        OperationRegion(PEOR, SystemIO, PEST, 0x01)
> > >          Field(PEOR, ByteAcc, NoLock, Preserve) {
> > >              PEPT,   8,
> > >          }
> > > @@ -126,7 +128,15 @@ Scope(\_SB.PCI0.ISA) {
> > >          }
> > >  
> > >          Name(_CRS, ResourceTemplate() {
> > > -            IO(Decode16, 0x0505, 0x0505, 0x01, 0x01)
> > > +            IO(Decode16, 0x0505, 0x0505, 0x01, 0x01, IO)
> > >          })
> > > +
> > > +        CreateWordField(_CRS, IO._MIN, IOMN)
> > > +        CreateWordField(_CRS, IO._MAX, IOMX)
> > > +
> > > +        Method(_INI, 0, NotSerialized) {
> > > +            Store(PEST, IOMN)
> > > +            Store(PEST, IOMX)
> > > +        }
> > >      }
> > >  }
> > > diff --git a/src/acpi.c b/src/acpi.c
> > > index 119d1c1..42fa06e 100644
> > > --- a/src/acpi.c
> > > +++ b/src/acpi.c
> > > @@ -286,11 +286,20 @@ static const struct pci_device_id fadt_init_tbl[] = {
> > >      PCI_DEVICE_END
> > >  };
> > >  
> > > +static void patch_dsdt(void *dsdt)
> > > +{
> > > +    u8 *dsdt_ptr = dsdt;
> > > +    int pvpanic_port = romfile_loadint("etc/pvpanic-port", 0x505);
> > 
> > The default must be 0.
> > 
> > Also, here:
> > 
> > 
> > +
> > +        Method(_STA, 0, NotSerialized) {
> > +            Store(PEPT, Local0)
> > +            If (LEqual(Local0, Zero)) {
> > +                Return (0x00)
> > +            } Else {
> > +                Return (0x0F)
> > +            }
> > +        }
> > +
> > 
> > You must change it to look at PEST instead of PEPT (i.e. do not probe,
> > just see if you have a meaningful address).
> > 
> > Just squash the patches, it's simpler that way probably.
> 
> I forgot to add RFC to the title. This patch doesn't work for q35 with
> custom ioport.
> 
Why doesn't it work with q35?

--
			Gleb.
Hu Tao March 26, 2013, 1:59 a.m. UTC | #8
On Fri, Mar 22, 2013 at 09:48:18AM +0200, Gleb Natapov wrote:
> On Thu, Mar 21, 2013 at 05:17:11PM +0800, Hu Tao wrote:
> > On Thu, Mar 21, 2013 at 10:11:54AM +0100, Paolo Bonzini wrote:
> > > Il 21/03/2013 10:08, Hu Tao ha scritto:
> > > > Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
> > > > ---
> > > >  src/acpi-dsdt-isa.dsl | 14 ++++++++++++--
> > > >  src/acpi.c            |  9 +++++++++
> > > >  2 files changed, 21 insertions(+), 2 deletions(-)
> > > > 
> > > > diff --git a/src/acpi-dsdt-isa.dsl b/src/acpi-dsdt-isa.dsl
> > > > index 87a31b9..43fe719 100644
> > > > --- a/src/acpi-dsdt-isa.dsl
> > > > +++ b/src/acpi-dsdt-isa.dsl
> > > > @@ -102,7 +102,9 @@ Scope(\_SB.PCI0.ISA) {
> > > >  
> > > >      Device(PEVT) {
> > > >          Name(_HID, "QEMU0001")
> > > > -        OperationRegion(PEOR, SystemIO, 0x0505, 0x01)
> > > > +        ACPI_EXTRACT_NAME_WORD_CONST dsdt_isa_pest
> > > > +        Name(PEST, 0x505)
> > > > +        OperationRegion(PEOR, SystemIO, PEST, 0x01)
> > > >          Field(PEOR, ByteAcc, NoLock, Preserve) {
> > > >              PEPT,   8,
> > > >          }
> > > > @@ -126,7 +128,15 @@ Scope(\_SB.PCI0.ISA) {
> > > >          }
> > > >  
> > > >          Name(_CRS, ResourceTemplate() {
> > > > -            IO(Decode16, 0x0505, 0x0505, 0x01, 0x01)
> > > > +            IO(Decode16, 0x0505, 0x0505, 0x01, 0x01, IO)
> > > >          })
> > > > +
> > > > +        CreateWordField(_CRS, IO._MIN, IOMN)
> > > > +        CreateWordField(_CRS, IO._MAX, IOMX)
> > > > +
> > > > +        Method(_INI, 0, NotSerialized) {
> > > > +            Store(PEST, IOMN)
> > > > +            Store(PEST, IOMX)
> > > > +        }
> > > >      }
> > > >  }
> > > > diff --git a/src/acpi.c b/src/acpi.c
> > > > index 119d1c1..42fa06e 100644
> > > > --- a/src/acpi.c
> > > > +++ b/src/acpi.c
> > > > @@ -286,11 +286,20 @@ static const struct pci_device_id fadt_init_tbl[] = {
> > > >      PCI_DEVICE_END
> > > >  };
> > > >  
> > > > +static void patch_dsdt(void *dsdt)
> > > > +{
> > > > +    u8 *dsdt_ptr = dsdt;
> > > > +    int pvpanic_port = romfile_loadint("etc/pvpanic-port", 0x505);
> > > 
> > > The default must be 0.
> > > 
> > > Also, here:
> > > 
> > > 
> > > +
> > > +        Method(_STA, 0, NotSerialized) {
> > > +            Store(PEPT, Local0)
> > > +            If (LEqual(Local0, Zero)) {
> > > +                Return (0x00)
> > > +            } Else {
> > > +                Return (0x0F)
> > > +            }
> > > +        }
> > > +
> > > 
> > > You must change it to look at PEST instead of PEPT (i.e. do not probe,
> > > just see if you have a meaningful address).
> > > 
> > > Just squash the patches, it's simpler that way probably.
> > 
> > I forgot to add RFC to the title. This patch doesn't work for q35 with
> > custom ioport.
> > 
> Why doesn't it work with q35?

ACPI_EXTRACT_NAME_WORD_CONST dsdt_isa_pest generates two dsdt_isa_pest,
one in out/acpi-dsdt.hex the other in out/q35-acpi-dsdt.hex. We should
use the one in q35-acpi-dsdt.hex to patch DSDT for q35. But including
q35-acpi-dsdt.hex, along with acpi-dsdt.hex, will result in redefinition
of dsdt_isa_pest. I didn't see a simple way to solve this.
Paolo Bonzini March 26, 2013, 7:03 a.m. UTC | #9
Il 26/03/2013 02:59, Hu Tao ha scritto:
>>> > > 
>> > Why doesn't it work with q35?
> ACPI_EXTRACT_NAME_WORD_CONST dsdt_isa_pest generates two dsdt_isa_pest,
> one in out/acpi-dsdt.hex the other in out/q35-acpi-dsdt.hex. We should
> use the one in q35-acpi-dsdt.hex to patch DSDT for q35. But including
> q35-acpi-dsdt.hex, along with acpi-dsdt.hex, will result in redefinition
> of dsdt_isa_pest. I didn't see a simple way to solve this.

Compile it in a separate file and include it in the SSDT (build_ssdt in
src/acpi.c).

Paolo
Hu Tao March 26, 2013, 7:24 a.m. UTC | #10
On Tue, Mar 26, 2013 at 08:03:09AM +0100, Paolo Bonzini wrote:
> Il 26/03/2013 02:59, Hu Tao ha scritto:
> >>> > > 
> >> > Why doesn't it work with q35?
> > ACPI_EXTRACT_NAME_WORD_CONST dsdt_isa_pest generates two dsdt_isa_pest,
> > one in out/acpi-dsdt.hex the other in out/q35-acpi-dsdt.hex. We should
> > use the one in q35-acpi-dsdt.hex to patch DSDT for q35. But including
> > q35-acpi-dsdt.hex, along with acpi-dsdt.hex, will result in redefinition
> > of dsdt_isa_pest. I didn't see a simple way to solve this.
> 
> Compile it in a separate file and include it in the SSDT (build_ssdt in
> src/acpi.c).

Doesn't work. iasl gives an error:

Data Table Compiler is not available yet

Even though it compiles, I think the generated offset (*dsdt_isa_pest)
won't be correct because it depends on acpi-dsdt.dsl/q35-acpi-dsdt.dsl.
Paolo Bonzini March 26, 2013, 7:53 a.m. UTC | #11
Il 26/03/2013 08:24, Hu Tao ha scritto:
>>> > > ACPI_EXTRACT_NAME_WORD_CONST dsdt_isa_pest generates two dsdt_isa_pest,
>>> > > one in out/acpi-dsdt.hex the other in out/q35-acpi-dsdt.hex. We should
>>> > > use the one in q35-acpi-dsdt.hex to patch DSDT for q35. But including
>>> > > q35-acpi-dsdt.hex, along with acpi-dsdt.hex, will result in redefinition
>>> > > of dsdt_isa_pest. I didn't see a simple way to solve this.
>> > 
>> > Compile it in a separate file and include it in the SSDT (build_ssdt in
>> > src/acpi.c).
> Doesn't work. iasl gives an error:
> 
> Data Table Compiler is not available yet
> 
> Even though it compiles, I think the generated offset (*dsdt_isa_pest)
> won't be correct because it depends on acpi-dsdt.dsl/q35-acpi-dsdt.dsl.

See how it is done for ssdt-misc.aml (in fact, you can simply extend
ssdt-misc.aml).

Paolo
diff mbox

Patch

diff --git a/src/acpi-dsdt-isa.dsl b/src/acpi-dsdt-isa.dsl
index 87a31b9..43fe719 100644
--- a/src/acpi-dsdt-isa.dsl
+++ b/src/acpi-dsdt-isa.dsl
@@ -102,7 +102,9 @@  Scope(\_SB.PCI0.ISA) {
 
     Device(PEVT) {
         Name(_HID, "QEMU0001")
-        OperationRegion(PEOR, SystemIO, 0x0505, 0x01)
+        ACPI_EXTRACT_NAME_WORD_CONST dsdt_isa_pest
+        Name(PEST, 0x505)
+        OperationRegion(PEOR, SystemIO, PEST, 0x01)
         Field(PEOR, ByteAcc, NoLock, Preserve) {
             PEPT,   8,
         }
@@ -126,7 +128,15 @@  Scope(\_SB.PCI0.ISA) {
         }
 
         Name(_CRS, ResourceTemplate() {
-            IO(Decode16, 0x0505, 0x0505, 0x01, 0x01)
+            IO(Decode16, 0x0505, 0x0505, 0x01, 0x01, IO)
         })
+
+        CreateWordField(_CRS, IO._MIN, IOMN)
+        CreateWordField(_CRS, IO._MAX, IOMX)
+
+        Method(_INI, 0, NotSerialized) {
+            Store(PEST, IOMN)
+            Store(PEST, IOMX)
+        }
     }
 }
diff --git a/src/acpi.c b/src/acpi.c
index 119d1c1..42fa06e 100644
--- a/src/acpi.c
+++ b/src/acpi.c
@@ -286,11 +286,20 @@  static const struct pci_device_id fadt_init_tbl[] = {
     PCI_DEVICE_END
 };
 
+static void patch_dsdt(void *dsdt)
+{
+    u8 *dsdt_ptr = dsdt;
+    int pvpanic_port = romfile_loadint("etc/pvpanic-port", 0x505);
+
+    *(u16 *)(dsdt_ptr + *dsdt_isa_pest) = pvpanic_port;
+}
+
 static void fill_dsdt(struct fadt_descriptor_rev1 *fadt, void *dsdt)
 {
     if (fadt->dsdt) {
         free((void *)le32_to_cpu(fadt->dsdt));
     }
+    patch_dsdt(dsdt);
     fadt->dsdt = cpu_to_le32((u32)dsdt);
     fadt->checksum -= checksum(fadt, sizeof(*fadt));
     dprintf(1, "ACPI DSDT=%p\n", dsdt);