diff mbox

[v2] hvmloader, libxl: use the correct ACPI settings depending on device model

Message ID 1501012530-31792-1-git-send-email-igor.druzhinin@citrix.com (mailing list archive)
State New, archived
Headers show

Commit Message

Igor Druzhinin July 25, 2017, 7:55 p.m. UTC
We need to choose ACPI tables and ACPI IO port location
properly depending on the device model version we are running.
Previously, this decision was made by BIOS type specific
code in hvmloader, e.g. always load QEMU traditional specific
tables if it's ROMBIOS and always load QEMU Xen specific
tables if it's SeaBIOS.

This change saves this behavior but adds an additional way
(xenstore key) to specify the correct device model if we
happen to run a non-default one. Toolstack bit makes use of it.

Signed-off-by: Igor Druzhinin <igor.druzhinin@citrix.com>
Reviewed-by: Paul Durrant <paul.durrant@citrix.com>
---
Changes in v2:
* fix insufficient allocation size of localent
---
 tools/firmware/hvmloader/hvmloader.c |  2 --
 tools/firmware/hvmloader/ovmf.c      |  2 ++
 tools/firmware/hvmloader/rombios.c   |  2 ++
 tools/firmware/hvmloader/seabios.c   |  3 +++
 tools/firmware/hvmloader/util.c      | 24 ++++++++++++++++++++++++
 tools/libxl/libxl_create.c           |  4 +++-
 6 files changed, 34 insertions(+), 3 deletions(-)

Comments

Roger Pau Monné July 26, 2017, 7:31 a.m. UTC | #1
On Tue, Jul 25, 2017 at 08:55:30PM +0100, Igor Druzhinin wrote:
> We need to choose ACPI tables and ACPI IO port location
> properly depending on the device model version we are running.
> Previously, this decision was made by BIOS type specific
> code in hvmloader, e.g. always load QEMU traditional specific
> tables if it's ROMBIOS and always load QEMU Xen specific
> tables if it's SeaBIOS.
> 
> This change saves this behavior but adds an additional way
> (xenstore key) to specify the correct device model if we
> happen to run a non-default one. Toolstack bit makes use of it.

Should there also be a change to libxl to allow selecting rombios
with qemu-xen or seabios with qemu-trad?

> Signed-off-by: Igor Druzhinin <igor.druzhinin@citrix.com>
> Reviewed-by: Paul Durrant <paul.durrant@citrix.com>
> ---
> Changes in v2:
> * fix insufficient allocation size of localent
> ---
>  tools/firmware/hvmloader/hvmloader.c |  2 --
>  tools/firmware/hvmloader/ovmf.c      |  2 ++
>  tools/firmware/hvmloader/rombios.c   |  2 ++
>  tools/firmware/hvmloader/seabios.c   |  3 +++
>  tools/firmware/hvmloader/util.c      | 24 ++++++++++++++++++++++++
>  tools/libxl/libxl_create.c           |  4 +++-
>  6 files changed, 34 insertions(+), 3 deletions(-)
> 
> diff --git a/tools/firmware/hvmloader/hvmloader.c b/tools/firmware/hvmloader/hvmloader.c
> index f603f68..db11ab1 100644
> --- a/tools/firmware/hvmloader/hvmloader.c
> +++ b/tools/firmware/hvmloader/hvmloader.c
> @@ -405,8 +405,6 @@ int main(void)
>          }
>  
>          acpi_enable_sci();
> -
> -        hvm_param_set(HVM_PARAM_ACPI_IOPORTS_LOCATION, 1);
>      }
>  
>      init_vm86_tss();
> diff --git a/tools/firmware/hvmloader/ovmf.c b/tools/firmware/hvmloader/ovmf.c
> index 4ff7f1d..ebadc64 100644
> --- a/tools/firmware/hvmloader/ovmf.c
> +++ b/tools/firmware/hvmloader/ovmf.c
> @@ -127,6 +127,8 @@ static void ovmf_acpi_build_tables(void)
>          .dsdt_15cpu_len = 0
>      };
>  
> +    hvm_param_set(HVM_PARAM_ACPI_IOPORTS_LOCATION, 1);

