From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by mx.groups.io with SMTP id smtpd.web11.105355.1680622837370587779 for ; Tue, 04 Apr 2023 08:40:37 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=AlfI4m2N; spf=pass (domain: kernel.org, ip: 139.178.84.217, mailfrom: ardb@kernel.org) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id B6A1A6361E; Tue, 4 Apr 2023 15:40:36 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 6F311C433D2; Tue, 4 Apr 2023 15:40:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1680622836; bh=L4US/vFHX5gZI3ASaBEOEObSa6IjPEOqKrEWSTBn2wE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=AlfI4m2NXSG3FShxuwCtxvteVTQ2p4iXgSKAbUBW4pLZCRJqGoGgpcxugJOG811bH X5nZnBjuEMAu8IDIvKp6ygvLEsqaTSzwPLmBRihVxI9zs5QlKt51HzNM7N9fARMvzD zhBgCcivP+/+q9SljYwRHMzn4pj4yOeBb8YXXN/gN9FwCD+LCHgJQwlv5nAziZjDms kPGQDZRSpvDKKHhVoSYvDEGP5ybLKZ3RyUw+r6CsMYLzOVnsJaUZ/k1aRmqNUR0Do4 qE8mur9qmpw5ZjxKEPjJkugdUZ5qXBekDQ1BjU7Veoj11Qus6zmTmGzs4fihWgu+5N 83PkgByIEtfMw== From: "Ard Biesheuvel" To: devel@edk2.groups.io Cc: Ard Biesheuvel , Michael Kinney , Liming Gao , Jiewen Yao , Michael Kubacki , Sean Brogan , Rebecca Cran , Leif Lindholm , Sami Mujawar , Taylor Beebe , =?UTF-8?q?Marvin=20H=C3=A4user?= , Bob Feng , Oliver Smith-Denny Subject: [PATCH v3 1/4] BaseTools/GenFw: Parse IBT/BTI support status from ELF note Date: Tue, 4 Apr 2023 17:40:19 +0200 Message-Id: <20230404154022.2776035-2-ardb@kernel.org> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230404154022.2776035-1-ardb@kernel.org> References: <20230404154022.2776035-1-ardb@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable When performing ELF to PE/COFF conversion, parse any notes sections to decide whether the image supports forward CFI landing pads. This will be used to set the associated DllCharacteristicsEx flag in a subsequent patch. Signed-off-by: Ard Biesheuvel Reviewed-by: Leif Lindholm Reviewed-by: Oliver Smith-Denny --- BaseTools/Source/C/GenFw/Elf64Convert.c | 50 ++++++++++++++++++++ BaseTools/Source/C/GenFw/elf_common.h | 9 ++++ 2 files changed, 59 insertions(+) diff --git a/BaseTools/Source/C/GenFw/Elf64Convert.c b/BaseTools/Source/C/G= enFw/Elf64Convert.c index 8b50774beb1eebda..2a810e835d4a4a66 100644 --- a/BaseTools/Source/C/GenFw/Elf64Convert.c +++ b/BaseTools/Source/C/GenFw/Elf64Convert.c @@ -770,6 +770,49 @@ WriteSectionRiscV64 ( }=0D }=0D =0D +STATIC UINT16 mDllCharacteristicsEx;=0D +=0D +STATIC=0D +VOID=0D +ParseNoteSection (=0D + CONST Elf_Shdr *Shdr=0D + )=0D +{=0D + CONST Elf_Note *Note;=0D + CONST UINT32 *Prop;=0D + UINT32 Prop0;=0D + UINT32 Prop2;=0D +=0D + Note =3D (Elf_Note *)((UINT8 *)mEhdr + Shdr->sh_offset);=0D +=0D + if ((Note->n_type =3D=3D NT_GNU_PROPERTY_TYPE_0) &&=0D + (Note->n_namesz =3D=3D sizeof ("GNU")) &&=0D + (strcmp ((CHAR8 *)(Note + 1), "GNU") =3D=3D 0) &&=0D + (Note->n_descsz > sizeof (UINT32[2]))) {=0D + Prop =3D (UINT32 *)((UINT8 *)(Note + 1) + sizeof("GNU"));=0D +=0D + switch (mEhdr->e_machine) {=0D + case EM_AARCH64:=0D + Prop0 =3D GNU_PROPERTY_AARCH64_FEATURE_1_AND;=0D + Prop2 =3D GNU_PROPERTY_AARCH64_FEATURE_1_BTI;=0D + break;=0D +=0D + case EM_X86_64:=0D + Prop0 =3D GNU_PROPERTY_X86_FEATURE_1_AND;=0D + Prop2 =3D GNU_PROPERTY_X86_FEATURE_1_IBT;=0D + break;=0D +=0D + default:=0D + return;=0D + }=0D + if ((Prop[0] =3D=3D Prop0) &&=0D + (Prop[1] >=3D sizeof (UINT32)) &&=0D + ((Prop[2] & Prop2) !=3D 0)) {=0D + mDllCharacteristicsEx |=3D EFI_IMAGE_DLLCHARACTERISTICS_EX_FORWARD_C= FI_COMPAT;=0D + }=0D + }=0D +}=0D +=0D //=0D // Elf functions interface implementation=0D //=0D @@ -826,6 +869,13 @@ ScanSections64 ( }=0D }=0D =0D + for (i =3D 0; i < mEhdr->e_shnum; i++) {=0D + Elf_Shdr *shdr =3D GetShdrByIndex(i);=0D + if (shdr->sh_type =3D=3D SHT_NOTE) {=0D + ParseNoteSection (shdr);=0D + }=0D + }=0D +=0D //=0D // Check if mCoffAlignment is larger than MAX_COFF_ALIGNMENT=0D //=0D diff --git a/BaseTools/Source/C/GenFw/elf_common.h b/BaseTools/Source/C/Gen= Fw/elf_common.h index 7b7fdeb3290dfa88..ccd32804b090a226 100644 --- a/BaseTools/Source/C/GenFw/elf_common.h +++ b/BaseTools/Source/C/GenFw/elf_common.h @@ -59,6 +59,15 @@ typedef struct { UINT32 n_type; /* Type of this note. */=0D } Elf_Note;=0D =0D +#define NT_GNU_PROPERTY_TYPE_0 5=0D +=0D +#define GNU_PROPERTY_X86_FEATURE_1_AND 0xc0000002=0D +#define GNU_PROPERTY_X86_FEATURE_1_IBT 0x1=0D +=0D +#define GNU_PROPERTY_AARCH64_FEATURE_1_AND 0xc0000000=0D +#define GNU_PROPERTY_AARCH64_FEATURE_1_BTI 0x1=0D +#define GNU_PROPERTY_AARCH64_FEATURE_1_PAC 0x2=0D +=0D /* Indexes into the e_ident array. Keep synced with=0D http://www.sco.com/developers/gabi/latest/ch4.eheader.html */=0D #define EI_MAG0 0 /* Magic number, byte 0. */=0D --=20 2.39.2