From mboxrd@z Thu Jan 1 00:00:00 1970 From: Wei Liu Subject: [PATCH RFC 3/4] hvmloader/ovmf: setup ovmf_info Date: Fri, 15 Nov 2013 15:59:24 +0000 Message-ID: <1384531165-3600-4-git-send-email-wei.liu2@citrix.com> References: <1384531165-3600-1-git-send-email-wei.liu2@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Received: from mail6.bemta4.messagelabs.com ([85.158.143.247]) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1VhLpK-0007nY-D9 for xen-devel@lists.xenproject.org; Fri, 15 Nov 2013 16:00:58 +0000 In-Reply-To: <1384531165-3600-1-git-send-email-wei.liu2@citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: xen-devel@lists.xenproject.org Cc: wei.liu2@citrix.com List-Id: xen-devel@lists.xenproject.org OVMF info contains E820 map allocated by hvmloader. This info is passed to OVMF to help it do proper initialization. Signed-off-by: Wei Liu --- tools/firmware/hvmloader/ovmf.c | 39 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/tools/firmware/hvmloader/ovmf.c b/tools/firmware/hvmloader/ovmf.c index 7826095..c253083 100644 --- a/tools/firmware/hvmloader/ovmf.c +++ b/tools/firmware/hvmloader/ovmf.c @@ -46,10 +46,45 @@ #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; +struct ovmf_info { + char signature[11]; /* XenHVMOVMF\0 */ + uint8_t length; /* Length of this struct */ + uint8_t checksum; /* Set such that the sum over bytes 0..length == 0 */ + /* + * 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 +139,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