This 1/0 seems very opaque, we should have a proper define for it in
param.h (not that you should fix it).

> +
>      hvmloader_acpi_build_tables(&config, ACPI_PHYSICAL_ADDRESS);
>  }
>  
> diff --git a/tools/firmware/hvmloader/rombios.c b/tools/firmware/hvmloader/rombios.c
> index 56b39b7..31a7c65 100644
> --- a/tools/firmware/hvmloader/rombios.c
> +++ b/tools/firmware/hvmloader/rombios.c
> @@ -181,6 +181,8 @@ static void rombios_acpi_build_tables(void)
>          .dsdt_15cpu_len = dsdt_15cpu_len,
>      };
>  
> +    hvm_param_set(HVM_PARAM_ACPI_IOPORTS_LOCATION, 0);
> +
>      hvmloader_acpi_build_tables(&config, ACPI_PHYSICAL_ADDRESS);
>  }
>  
> diff --git a/tools/firmware/hvmloader/seabios.c b/tools/firmware/hvmloader/seabios.c
> index 870576a..5878eff 100644
> --- a/tools/firmware/hvmloader/seabios.c
> +++ b/tools/firmware/hvmloader/seabios.c
> @@ -28,6 +28,7 @@
>  
>  #include <acpi2_0.h>
>  #include <libacpi.h>
> +#include <xen/hvm/params.h>
>  
>  extern unsigned char dsdt_anycpu_qemu_xen[];
>  extern int dsdt_anycpu_qemu_xen_len;
> @@ -99,6 +100,8 @@ static void seabios_acpi_build_tables(void)
>          .dsdt_15cpu_len = 0,
>      };
>  
> +    hvm_param_set(HVM_PARAM_ACPI_IOPORTS_LOCATION, 1);
> +
>      hvmloader_acpi_build_tables(&config, rsdp);
>      add_table(rsdp);
>  }
> diff --git a/tools/firmware/hvmloader/util.c b/tools/firmware/hvmloader/util.c
> index db5f240..45b777c 100644
> --- a/tools/firmware/hvmloader/util.c
> +++ b/tools/firmware/hvmloader/util.c
> @@ -31,6 +31,9 @@
>  #include <xen/hvm/hvm_xs_strings.h>
>  #include <xen/hvm/params.h>
>  
> +extern unsigned char dsdt_anycpu_qemu_xen[], dsdt_anycpu[], dsdt_15cpu[];
> +extern int dsdt_anycpu_qemu_xen_len, dsdt_anycpu_len, dsdt_15cpu_len;

Part of those extern declarations are now present in ovmf.c,
seabios.c, rombios.c and now also util.c, maybe it would make sense to
just declare them in util.h?

>  /*
>   * Check whether there exists overlap in the specified memory range.
>   * Returns true if exists, else returns false.
> @@ -897,6 +900,27 @@ void hvmloader_acpi_build_tables(struct acpi_config *config,
>      /* Allocate and initialise the acpi info area. */
>      mem_hole_populate_ram(ACPI_INFO_PHYSICAL_ADDRESS >> PAGE_SHIFT, 1);
>  
> +    /* If the device model is specified switch to the corresponding tables */
> +    s = xenstore_read("platform/device-model", "");
> +    if ( !strncmp(s, "qemu_xen_traditional", 21) )
> +    {
> +        config->dsdt_anycpu = dsdt_anycpu;
> +        config->dsdt_anycpu_len = dsdt_anycpu_len;
> +        config->dsdt_15cpu = dsdt_15cpu;
> +        config->dsdt_15cpu_len = dsdt_15cpu_len;
> +
> +        hvm_param_set(HVM_PARAM_ACPI_IOPORTS_LOCATION, 0);
> +    }
> +    else if ( !strncmp(s, "qemu_xen", 9) )
> +    {
> +        config->dsdt_anycpu = dsdt_anycpu_qemu_xen;
> +        config->dsdt_anycpu_len = dsdt_anycpu_qemu_xen_len;
> +        config->dsdt_15cpu = NULL;
> +        config->dsdt_15cpu_len = 0;
> +
> +        hvm_param_set(HVM_PARAM_ACPI_IOPORTS_LOCATION, 1);
> +    }

