From nobody Mon Feb 9 14:02:40 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) client-ip=66.175.222.108; envelope-from=bounce+27952+87009+1787277+3901457@groups.io; helo=mail02.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+87009+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1645785953; cv=none; d=zohomail.com; s=zohoarc; b=cBTbcXrH+euDIGOxNfi4uFB2ATQ/cUi2QK66wvPFKl0jwxUWQbjXjVmYdcxKzGAq1uDO4Z1Kufp3bGW4TV1JFLSzs3fPudlP1FntSUxsdbnA6S3kNR2rvm/MeWGYlqxOMOpu5ZfmK/UsEHqgBovssecv+FiawmKOTPzDNIFPrDo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1645785953; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=O6UemKhtrSASL8uCeuXxDbhMYZOXWBYS3EkhMrzbQfI=; b=hOJ6zJr9Huv1mBABipsFIlhUbm1cSxI3NsqFqBOvn+bkwpSKuUD1pdOYbthWkq8yj3UTT49F8y86cgk02umiH4+aD9GYaAsHq0u/xp/JSawba7pWJFaleo5/9vVFI0SxSBvMISlqpThwH4qckmXCbrjiAdDvjk9Acjywn4gjTj4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+87009+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 1645785953411476.80109720774294; Fri, 25 Feb 2022 02:45:53 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id 22STYY1788612xvE5j5AzQLE; Fri, 25 Feb 2022 02:45:53 -0800 X-Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by mx.groups.io with SMTP id smtpd.web08.5231.1645785951780488796 for ; Fri, 25 Feb 2022 02:45:52 -0800 X-IronPort-AV: E=McAfee;i="6200,9189,10268"; a="239877756" X-IronPort-AV: E=Sophos;i="5.90,136,1643702400"; d="scan'208";a="239877756" X-Received: from orsmga005.jf.intel.com ([10.7.209.41]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Feb 2022 02:45:51 -0800 X-IronPort-AV: E=Sophos;i="5.90,136,1643702400"; d="scan'208";a="707822202" X-Received: from cward2-mobl2.ger.corp.intel.com (HELO sboeuf-mobl.home) ([10.252.25.151]) by orsmga005-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Feb 2022 02:45:49 -0800 From: "Boeuf, Sebastien" To: devel@edk2.groups.io Cc: jiewen.yao@intel.com, jordan.l.justen@intel.com, kraxel@redhat.com, sebastien.boeuf@intel.com Subject: [edk2-devel] [PATCH v4 1/7] OvmfPkg: Make the Xen ELF header generator more flexible Date: Fri, 25 Feb 2022 11:45:27 +0100 Message-Id: <4f290a7448a1a8466fb5cd77b55ac594ca8f73bb.1645785801.git.sebastien.boeuf@intel.com> In-Reply-To: References: MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: List-Subscribe: List-Help: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,sebastien.boeuf@intel.com X-Gm-Message-State: F33kbu5CbcIwQiFHqWeAEltjx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1645785953; bh=W5xu2RCpuvI3Kl3WXFmV0p1miHghIIfKjsi/2UW9c6o=; h=Cc:Content-Type:Date:From:Reply-To:Subject:To; b=Lqfg/o9OaTMz7G1W6msUwX8vRsukRvJmU+IIqrVX2v0Mj7wMnD4xhZGq1rPxi3LQ/Pw wgmkyqdrW5fmd91K+2BvhS6EHED+j4Wz/x6eqz9osh1NWCTpsU3BUG941h1aoAZd773p1 XqpXLV7ZXFH8Kp2s4L0UttGreZb8ZpvKthg= X-ZohoMail-DKIM: pass (identity @groups.io) X-ZM-MESSAGEID: 1645785954609100001 Content-Type: text/plain; charset="utf-8" From: Sebastien Boeuf Adding some flexibility to the program through optional parameters and global define, so that other targets can use the generator. * A global define is added so that we can choose at build time if we want to use 32-bit or 64-bit base structures. * A first optional parameter is added so the user can provide the expected blob size of the generated binary. * A second optional parameter is added so the user can specify an output file to which the generated output will be printed. The default behavior isn't modified. Acked-by: Gerd Hoffmann Signed-off-by: Sebastien Boeuf --- OvmfPkg/OvmfXenElfHeaderGenerator.c | 141 +++++++++++++++++++++------- 1 file changed, 109 insertions(+), 32 deletions(-) diff --git a/OvmfPkg/OvmfXenElfHeaderGenerator.c b/OvmfPkg/OvmfXenElfHeader= Generator.c index 489060cdad..672129b85d 100644 --- a/OvmfPkg/OvmfXenElfHeaderGenerator.c +++ b/OvmfPkg/OvmfXenElfHeaderGenerator.c @@ -10,19 +10,31 @@ **/ =20 #include "elf.h" -#include "stdio.h" +#include "fcntl.h" +#include "stdbool.h" #include "stddef.h" +#include "stdio.h" +#include "stdlib.h" =20 void print_hdr ( + FILE *file, void *s, - size_t size + size_t size, + bool end_delimiter ) { char *c =3D s; =20 - while (size--) { - printf ("0x%02hhx, ", *(c++)); + fprintf (file, " "); + while (size-- > 1) { + fprintf (file, "0x%02hhx, ", *(c++)); + } + + if (end_delimiter) { + fprintf (file, "0x%02hhx,", *c); + } else { + fprintf (file, "0x%02hhx", *c); } } =20 @@ -36,34 +48,79 @@ typedef struct { uint32_t desc; } xen_elfnote_phys32_entry; =20 +#define LICENSE_HDR "\ +## @file\r\n\ +# FDF include file that defines a PVH ELF header.\r\n\ +#\r\n\ +# Copyright (c) 2022, Intel Corporation. All rights reserved.\r\n\ +#\r\n\ +# SPDX-License-Identifier: BSD-2-Clause-Patent\r\n\ +#\r\n\ +##\r\n\ +\r\n\ +" + int main ( - void + int argc, + char *argv[] ) { /* FW_SIZE */ size_t ovmf_blob_size =3D 0x00200000; /* Load OVMF at 1MB when running as PVH guest */ uint32_t ovmf_base_address =3D 0x00100000; + uint32_t ovmfxen_pvh_entry_point; + size_t offset_into_file =3D 0; + char *endptr, *str; + long param; + FILE *file =3D stdout; + + /* Parse the size parameter */ + if (argc > 1) { + str =3D argv[1]; + param =3D strtol (str, &endptr, 10); + if (endptr !=3D str) { + ovmf_blob_size =3D (size_t)param; + } + } + + /* Parse the filepath parameter */ + if (argc > 2) { + file =3D fopen (argv[2], "w"); + fprintf (file, LICENSE_HDR); + } + /* Xen PVH entry point */ - uint32_t ovmfxen_pvh_entry_point =3D ovmf_base_address + ovmf_blob_size= - 0x30; - size_t offset_into_file =3D 0; + ovmfxen_pvh_entry_point =3D ovmf_base_address + ovmf_blob_size - 0x30; =20 /* ELF file header */ + #ifdef PVH64 + Elf64_Ehdr hdr =3D { + #else Elf32_Ehdr hdr =3D { - .e_ident =3D ELFMAG, - .e_type =3D ET_EXEC, - .e_machine =3D EM_386, - .e_version =3D EV_CURRENT, - .e_entry =3D ovmfxen_pvh_entry_point, - .e_flags =3D R_386_NONE, - .e_ehsize =3D sizeof (hdr), + #endif + .e_ident =3D ELFMAG, + .e_type =3D ET_EXEC, + .e_machine =3D EM_386, + .e_version =3D EV_CURRENT, + .e_entry =3D ovmfxen_pvh_entry_point, + .e_flags =3D R_386_NONE, + .e_ehsize =3D sizeof (hdr), + #ifdef PVH64 + .e_phentsize =3D sizeof (Elf64_Phdr), + #else .e_phentsize =3D sizeof (Elf32_Phdr), + #endif }; =20 offset_into_file +=3D sizeof (hdr); =20 - hdr.e_ident[EI_CLASS] =3D ELFCLASS32; + #ifdef PVH64 + hdr.e_ident[EI_CLASS] =3D ELFCLASS64; + #else + hdr.e_ident[EI_CLASS] =3D ELFCLASS32; + #endif hdr.e_ident[EI_DATA] =3D ELFDATA2LSB; hdr.e_ident[EI_VERSION] =3D EV_CURRENT; hdr.e_ident[EI_OSABI] =3D ELFOSABI_LINUX; @@ -71,14 +128,22 @@ main ( hdr.e_phoff =3D sizeof (hdr); =20 /* program header */ + #ifdef PVH64 + Elf64_Phdr phdr_load =3D { + #else Elf32_Phdr phdr_load =3D { + #endif .p_type =3D PT_LOAD, .p_offset =3D 0, /* load everything */ .p_paddr =3D ovmf_base_address, .p_filesz =3D ovmf_blob_size, .p_memsz =3D ovmf_blob_size, .p_flags =3D PF_X | PF_W | PF_R, + #ifdef PVH64 + .p_align =3D 4, + #else .p_align =3D 0, + #endif }; =20 phdr_load.p_vaddr =3D phdr_load.p_paddr; @@ -98,12 +163,20 @@ main ( sizeof (xen_elfnote_phys32_entry) - offsetof (xen_elfnote_phys32_entry, desc), }; - Elf32_Phdr phdr_note =3D { + #ifdef PVH64 + Elf64_Phdr phdr_note =3D { + #else + Elf32_Phdr phdr_note =3D { + #endif .p_type =3D PT_NOTE, .p_filesz =3D sizeof (xen_elf_note), .p_memsz =3D sizeof (xen_elf_note), .p_flags =3D PF_R, + #ifdef PVH64 + .p_align =3D 4, + #else .p_align =3D 0, + #endif }; =20 hdr.e_phnum +=3D 1; @@ -120,31 +193,35 @@ main ( size_t hdr_size =3D sizeof (hdr); size_t entry_off =3D offsetof (typeof(hdr), e_entry); =20 - printf ("# ELF file header\n"); - print_hdr (&hdr, entry_off); - printf ("\n"); - print_hdr (&hdr.e_entry, sizeof (hdr.e_entry)); - printf (" # hdr.e_entry\n"); - print_hdr (&hdr.e_entry + 1, hdr_size - entry_off - sizeof (hdr.e_entry)= ); + fprintf (file, "DATA =3D {\r\n"); =20 - printf ("\n\n# ELF Program segment headers\n"); - printf ("# - Load segment\n"); + fprintf (file, " # ELF file header\r\n"); + print_hdr (file, &hdr, entry_off, true); + fprintf (file, "\r\n"); + print_hdr (file, &hdr.e_entry, sizeof (hdr.e_entry), true); + fprintf (file, " # hdr.e_entry\r\n"); + print_hdr (file, &hdr.e_entry + 1, hdr_size - entry_off - sizeof (hdr.e_= entry), true); + + fprintf (file, "\r\n\r\n # ELF Program segment headers\r\n"); + fprintf (file, " # - Load segment\r\n"); for (i =3D 0; i < sizeof (phdr_load); i +=3D 4) { - print_hdr (((char *)&phdr_load) + i, 4); - printf ("\n"); + print_hdr (file, ((char *)&phdr_load) + i, 4, true); + fprintf (file, "\r\n"); } =20 - printf ("# - ELFNOTE segment\n"); + fprintf (file, " # - ELFNOTE segment\r\n"); for (i =3D 0; i < sizeof (phdr_note); i +=3D 4) { - print_hdr (((char *)&phdr_note) + i, 4); - printf ("\n"); + print_hdr (file, ((char *)&phdr_note) + i, 4, true); + fprintf (file, "\r\n"); } =20 - printf ("\n# XEN_ELFNOTE_PHYS32_ENTRY\n"); + fprintf (file, "\r\n # XEN_ELFNOTE_PHYS32_ENTRY\r\n"); for (i =3D 0; i < sizeof (xen_elf_note); i +=3D 4) { - print_hdr (((char *)&xen_elf_note) + i, 4); - printf ("\n"); + print_hdr (file, ((char *)&xen_elf_note) + i, 4, (sizeof (xen_elf_note= ) - i) > 4); + fprintf (file, "\r\n"); } =20 + fprintf (file, "}\r\n"); + return 0; } --=20 2.32.0 --------------------------------------------------------------------- Intel Corporation SAS (French simplified joint stock company) Registered headquarters: "Les Montalets"- 2, rue de Paris,=20 92196 Meudon Cedex, France Registration Number: 302 456 199 R.C.S. NANTERRE Capital: 4,572,000 Euros This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). Any review or distribution by others is strictly prohibited. If you are not the intended recipient, please contact the sender and delete all copies. -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#87009): https://edk2.groups.io/g/devel/message/87009 Mute This Topic: https://groups.io/mt/89385941/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-