This is version 2 of Xen side patches. Changes in V2: * ovmf_info is now almost the same as seabios_info * bump e820 entry number to 128 * modify build_e820_table to avoid BIOS region reservation if there''s none Wei. Wei Liu (4): hvmloader/ovmf: increase blob size to 2MB hvmloader/ovmf: show OVMF_BEGIN as bios address hvmloader/ovmf: setup ovmf_info hvmloader/ovmf: setup E820 map tools/firmware/hvmloader/e820.c | 20 ++++++------ tools/firmware/hvmloader/ovmf.c | 67 +++++++++++++++++++++++++++++++++++---- 2 files changed, 72 insertions(+), 15 deletions(-) -- 1.7.10.4
Wei Liu
2013-Nov-19 21:11 UTC
[PATCH RFC v2 1/4] hvmloader/ovmf: increase blob size to 2MB
The debug build of OVMF now can be as large as 2MB. Signed-off-by: Wei Liu <wei.liu2@citrix.com> --- tools/firmware/hvmloader/ovmf.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/firmware/hvmloader/ovmf.c b/tools/firmware/hvmloader/ovmf.c index ee4cbbf..5c83626 100644 --- a/tools/firmware/hvmloader/ovmf.c +++ b/tools/firmware/hvmloader/ovmf.c @@ -38,8 +38,8 @@ #define ROM_INCLUDE_OVMF #include "roms.inc" -#define OVMF_BEGIN 0xFFF00000ULL -#define OVMF_SIZE 0x00100000ULL +#define OVMF_BEGIN 0xFFE00000ULL +#define OVMF_SIZE 0x00200000ULL #define OVMF_MAXOFFSET 0x000FFFFFULL #define OVMF_END (OVMF_BEGIN + OVMF_SIZE) #define LOWCHUNK_BEGIN 0x000F0000 -- 1.7.10.4
Wei Liu
2013-Nov-19 21:11 UTC
[PATCH RFC v2 2/4] hvmloader/ovmf: show OVMF_BEGIN as bios address
Signed-off-by: Wei Liu <wei.liu2@citrix.com> Acked-by: Ian Campbell <ian.campbell@citrix.com> --- tools/firmware/hvmloader/ovmf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/firmware/hvmloader/ovmf.c b/tools/firmware/hvmloader/ovmf.c index 5c83626..7826095 100644 --- a/tools/firmware/hvmloader/ovmf.c +++ b/tools/firmware/hvmloader/ovmf.c @@ -99,7 +99,7 @@ struct bios_config ovmf_config = { .image = ovmf, .image_size = sizeof(ovmf), - .bios_address = 0, + .bios_address = OVMF_BEGIN, .bios_load = ovmf_load, .load_roms = 0, -- 1.7.10.4
OVMF info contains E820 map allocated by hvmloader. This info is passed to OVMF to help it do proper initialization. Currently only E820 is necessary, but we reserve spaces for other tables in ovmf_info for later usage. Signed-off-by: Wei Liu <wei.liu2@citrix.com> --- tools/firmware/hvmloader/ovmf.c | 49 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/tools/firmware/hvmloader/ovmf.c b/tools/firmware/hvmloader/ovmf.c index 7826095..1564263 100644 --- a/tools/firmware/hvmloader/ovmf.c +++ b/tools/firmware/hvmloader/ovmf.c @@ -46,10 +46,55 @@ #define LOWCHUNK_SIZE 0x00010000 #define LOWCHUNK_MAXOFFSET 0x0000FFFF #define LOWCHUNK_END (OVMF_BEGIN + OVMF_SIZE) +#define OVMF_INFO_PHYSICAL_ADDRESS 0X00001000 extern unsigned char dsdt_anycpu[]; extern int dsdt_anycpu_len; +#define OVMF_INFO_MAX_TABLES 4 +struct ovmf_info { + char signature[11]; /* XenHVMOVMF\0 */ + char pad[3]; + uint8_t length; /* Length of this struct */ + uint8_t checksum; /* Set such that the sum over bytes 0..length == 0 */ + /* + * Physical address of an array of tables_nr elements. + * + * Each element is a 32 bit value contianing the physical address + * of a BIOS table. + */ + uint32_t tables; + uint32_t tables_nr; + /* + * Physical address of the e820 table, contains e820_nr entries. + */ + uint32_t e820; + uint32_t e820_nr; +} __attribute__ ((packed)); + +static void ovmf_setup_bios_info(void) +{ + struct ovmf_info *info = (void *)OVMF_INFO_PHYSICAL_ADDRESS; + + memset(info, 0, sizeof(*info)); + + memcpy(info->signature, "XenHVMOVMF", sizeof(info->signature)); + info->length = sizeof(*info); +} + +static void ovmf_finish_bios_info(void) +{ + struct ovmf_info *info = (void *)OVMF_INFO_PHYSICAL_ADDRESS; + uint32_t i; + uint8_t checksum; + + checksum = 0; + for ( i = 0; i < info->length; i++ ) + checksum += ((uint8_t *)(info))[i]; + + info->checksum = -checksum; +} + static void ovmf_load(const struct bios_config *config) { xen_pfn_t mfn; @@ -104,8 +149,8 @@ struct bios_config ovmf_config = { .load_roms = 0, - .bios_info_setup = NULL, - .bios_info_finish = NULL, + .bios_info_setup = ovmf_setup_bios_info, + .bios_info_finish = ovmf_finish_bios_info, .e820_setup = NULL, -- 1.7.10.4
E820 map will be used by OVMF to create memory map. Modify build_e820_table to cope with the fact that OVMF doesn''t actually need to reserve bios_image_base - 0x100000. Signed-off-by: Wei Liu <wei.liu2@citrix.com> --- tools/firmware/hvmloader/e820.c | 20 +++++++++++--------- tools/firmware/hvmloader/ovmf.c | 12 +++++++++++- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/tools/firmware/hvmloader/e820.c b/tools/firmware/hvmloader/e820.c index 2e05e93..bdb66f5 100644 --- a/tools/firmware/hvmloader/e820.c +++ b/tools/firmware/hvmloader/e820.c @@ -81,8 +81,6 @@ int build_e820_table(struct e820entry *e820, /* Lowmem must be at least 512K to keep Windows happy) */ ASSERT ( lowmem_reserved_base > 512<<10 ); - ASSERT ( bios_image_base < 0x100000 ); - /* * 0x0-lowmem_reserved_base: Ordinary RAM. */ @@ -109,13 +107,17 @@ int build_e820_table(struct e820entry *e820, * TODO: free pages which turn out to be unused. */ - /* - * BIOS region. - */ - e820[nr].addr = bios_image_base; - e820[nr].size = 0x100000-bios_image_base; - e820[nr].type = E820_RESERVED; - nr++; + /* + * BIOS region if we have one. + */ + if ( bios_image_base != (unsigned int)-1 ) + { + ASSERT ( bios_image_base < 0x100000 ); + e820[nr].addr = bios_image_base; + e820[nr].size = 0x100000-bios_image_base; + e820[nr].type = E820_RESERVED; + nr++; + } /* Low RAM goes here. Reserve space for special pages. */ BUG_ON((hvm_info->low_mem_pgend << PAGE_SHIFT) < (2u << 20)); diff --git a/tools/firmware/hvmloader/ovmf.c b/tools/firmware/hvmloader/ovmf.c index 1564263..e17f4e1 100644 --- a/tools/firmware/hvmloader/ovmf.c +++ b/tools/firmware/hvmloader/ovmf.c @@ -138,6 +138,16 @@ static void ovmf_create_smbios_tables(void) SMBIOS_PHYSICAL_END); } +static void ovmf_setup_e820(void) +{ + struct ovmf_info *info = (void *)OVMF_INFO_PHYSICAL_ADDRESS; + struct e820entry *e820 = scratch_alloc(sizeof(struct e820entry)*128, 0); + info->e820 = (uint32_t)e820; + + info->e820_nr = build_e820_table(e820, 0, (unsigned int)-1); + dump_e820_table(e820, info->e820_nr); +} + struct bios_config ovmf_config = { .name = "OVMF", @@ -152,7 +162,7 @@ struct bios_config ovmf_config = { .bios_info_setup = ovmf_setup_bios_info, .bios_info_finish = ovmf_finish_bios_info, - .e820_setup = NULL, + .e820_setup = ovmf_setup_e820, .acpi_build_tables = ovmf_acpi_build_tables, .create_mp_tables = NULL, -- 1.7.10.4
Konrad Rzeszutek Wilk
2013-Nov-19 21:35 UTC
Re: [PATCH RFC v2 3/4] hvmloader/ovmf: setup ovmf_info
On Tue, Nov 19, 2013 at 09:11:43PM +0000, Wei Liu wrote:> OVMF info contains E820 map allocated by hvmloader. This info is passed > to OVMF to help it do proper initialization. > > Currently only E820 is necessary, but we reserve spaces for other tables > in ovmf_info for later usage. > > Signed-off-by: Wei Liu <wei.liu2@citrix.com> > --- > tools/firmware/hvmloader/ovmf.c | 49 +++++++++++++++++++++++++++++++++++++-- > 1 file changed, 47 insertions(+), 2 deletions(-) > > diff --git a/tools/firmware/hvmloader/ovmf.c b/tools/firmware/hvmloader/ovmf.c > index 7826095..1564263 100644 > --- a/tools/firmware/hvmloader/ovmf.c > +++ b/tools/firmware/hvmloader/ovmf.c > @@ -46,10 +46,55 @@ > #define LOWCHUNK_SIZE 0x00010000 > #define LOWCHUNK_MAXOFFSET 0x0000FFFF > #define LOWCHUNK_END (OVMF_BEGIN + OVMF_SIZE) > +#define OVMF_INFO_PHYSICAL_ADDRESS 0X00001000^-x> > extern unsigned char dsdt_anycpu[]; > extern int dsdt_anycpu_len; > > +#define OVMF_INFO_MAX_TABLES 4 > +struct ovmf_info { > + char signature[11]; /* XenHVMOVMF\0 */ > + char pad[3];/* Need comment */> + uint8_t length; /* Length of this struct */ > + uint8_t checksum; /* Set such that the sum over bytes 0..length == 0 */ > + /* > + * Physical address of an array of tables_nr elements. > + * > + * Each element is a 32 bit value contianing the physical address > + * of a BIOS table. > + */ > + uint32_t tables; > + uint32_t tables_nr; > + /* > + * Physical address of the e820 table, contains e820_nr entries. > + */ > + uint32_t e820; > + uint32_t e820_nr; > +} __attribute__ ((packed)); > + > +static void ovmf_setup_bios_info(void) > +{ > + struct ovmf_info *info = (void *)OVMF_INFO_PHYSICAL_ADDRESS; > + > + memset(info, 0, sizeof(*info)); > + > + memcpy(info->signature, "XenHVMOVMF", sizeof(info->signature)); > + info->length = sizeof(*info); > +} > + > +static void ovmf_finish_bios_info(void) > +{ > + struct ovmf_info *info = (void *)OVMF_INFO_PHYSICAL_ADDRESS; > + uint32_t i; > + uint8_t checksum; > + > + checksum = 0; > + for ( i = 0; i < info->length; i++ ) > + checksum += ((uint8_t *)(info))[i]; > + > + info->checksum = -checksum; > +} > + > static void ovmf_load(const struct bios_config *config) > { > xen_pfn_t mfn; > @@ -104,8 +149,8 @@ struct bios_config ovmf_config = { > > .load_roms = 0, > > - .bios_info_setup = NULL, > - .bios_info_finish = NULL, > + .bios_info_setup = ovmf_setup_bios_info, > + .bios_info_finish = ovmf_finish_bios_info, > > .e820_setup = NULL, > > -- > 1.7.10.4 > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@lists.xen.org > http://lists.xen.org/xen-devel