Does it still make sense to set the tables in
{ovmf/seabios/rombios}_acpi_build_tables?

It seems like it's going to be overwritten here in any case because
the toolstack always writes the "platform/device-model" node.

Maybe it would be better to just panic if the node is not set, and
remove {ovmf/seabios/rombios}_acpi_build_tables.

Roger.
Igor Druzhinin July 26, 2017, 10:56 a.m. UTC | #2
On 26/07/17 08:31, Roger Pau Monné wrote:
> On Tue, Jul 25, 2017 at 08:55:30PM +0100, Igor Druzhinin wrote:
>> We need to choose ACPI tables and ACPI IO port location
>> properly depending on the device model version we are running.
>> Previously, this decision was made by BIOS type specific
>> code in hvmloader, e.g. always load QEMU traditional specific
>> tables if it's ROMBIOS and always load QEMU Xen specific
>> tables if it's SeaBIOS.
>>
>> This change saves this behavior but adds an additional way
>> (xenstore key) to specify the correct device model if we
>> happen to run a non-default one. Toolstack bit makes use of it.
> 
> Should there also be a change to libxl to allow selecting rombios
> with qemu-xen or seabios with qemu-trad?
> 

It's already there (see libxl__domain_build_info_setdefault()).

>> Signed-off-by: Igor Druzhinin <igor.druzhinin@citrix.com>
>> Reviewed-by: Paul Durrant <paul.durrant@citrix.com>
>> ---
>> Changes in v2:
>> * fix insufficient allocation size of localent
>> ---
>>  tools/firmware/hvmloader/hvmloader.c |  2 --
>>  tools/firmware/hvmloader/ovmf.c      |  2 ++
>>  tools/firmware/hvmloader/rombios.c   |  2 ++
>>  tools/firmware/hvmloader/seabios.c   |  3 +++
>>  tools/firmware/hvmloader/util.c      | 24 ++++++++++++++++++++++++
>>  tools/libxl/libxl_create.c           |  4 +++-
>>  6 files changed, 34 insertions(+), 3 deletions(-)
>>
>> diff --git a/tools/firmware/hvmloader/hvmloader.c b/tools/firmware/hvmloader/hvmloader.c
>> index f603f68..db11ab1 100644
>> --- a/tools/firmware/hvmloader/hvmloader.c
>> +++ b/tools/firmware/hvmloader/hvmloader.c
>> @@ -405,8 +405,6 @@ int main(void)
>>          }
>>  
>>          acpi_enable_sci();
>> -
>> -        hvm_param_set(HVM_PARAM_ACPI_IOPORTS_LOCATION, 1);
>>      }
>>  
>>      init_vm86_tss();
>> diff --git a/tools/firmware/hvmloader/ovmf.c b/tools/firmware/hvmloader/ovmf.c
>> index 4ff7f1d..ebadc64 100644
>> --- a/tools/firmware/hvmloader/ovmf.c
>> +++ b/tools/firmware/hvmloader/ovmf.c
>> @@ -127,6 +127,8 @@ static void ovmf_acpi_build_tables(void)
>>          .dsdt_15cpu_len = 0
>>      };
>>  
>> +    hvm_param_set(HVM_PARAM_ACPI_IOPORTS_LOCATION, 1);
> 
> This 1/0 seems very opaque, we should have a proper define for it in
> param.h (not that you should fix it).
> 
>> +
>>      hvmloader_acpi_build_tables(&config, ACPI_PHYSICAL_ADDRESS);
>>  }
>>  
>> diff --git a/tools/firmware/hvmloader/rombios.c b/tools/firmware/hvmloader/rombios.c
>> index 56b39b7..31a7c65 100644
>> --- a/tools/firmware/hvmloader/rombios.c
>> +++ b/tools/firmware/hvmloader/rombios.c
>> @@ -181,6 +181,8 @@ static void rombios_acpi_build_tables(void)
>>          .dsdt_15cpu_len = dsdt_15cpu_len,
>>      };
>>  
>> +    hvm_param_set(HVM_PARAM_ACPI_IOPORTS_LOCATION, 0);
>> +
>>      hvmloader_acpi_build_tables(&config, ACPI_PHYSICAL_ADDRESS);
>>  }
>>  
>> diff --git a/tools/firmware/hvmloader/seabios.c b/tools/firmware/hvmloader/seabios.c
>> index 870576a..5878eff 100644
>> --- a/tools/firmware/hvmloader/seabios.c
>> +++ b/tools/firmware/hvmloader/seabios.c
>> @@ -28,6 +28,7 @@
>>  
>>  #include <acpi2_0.h>
>>  #include <libacpi.h>
>> +#include <xen/hvm/params.h>
>>  
>>  extern unsigned char dsdt_anycpu_qemu_xen[];
>>  extern int dsdt_anycpu_qemu_xen_len;
>> @@ -99,6 +100,8 @@ static void seabios_acpi_build_tables(void)
>>          .dsdt_15cpu_len = 0,
>>      };
>>  
>> +    hvm_param_set(HVM_PARAM_ACPI_IOPORTS_LOCATION, 1);
>> +
>>      hvmloader_acpi_build_tables(&config, rsdp);
>>      add_table(rsdp);
>>  }
>> diff --git a/tools/firmware/hvmloader/util.c b/tools/firmware/hvmloader/util.c
>> index db5f240..45b777c 100644
>> --- a/tools/firmware/hvmloader/util.c
>> +++ b/tools/firmware/hvmloader/util.c
>> @@ -31,6 +31,9 @@
>>  #include <xen/hvm/hvm_xs_strings.h>
>>  #include <xen/hvm/params.h>
>>  
>> +extern unsigned char dsdt_anycpu_qemu_xen[], dsdt_anycpu[], dsdt_15cpu[];
>> +extern int dsdt_anycpu_qemu_xen_len, dsdt_anycpu_len, dsdt_15cpu_len;
> 
> Part of those extern declarations are now present in ovmf.c,
> seabios.c, rombios.c and now also util.c, maybe it would make sense to
> just declare them in util.h?
> 

