Message ID | 1501012530-31792-1-git-send-email-igor.druzhinin@citrix.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
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.
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. >
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.
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
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.
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. >
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 --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: