From: Wei Liu <wei.liu2@citrix.com>
To: xen-devel@lists.xen.org
Cc: Wei Liu <wei.liu2@citrix.com>
Subject: [PATCH v3 3/4] hvmloader/ovmf: setup BIOS info for OVMF
Date: Thu, 21 Nov 2013 16:22:40 +0000 [thread overview]
Message-ID: <1385050961-32637-4-git-send-email-wei.liu2@citrix.com> (raw)
In-Reply-To: <1385050961-32637-1-git-send-email-wei.liu2@citrix.com>
Move seabios_info to common code and rename it bios_info.
BIOS info for OVMF contains E820 map allocated by hvmloader. This info
is passed to OVMF to help it do proper initialization.
Signed-off-by: Wei Liu <wei.liu2@citrix.com>
---
tools/firmware/hvmloader/config.h | 20 ++++++++++++++
tools/firmware/hvmloader/hvmloader.c | 4 +--
tools/firmware/hvmloader/ovmf.c | 28 +++++++++++++++++--
tools/firmware/hvmloader/seabios.c | 49 +++++++---------------------------
tools/firmware/hvmloader/util.c | 11 ++++++++
tools/firmware/hvmloader/util.h | 2 ++
6 files changed, 70 insertions(+), 44 deletions(-)
diff --git a/tools/firmware/hvmloader/config.h b/tools/firmware/hvmloader/config.h
index 6641197..7d4da50 100644
--- a/tools/firmware/hvmloader/config.h
+++ b/tools/firmware/hvmloader/config.h
@@ -39,6 +39,26 @@ extern struct bios_config rombios_config;
extern struct bios_config seabios_config;
extern struct bios_config ovmf_config;
+#define BIOS_INFO_MAX_TABLES 4
+struct bios_info {
+ char signature[14]; /* Signature */
+ 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 containing 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));
+
#define PAGE_SHIFT 12
#define PAGE_SIZE (1ul << PAGE_SHIFT)
diff --git a/tools/firmware/hvmloader/hvmloader.c b/tools/firmware/hvmloader/hvmloader.c
index 1cc8cf2..9ee6c78 100644
--- a/tools/firmware/hvmloader/hvmloader.c
+++ b/tools/firmware/hvmloader/hvmloader.c
@@ -202,7 +202,7 @@ static void apic_setup(void)
ioapic_write(0x11, SET_APIC_ID(LAPIC_ID(0)));
}
-struct bios_info {
+struct bios {
const char *key;
const struct bios_config *bios;
} bios_configs[] = {
@@ -220,7 +220,7 @@ struct bios_info {
static const struct bios_config *detect_bios(void)
{
- const struct bios_info *b;
+ const struct bios *b;
const char *bios;
bios = xenstore_read("hvmloader/bios", "rombios");
diff --git a/tools/firmware/hvmloader/ovmf.c b/tools/firmware/hvmloader/ovmf.c
index a67a2de..5c0599c 100644
--- a/tools/firmware/hvmloader/ovmf.c
+++ b/tools/firmware/hvmloader/ovmf.c
@@ -46,10 +46,34 @@
#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;
+static void ovmf_setup_bios_info(void)
+{
+ struct bios_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 bios_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 +128,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,
diff --git a/tools/firmware/hvmloader/seabios.c b/tools/firmware/hvmloader/seabios.c
index dd7dfbe..9bc0a6d 100644
--- a/tools/firmware/hvmloader/seabios.c
+++ b/tools/firmware/hvmloader/seabios.c
@@ -34,42 +34,22 @@
extern unsigned char dsdt_anycpu_qemu_xen[];
extern int dsdt_anycpu_qemu_xen_len;
-struct seabios_info {
- char signature[14]; /* XenHVMSeaBIOS\0 */
- 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));
-
-#define MAX_TABLES 4
-
static void seabios_setup_bios_info(void)
{
- struct seabios_info *info = (void *)BIOS_INFO_PHYSICAL_ADDRESS;
+ struct bios_info *info = (void *)BIOS_INFO_PHYSICAL_ADDRESS;
memset(info, 0, sizeof(*info));
memcpy(info->signature, "XenHVMSeaBIOS", sizeof(info->signature));
info->length = sizeof(*info);
- info->tables = (uint32_t)scratch_alloc(MAX_TABLES*sizeof(uint32_t), 0);
+ info->tables =
+ (uint32_t)scratch_alloc(BIOS_INFO_MAX_TABLES*sizeof(uint32_t), 0);
}
static void seabios_finish_bios_info(void)
{
- struct seabios_info *info = (void *)BIOS_INFO_PHYSICAL_ADDRESS;
+ struct bios_info *info = (void *)BIOS_INFO_PHYSICAL_ADDRESS;
uint32_t i;
uint8_t checksum;
@@ -80,17 +60,6 @@ static void seabios_finish_bios_info(void)
info->checksum = -checksum;
}
-static void add_table(uint32_t t)
-{
- struct seabios_info *info = (void *)BIOS_INFO_PHYSICAL_ADDRESS;
- uint32_t *ts = (uint32_t *)info->tables;
-
- ASSERT(info->tables_nr < MAX_TABLES);
-
- ts[info->tables_nr] = t;
- info->tables_nr++;
-}
-
static void seabios_acpi_build_tables(void)
{
uint32_t rsdp = (uint32_t)scratch_alloc(sizeof(struct acpi_20_rsdp), 0);
@@ -102,29 +71,29 @@ static void seabios_acpi_build_tables(void)
};
acpi_build_tables(&config, rsdp);
- add_table(rsdp);
+ bios_info_add_table(rsdp, BIOS_INFO_PHYSICAL_ADDRESS);
}
static void seabios_create_mp_tables(void)
{
- add_table(create_mp_tables(NULL));
+ bios_info_add_table(create_mp_tables(NULL), BIOS_INFO_PHYSICAL_ADDRESS);
}
static void seabios_create_smbios_tables(void)
{
uint32_t ep = (uint32_t)scratch_alloc(sizeof(struct smbios_entry_point), 0);
hvm_write_smbios_tables(ep, 0UL, 0UL);
- add_table(ep);
+ bios_info_add_table(ep, BIOS_INFO_PHYSICAL_ADDRESS);
}
static void seabios_create_pir_tables(void)
{
- add_table(create_pir_tables());
+ bios_info_add_table(create_pir_tables(), BIOS_INFO_PHYSICAL_ADDRESS);
}
static void seabios_setup_e820(void)
{
- struct seabios_info *info = (void *)BIOS_INFO_PHYSICAL_ADDRESS;
+ struct bios_info *info = (void *)BIOS_INFO_PHYSICAL_ADDRESS;
struct e820entry *e820 = scratch_alloc(sizeof(struct e820entry)*16, 0);
info->e820 = (uint32_t)e820;
diff --git a/tools/firmware/hvmloader/util.c b/tools/firmware/hvmloader/util.c
index 80d822f..15c76da 100644
--- a/tools/firmware/hvmloader/util.c
+++ b/tools/firmware/hvmloader/util.c
@@ -828,6 +828,17 @@ int hpet_exists(unsigned long hpet_base)
return ((hpet_id >> 16) == 0x8086);
}
+void bios_info_add_table(uint32_t t, uint32_t info_phys_addr)
+{
+ struct bios_info *info = (void *)info_phys_addr;
+ uint32_t *ts = (uint32_t *)info->tables;
+
+ ASSERT(info->tables_nr < BIOS_INFO_MAX_TABLES);
+
+ ts[info->tables_nr] = t;
+ info->tables_nr++;
+}
+
/*
* Local variables:
* mode: C
diff --git a/tools/firmware/hvmloader/util.h b/tools/firmware/hvmloader/util.h
index 9ccb905..2630dd8 100644
--- a/tools/firmware/hvmloader/util.h
+++ b/tools/firmware/hvmloader/util.h
@@ -22,6 +22,8 @@
#undef NULL
#define NULL ((void*)0)
+void bios_info_add_table(uint32_t t, uint32_t info_phys_addr);
+
void __assert_failed(char *assertion, char *file, int line)
__attribute__((noreturn));
#define ASSERT(p) \
--
1.7.10.4
next prev parent reply other threads:[~2013-11-21 16:22 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-11-21 16:22 [PATCH v3 0/4] hvmloader: make OVMF work with Xen Wei Liu
2013-11-21 16:22 ` [PATCH v3 1/4] hvmloader/ovmf: remove hardcoded OVMF loading location Wei Liu
2013-11-21 16:22 ` [PATCH v3 2/4] hvmloader/ovmf: show OVMF_BEGIN as bios address Wei Liu
2013-11-21 16:22 ` Wei Liu [this message]
2013-11-21 16:22 ` [PATCH v3 4/4] hvmloader/ovmf: setup E820 map Wei Liu
2013-11-29 12:24 ` Ian Campbell
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1385050961-32637-4-git-send-email-wei.liu2@citrix.com \
--to=wei.liu2@citrix.com \
--cc=xen-devel@lists.xen.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).