Makes sense.

>>  /*
>>   * Check whether there exists overlap in the specified memory range.
>>   * Returns true if exists, else returns false.
>> @@ -897,6 +900,27 @@ void hvmloader_acpi_build_tables(struct acpi_config *config,
>>      /* Allocate and initialise the acpi info area. */
>>      mem_hole_populate_ram(ACPI_INFO_PHYSICAL_ADDRESS >> PAGE_SHIFT, 1);
>>  
>> +    /* If the device model is specified switch to the corresponding tables */
>> +    s = xenstore_read("platform/device-model", "");
>> +    if ( !strncmp(s, "qemu_xen_traditional", 21) )
>> +    {
>> +        config->dsdt_anycpu = dsdt_anycpu;
>> +        config->dsdt_anycpu_len = dsdt_anycpu_len;
>> +        config->dsdt_15cpu = dsdt_15cpu;
>> +        config->dsdt_15cpu_len = dsdt_15cpu_len;
>> +
>> +        hvm_param_set(HVM_PARAM_ACPI_IOPORTS_LOCATION, 0);
>> +    }
>> +    else if ( !strncmp(s, "qemu_xen", 9) )
>> +    {
>> +        config->dsdt_anycpu = dsdt_anycpu_qemu_xen;
>> +        config->dsdt_anycpu_len = dsdt_anycpu_qemu_xen_len;
>> +        config->dsdt_15cpu = NULL;
>> +        config->dsdt_15cpu_len = 0;
>> +
>> +        hvm_param_set(HVM_PARAM_ACPI_IOPORTS_LOCATION, 1);
>> +    }
> 
> Does it still make sense to set the tables in
> {ovmf/seabios/rombios}_acpi_build_tables?
> 
> It seems like it's going to be overwritten here in any case because
> the toolstack always writes the "platform/device-model" node.
> 
> Maybe it would be better to just panic if the node is not set, and
> remove {ovmf/seabios/rombios}_acpi_build_tables.
> 

This is intentional - I want to preserve the original behavior for
compatibility with other toolstacks.

Igor

> Roger.
>
Roger Pau Monné July 26, 2017, 1:06 p.m. UTC | #3
On Wed, Jul 26, 2017 at 11:56:55AM +0100, Igor Druzhinin wrote:
> On 26/07/17 08:31, Roger Pau Monné wrote:
> > On Tue, Jul 25, 2017 at 08:55:30PM +0100, Igor Druzhinin wrote:
> >> We need to choose ACPI tables and ACPI IO port location
> >> properly depending on the device model version we are running.
> >> Previously, this decision was made by BIOS type specific
> >> code in hvmloader, e.g. always load QEMU traditional specific
> >> tables if it's ROMBIOS and always load QEMU Xen specific
> >> tables if it's SeaBIOS.
> >>
> >> This change saves this behavior but adds an additional way
> >> (xenstore key) to specify the correct device model if we
> >> happen to run a non-default one. Toolstack bit makes use of it.
> > 
> > Should there also be a change to libxl to allow selecting rombios
> > with qemu-xen or seabios with qemu-trad?
> > 
> 
> It's already there (see libxl__domain_build_info_setdefault()).

Current code in libxl__domain_build_info_setdefault will prevent you
from selecting qemu-xen and rombios or qemu-trad and seabios (grep
for "Enforce BIOS<->Device Model version relationship"), hence me
asking if this should be lifted, so the new combinations that this
patch seems to allow are available from libxl/xl.

Roger.
Igor Druzhinin July 26, 2017, 1:21 p.m. UTC | #4
On 26/07/17 14:06, Roger Pau Monné wrote:
> On Wed, Jul 26, 2017 at 11:56:55AM +0100, Igor Druzhinin wrote:
>> On 26/07/17 08:31, Roger Pau Monné wrote:
>>> On Tue, Jul 25, 2017 at 08:55:30PM +0100, Igor Druzhinin wrote:
>>>> We need to choose ACPI tables and ACPI IO port location
>>>> properly depending on the device model version we are running.
>>>> Previously, this decision was made by BIOS type specific
>>>> code in hvmloader, e.g. always load QEMU traditional specific
>>>> tables if it's ROMBIOS and always load QEMU Xen specific
>>>> tables if it's SeaBIOS.
>>>>
>>>> This change saves this behavior but adds an additional way
>>>> (xenstore key) to specify the correct device model if we
>>>> happen to run a non-default one. Toolstack bit makes use of it.
>>>
>>> Should there also be a change to libxl to allow selecting rombios
>>> with qemu-xen or seabios with qemu-trad?
>>>
>>
>> It's already there (see libxl__domain_build_info_setdefault()).
> 
> Current code in libxl__domain_build_info_setdefault will prevent you
> from selecting qemu-xen and rombios or qemu-trad and seabios (grep
> for "Enforce BIOS<->Device Model version relationship"), hence me
> asking if this should be lifted, so the new combinations that this
> patch seems to allow are available from libxl/xl.
> 
> Roger.
> 

Yes, you're right. I think we need to change them to warnings rather
than errors. For instance, ROMBIOS is perfectly compatible with QEMU-Xen
with some small modifications so there is no need for enforcement. What
do you think?

Igor
Roger Pau Monné July 26, 2017, 1:30 p.m. UTC | #5
On Wed, Jul 26, 2017 at 02:21:49PM +0100, Igor Druzhinin wrote:
> On 26/07/17 14:06, Roger Pau Monné wrote:
> > On Wed, Jul 26, 2017 at 11:56:55AM +0100, Igor Druzhinin wrote:
> >> On 26/07/17 08:31, Roger Pau Monné wrote:
> >>> On Tue, Jul 25, 2017 at 08:55:30PM +0100, Igor Druzhinin wrote:
> >>>> We need to choose ACPI tables and ACPI IO port location
> >>>> properly depending on the device model version we are running.
> >>>> Previously, this decision was made by BIOS type specific
> >>>> code in hvmloader, e.g. always load QEMU traditional specific
> >>>> tables if it's ROMBIOS and always load QEMU Xen specific
> >>>> tables if it's SeaBIOS.
> >>>>
> >>>> This change saves this behavior but adds an additional way
> >>>> (xenstore key) to specify the correct device model if we
> >>>> happen to run a non-default one. Toolstack bit makes use of it.
> >>>
> >>> Should there also be a change to libxl to allow selecting rombios
> >>> with qemu-xen or seabios with qemu-trad?
> >>>
> >>
> >> It's already there (see libxl__domain_build_info_setdefault()).
> > 
> > Current code in libxl__domain_build_info_setdefault will prevent you
> > from selecting qemu-xen and rombios or qemu-trad and seabios (grep
> > for "Enforce BIOS<->Device Model version relationship"), hence me
> > asking if this should be lifted, so the new combinations that this
> > patch seems to allow are available from libxl/xl.
> > 
> > Roger.
> > 
> 
> Yes, you're right. I think we need to change them to warnings rather
> than errors. For instance, ROMBIOS is perfectly compatible with QEMU-Xen
> with some small modifications so there is no need for enforcement.

Are those small modifications upstream in our tree(s)?

> What
> do you think?

I think adding a warning but allowing them should be fine, or else the
changes made by this patch are mostly meaningless to libxl/xl.

Roger.
Igor Druzhinin July 26, 2017, 1:36 p.m. UTC | #6
On 26/07/17 14:30, Roger Pau Monné wrote:
> On Wed, Jul 26, 2017 at 02:21:49PM +0100, Igor Druzhinin wrote:
>> On 26/07/17 14:06, Roger Pau Monné wrote:
>>> On Wed, Jul 26, 2017 at 11:56:55AM +0100, Igor Druzhinin wrote:
>>>> On 26/07/17 08:31, Roger Pau Monné wrote:
>>>>> On Tue, Jul 25, 2017 at 08:55:30PM +0100, Igor Druzhinin wrote:
>>>>>> We need to choose ACPI tables and ACPI IO port location
>>>>>> properly depending on the device model version we are running.
>>>>>> Previously, this decision was made by BIOS type specific
>>>>>> code in hvmloader, e.g. always load QEMU traditional specific
>>>>>> tables if it's ROMBIOS and always load QEMU Xen specific
>>>>>> tables if it's SeaBIOS.
>>>>>>
>>>>>> This change saves this behavior but adds an additional way
>>>>>> (xenstore key) to specify the correct device model if we
>>>>>> happen to run a non-default one. Toolstack bit makes use of it.
>>>>>
>>>>> Should there also be a change to libxl to allow selecting rombios
>>>>> with qemu-xen or seabios with qemu-trad?
>>>>>
>>>>
>>>> It's already there (see libxl__domain_build_info_setdefault()).
>>>
>>> Current code in libxl__domain_build_info_setdefault will prevent you
>>> from selecting qemu-xen and rombios or qemu-trad and seabios (grep
>>> for "Enforce BIOS<->Device Model version relationship"), hence me
>>> asking if this should be lifted, so the new combinations that this
>>> patch seems to allow are available from libxl/xl.
>>>
>>> Roger.
>>>
>>
>> Yes, you're right. I think we need to change them to warnings rather
>> than errors. For instance, ROMBIOS is perfectly compatible with QEMU-Xen
>> with some small modifications so there is no need for enforcement.
> 
> Are those small modifications upstream in our tree(s)?
> 

Some of them are in review. I probably need to find some time to finish
them.

Igor

>> What
>> do you think?
> 
> I think adding a warning but allowing them should be fine, or else the
> changes made by this patch are mostly meaningless to libxl/xl.
> 
> Roger.
>
Roger Pau Monné July 26, 2017, 1:39 p.m. UTC | #7
On Wed, Jul 26, 2017 at 02:36:20PM +0100, Igor Druzhinin wrote:
> On 26/07/17 14:30, Roger Pau Monné wrote:
> > On Wed, Jul 26, 2017 at 02:21:49PM +0100, Igor Druzhinin wrote:
> >> On 26/07/17 14:06, Roger Pau Monné wrote:
> >>> On Wed, Jul 26, 2017 at 11:56:55AM +0100, Igor Druzhinin wrote:
> >>>> On 26/07/17 08:31, Roger Pau Monné wrote:
> >>>>> On Tue, Jul 25, 2017 at 08:55:30PM +0100, Igor Druzhinin wrote:
> >>>>>> We need to choose ACPI tables and ACPI IO port location
> >>>>>> properly depending on the device model version we are running.
> >>>>>> Previously, this decision was made by BIOS type specific
> >>>>>> code in hvmloader, e.g. always load QEMU traditional specific
> >>>>>> tables if it's ROMBIOS and always load QEMU Xen specific
> >>>>>> tables if it's SeaBIOS.
> >>>>>>
> >>>>>> This change saves this behavior but adds an additional way
> >>>>>> (xenstore key) to specify the correct device model if we
> >>>>>> happen to run a non-default one. Toolstack bit makes use of it.
> >>>>>
> >>>>> Should there also be a change to libxl to allow selecting rombios
> >>>>> with qemu-xen or seabios with qemu-trad?
> >>>>>
> >>>>
> >>>> It's already there (see libxl__domain_build_info_setdefault()).
> >>>
> >>> Current code in libxl__domain_build_info_setdefault will prevent you
> >>> from selecting qemu-xen and rombios or qemu-trad and seabios (grep
> >>> for "Enforce BIOS<->Device Model version relationship"), hence me
> >>> asking if this should be lifted, so the new combinations that this
> >>> patch seems to allow are available from libxl/xl.
> >>>
> >>> Roger.
> >>>
> >>
> >> Yes, you're right. I think we need to change them to warnings rather
> >> than errors. For instance, ROMBIOS is perfectly compatible with QEMU-Xen
> >> with some small modifications so there is no need for enforcement.
> > 
> > Are those small modifications upstream in our tree(s)?
> > 
> 
> Some of them are in review. I probably need to find some time to finish
> them.

Then I think the enforcement should only be lifted once everything is
in place. The rest LGTM.

Roger.
diff mbox

Patch

diff --git a/tools/firmware/hvmloader/hvmloader.c b/tools/firmware/hvmloader/hvmloader.c
index f603f68..db11ab1 100644
--- a/tools/firmware/hvmloader/hvmloader.c
+++ b/tools/firmware/hvmloader/hvmloader.c
@@ -405,8 +405,6 @@  int main(void)
         }
 
         acpi_enable_sci();
-
-        hvm_param_set(HVM_PARAM_ACPI_IOPORTS_LOCATION, 1);
     }
 
     init_vm86_tss();
diff --git a/tools/firmware/hvmloader/ovmf.c b/tools/firmware/hvmloader/ovmf.c
index 4ff7f1d..ebadc64 100644
--- a/tools/firmware/hvmloader/ovmf.c
+++ b/tools/firmware/hvmloader/ovmf.c
@@ -127,6 +127,8 @@  static void ovmf_acpi_build_tables(void)
         .dsdt_15cpu_len = 0
     };
 
+    hvm_param_set(HVM_PARAM_ACPI_IOPORTS_LOCATION, 1);
+
     hvmloader_acpi_build_tables(&config, ACPI_PHYSICAL_ADDRESS);
 }
 
diff --git a/tools/firmware/hvmloader/rombios.c b/tools/firmware/hvmloader/rombios.c
index 56b39b7..31a7c65 100644
--- a/tools/firmware/hvmloader/rombios.c
+++ b/tools/firmware/hvmloader/rombios.c
@@ -181,6 +181,8 @@  static void rombios_acpi_build_tables(void)
         .dsdt_15cpu_len = dsdt_15cpu_len,
     };
 
+    hvm_param_set(HVM_PARAM_ACPI_IOPORTS_LOCATION, 0);
+
     hvmloader_acpi_build_tables(&config, ACPI_PHYSICAL_ADDRESS);
 }
 
diff --git a/tools/firmware/hvmloader/seabios.c b/tools/firmware/hvmloader/seabios.c
index 870576a..5878eff 100644
--- a/tools/firmware/hvmloader/seabios.c
+++ b/tools/firmware/hvmloader/seabios.c
@@ -28,6 +28,7 @@ 
 
 #include <acpi2_0.h>
 #include <libacpi.h>
+#include <xen/hvm/params.h>
 
 extern unsigned char dsdt_anycpu_qemu_xen[];
 extern int dsdt_anycpu_qemu_xen_len;
@@ -99,6 +100,8 @@  static void seabios_acpi_build_tables(void)
         .dsdt_15cpu_len = 0,
     };
 
+    hvm_param_set(HVM_PARAM_ACPI_IOPORTS_LOCATION, 1);
+
     hvmloader_acpi_build_tables(&config, rsdp);
     add_table(rsdp);
 }
diff --git a/tools/firmware/hvmloader/util.c b/tools/firmware/hvmloader/util.c
index db5f240..45b777c 100644
--- a/tools/firmware/hvmloader/util.c
+++ b/tools/firmware/hvmloader/util.c
@@ -31,6 +31,9 @@ 
 #include <xen/hvm/hvm_xs_strings.h>
 #include <xen/hvm/params.h>
 
+extern unsigned char dsdt_anycpu_qemu_xen[], dsdt_anycpu[], dsdt_15cpu[];
+extern int dsdt_anycpu_qemu_xen_len, dsdt_anycpu_len, dsdt_15cpu_len;
+
 /*
  * Check whether there exists overlap in the specified memory range.
  * Returns true if exists, else returns false.
@@ -897,6 +900,27 @@  void hvmloader_acpi_build_tables(struct acpi_config *config,
     /* Allocate and initialise the acpi info area. */
     mem_hole_populate_ram(ACPI_INFO_PHYSICAL_ADDRESS >> PAGE_SHIFT, 1);
 
+    /* If the device model is specified switch to the corresponding tables */
+    s = xenstore_read("platform/device-model", "");
+    if ( !strncmp(s, "qemu_xen_traditional", 21) )
+    {
+        config->dsdt_anycpu = dsdt_anycpu;
+        config->dsdt_anycpu_len = dsdt_anycpu_len;
+        config->dsdt_15cpu = dsdt_15cpu;
+        config->dsdt_15cpu_len = dsdt_15cpu_len;
+
+        hvm_param_set(HVM_PARAM_ACPI_IOPORTS_LOCATION, 0);
+    }
+    else if ( !strncmp(s, "qemu_xen", 9) )
+    {
+        config->dsdt_anycpu = dsdt_anycpu_qemu_xen;
+        config->dsdt_anycpu_len = dsdt_anycpu_qemu_xen_len;
+        config->dsdt_15cpu = NULL;
+        config->dsdt_15cpu_len = 0;
+
+        hvm_param_set(HVM_PARAM_ACPI_IOPORTS_LOCATION, 1);
+    }
+
     config->lapic_base_address = LAPIC_BASE_ADDRESS;
     config->lapic_id = acpi_lapic_id;
     config->ioapic_base_address = ioapic_base_address;
diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c
index 1158303..1d24209 100644
--- a/tools/libxl/libxl_create.c
+++ b/tools/libxl/libxl_create.c
@@ -451,7 +451,7 @@  int libxl__domain_build(libxl__gc *gc,
         vments[4] = "start_time";
         vments[5] = GCSPRINTF("%lu.%02d", start_time.tv_sec,(int)start_time.tv_usec/10000);
 
-        localents = libxl__calloc(gc, 11, sizeof(char *));
+        localents = libxl__calloc(gc, 13, sizeof(char *));
         i = 0;
         localents[i++] = "platform/acpi";
         localents[i++] = libxl__acpi_defbool_val(info) ? "1" : "0";
@@ -472,6 +472,8 @@  int libxl__domain_build(libxl__gc *gc,
                                    info->u.hvm.mmio_hole_memkb << 10);
             }
         }
+        localents[i++] = "platform/device-model";
+        localents[i++] = (char *) libxl_device_model_version_to_string(info->device_model_version);
 
         break;
     case LIBXL_DOMAIN_TYPE_PV: