aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2020-12-23 13:00:39 -0800
committerH.J. Lu <hjl.tools@gmail.com>2020-12-23 13:00:55 -0800
commit279d901e5a7a16eb9a3383e316ff4a8d7473d6bd (patch)
treee88e5c81e28763605903e0971fa900a2a3a4308b /bfd
parent5cc0917c387350c47c350843e3b7a16059345529 (diff)
downloadgdb-279d901e5a7a16eb9a3383e316ff4a8d7473d6bd.zip
gdb-279d901e5a7a16eb9a3383e316ff4a8d7473d6bd.tar.gz
gdb-279d901e5a7a16eb9a3383e316ff4a8d7473d6bd.tar.bz2
x86-64: Add Intel LAM property support
Add Intel Linear Address Masking (LAM) property support. LAM modifies the checking that is applied to 64-bit linear addresses, allowing software to use of the untranslated address bits for metadata. bfd/ * elf-linker-x86.h (elf_x86_cet_report): Renamed to ... (elf_x86_prop_report): This. (elf_linker_x86_params): Add lam_u48, lam_u57, lam_u48_report and lam_u57_report. * elfxx-x86.c (_bfd_x86_elf_link_setup_gnu_properties): Support GNU_PROPERTY_X86_FEATURE_1_LAM_U48 and GNU_PROPERTY_X86_FEATURE_1_LAM_U57. (_bfd_x86_elf_link_fixup_gnu_properties): Keep LAM features only for 64-bit output. binutils/ * NEWS: Mention LAM_U48 and LAM_U57 support. * elfedit.c (elf_x86_feature): Support lam_u48 and lam_u57. (usage): Add lam_u48 and lam_u57. * readelf.c (decode_x86_feature_1): Support LAM_U48 and LAM_U57. * doc/binutils.texi: Update elfedit with lam_u48 and lam_u57 support. * testsuite/binutils-all/x86-64/lam-u48.d: New file. * testsuite/binutils-all/x86-64/lam-u48.s: Likewise. * testsuite/binutils-all/x86-64/lam-u57.d: Likewise. * testsuite/binutils-all/x86-64/lam-u57.s: Likewise. include/ * elf/common.h (GNU_PROPERTY_X86_FEATURE_1_LAM_U48): New. (GNU_PROPERTY_X86_FEATURE_1_LAM_U57): Likewise. ld/ * NEWS: Mention LAM_U48 and LAM_U57 support. * ld.texi: Document LAM_U48 and LAM_U57 support. * emulparams/cet.sh: Updated. * emulparams/elf_x86_64.sh: Source x86-64-lam.sh. * emulparams/x86-64-lam.sh: New file. * testsuite/ld-x86-64/property-x86-lam-u48-1a.d: Likewise. * testsuite/ld-x86-64/property-x86-lam-u48-1b.d: Likewise. * testsuite/ld-x86-64/property-x86-lam-u48-2.d: Likewise. * testsuite/ld-x86-64/property-x86-lam-u48-3a.d: Likewise. * testsuite/ld-x86-64/property-x86-lam-u48-3b.d: Likewise. * testsuite/ld-x86-64/property-x86-lam-u48-4.d: Likewise. * testsuite/ld-x86-64/property-x86-lam-u48-5.d: Likewise. * testsuite/ld-x86-64/property-x86-lam-u48.s: Likewise. * testsuite/ld-x86-64/property-x86-lam-u57-1a.d: Likewise. * testsuite/ld-x86-64/property-x86-lam-u57-1b.d: Likewise. * testsuite/ld-x86-64/property-x86-lam-u57-2.d: Likewise. * testsuite/ld-x86-64/property-x86-lam-u57-3a.d: Likewise. * testsuite/ld-x86-64/property-x86-lam-u57-3b.d: Likewise. * testsuite/ld-x86-64/property-x86-lam-u57-4.d: Likewise. * testsuite/ld-x86-64/property-x86-lam-u57-5.d: Likewise. * testsuite/ld-x86-64/property-x86-lam-u57.s: Likewise. * testsuite/ld-x86-64/x86-64.exp: Run LAM tests.
Diffstat (limited to 'bfd')
-rw-r--r--bfd/ChangeLog12
-rw-r--r--bfd/elf-linker-x86.h28
-rw-r--r--bfd/elfxx-x86.c97
3 files changed, 110 insertions, 27 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 582add8..0cb006d 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,15 @@
+2020-12-23 H.J. Lu <hongjiu.lu@intel.com>
+
+ * elf-linker-x86.h (elf_x86_cet_report): Renamed to ...
+ (elf_x86_prop_report): This.
+ (elf_linker_x86_params): Add lam_u48, lam_u57, lam_u48_report
+ and lam_u57_report.
+ * elfxx-x86.c (_bfd_x86_elf_link_setup_gnu_properties): Support
+ GNU_PROPERTY_X86_FEATURE_1_LAM_U48 and
+ GNU_PROPERTY_X86_FEATURE_1_LAM_U57.
+ (_bfd_x86_elf_link_fixup_gnu_properties): Keep LAM features only
+ for 64-bit output.
+
2020-12-18 H.J. Lu <hongjiu.lu@intel.com>
PR ld/27091
diff --git a/bfd/elf-linker-x86.h b/bfd/elf-linker-x86.h
index 77e8196..c0f8fab 100644
--- a/bfd/elf-linker-x86.h
+++ b/bfd/elf-linker-x86.h
@@ -18,14 +18,14 @@
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
MA 02110-1301, USA. */
-/* Missing IBT and SHSTK property report control. */
-enum elf_x86_cet_report
+/* Missing IBT, SHSTK and LAM property report control. */
+enum elf_x86_prop_report
{
- cet_report_none = 0, /* Do nothing. */
- cet_report_warning = 1 << 0, /* Issue a warning. */
- cet_report_error = 1 << 1, /* Issue an error. */
- cet_report_ibt = 1 << 2, /* Report missing IBT property. */
- cet_report_shstk = 1 << 3 /* Report missing SHSTK property. */
+ prop_report_none = 0, /* Do nothing. */
+ prop_report_warning = 1 << 0, /* Issue a warning. */
+ prop_report_error = 1 << 1, /* Issue an error. */
+ prop_report_ibt = 1 << 2, /* Report missing IBT property. */
+ prop_report_shstk = 1 << 3 /* Report missing SHSTK property. */
};
/* Used to pass x86-specific linker options from ld to bfd. */
@@ -43,6 +43,12 @@ struct elf_linker_x86_params
/* TRUE if GNU_PROPERTY_X86_FEATURE_1_SHSTK should be generated. */
unsigned int shstk: 1;
+ /* TRUE if GNU_PROPERTY_X86_FEATURE_1_LAM_U48 should be generated. */
+ unsigned int lam_u48: 1;
+
+ /* TRUE if GNU_PROPERTY_X86_FEATURE_1_LAM_U57 should be generated. */
+ unsigned int lam_u57: 1;
+
/* TRUE if we shouldn't check relocation overflow. */
unsigned int no_reloc_overflow_check: 1;
@@ -59,7 +65,13 @@ struct elf_linker_x86_params
unsigned int isa_level;
/* Report missing IBT and SHSTK properties. */
- enum elf_x86_cet_report cet_report;
+ enum elf_x86_prop_report cet_report;
+
+ /* Report missing LAM_U48 property. */
+ enum elf_x86_prop_report lam_u48_report;
+
+ /* Report missing LAM_U57 property. */
+ enum elf_x86_prop_report lam_u57_report;
/* The 1-byte NOP for x86 call instruction. */
char call_nop_byte;
diff --git a/bfd/elfxx-x86.c b/bfd/elfxx-x86.c
index 8246fe5..6c652d5 100644
--- a/bfd/elfxx-x86.c
+++ b/bfd/elfxx-x86.c
@@ -2545,15 +2545,25 @@ _bfd_x86_elf_link_setup_gnu_properties
if (htab->params->ibt)
{
features = GNU_PROPERTY_X86_FEATURE_1_IBT;
- htab->params->cet_report &= ~cet_report_ibt;
+ htab->params->cet_report &= ~prop_report_ibt;
}
if (htab->params->shstk)
{
features |= GNU_PROPERTY_X86_FEATURE_1_SHSTK;
- htab->params->cet_report &= ~cet_report_shstk;
+ htab->params->cet_report &= ~prop_report_shstk;
+ }
+ if (!(htab->params->cet_report & (prop_report_ibt | prop_report_shstk)))
+ htab->params->cet_report = prop_report_none;
+ if (htab->params->lam_u48)
+ {
+ features |= GNU_PROPERTY_X86_FEATURE_1_LAM_U48;
+ htab->params->lam_u48_report = prop_report_none;
+ }
+ if (htab->params->lam_u57)
+ {
+ features |= GNU_PROPERTY_X86_FEATURE_1_LAM_U57;
+ htab->params->lam_u57_report = prop_report_none;
}
- if (!(htab->params->cet_report & (cet_report_ibt | cet_report_shstk)))
- htab->params->cet_report = cet_report_none;
switch (htab->params->isa_level)
{
@@ -2581,8 +2591,10 @@ _bfd_x86_elf_link_setup_gnu_properties
prop = NULL;
if (features)
{
- /* If features is set, add GNU_PROPERTY_X86_FEATURE_1_IBT and
- GNU_PROPERTY_X86_FEATURE_1_SHSTK. */
+ /* If features is set, add GNU_PROPERTY_X86_FEATURE_1_IBT,
+ GNU_PROPERTY_X86_FEATURE_1_SHSTK,
+ GNU_PROPERTY_X86_FEATURE_1_LAM_U48 and
+ GNU_PROPERTY_X86_FEATURE_1_LAM_U57. */
prop = _bfd_elf_get_property (ebfd,
GNU_PROPERTY_X86_FEATURE_1_AND,
4);
@@ -2625,22 +2637,49 @@ _bfd_x86_elf_link_setup_gnu_properties
}
}
- if (htab->params->cet_report)
+ if (htab->params->cet_report
+ || htab->params->lam_u48_report
+ || htab->params->lam_u57_report)
{
- /* Report missing IBT and SHSTK properties. */
+ /* Report missing IBT, SHSTK and LAM properties. */
bfd *abfd;
- const char *msg;
+ const char *warning_msg = _("%P: %pB: warning: missing %s\n");
+ const char *error_msg = _("%X%P: %pB: error: missing %s\n");
+ const char *cet_msg = NULL;
+ const char *lam_u48_msg = NULL;
+ const char *lam_u57_msg = NULL;
+ const char *missing;
elf_property_list *p;
bfd_boolean missing_ibt, missing_shstk;
+ bfd_boolean missing_lam_u48, missing_lam_u57;
bfd_boolean check_ibt
- = !!(htab->params->cet_report & cet_report_ibt);
+ = (htab->params->cet_report
+ && (htab->params->cet_report & prop_report_ibt));
bfd_boolean check_shstk
- = !!(htab->params->cet_report & cet_report_shstk);
+ = (htab->params->cet_report
+ && (htab->params->cet_report & prop_report_shstk));
- if ((htab->params->cet_report & cet_report_warning))
- msg = _("%P: %pB: warning: missing %s\n");
- else
- msg = _("%X%P: %pB: error: missing %s\n");
+ if (htab->params->cet_report)
+ {
+ if ((htab->params->cet_report & prop_report_warning))
+ cet_msg = warning_msg;
+ else
+ cet_msg = error_msg;
+ }
+ if (htab->params->lam_u48_report)
+ {
+ if ((htab->params->lam_u48_report & prop_report_warning))
+ lam_u48_msg = warning_msg;
+ else
+ lam_u48_msg = error_msg;
+ }
+ if (htab->params->lam_u57_report)
+ {
+ if ((htab->params->lam_u57_report & prop_report_warning))
+ lam_u57_msg = warning_msg;
+ else
+ lam_u57_msg = error_msg;
+ }
for (abfd = info->input_bfds; abfd != NULL; abfd = abfd->link.next)
if (!(abfd->flags & (DYNAMIC | BFD_PLUGIN | BFD_LINKER_CREATED))
@@ -2652,23 +2691,38 @@ _bfd_x86_elf_link_setup_gnu_properties
missing_ibt = check_ibt;
missing_shstk = check_shstk;
+ missing_lam_u48 = !!lam_u48_msg;
+ missing_lam_u57 = !!lam_u57_msg;
if (p)
{
missing_ibt &= !(p->property.u.number
& GNU_PROPERTY_X86_FEATURE_1_IBT);
missing_shstk &= !(p->property.u.number
& GNU_PROPERTY_X86_FEATURE_1_SHSTK);
+ missing_lam_u48 &= !(p->property.u.number
+ & GNU_PROPERTY_X86_FEATURE_1_LAM_U48);
+ missing_lam_u57 &= !(p->property.u.number
+ & GNU_PROPERTY_X86_FEATURE_1_LAM_U57);
}
if (missing_ibt || missing_shstk)
{
- const char *missing;
if (missing_ibt && missing_shstk)
missing = _("IBT and SHSTK properties");
else if (missing_ibt)
missing = _("IBT property");
else
missing = _("SHSTK property");
- info->callbacks->einfo (msg, abfd, missing);
+ info->callbacks->einfo (cet_msg, abfd, missing);
+ }
+ if (missing_lam_u48)
+ {
+ missing = _("LAM_U48 property");
+ info->callbacks->einfo (lam_u48_msg, abfd, missing);
+ }
+ if (missing_lam_u57)
+ {
+ missing = _("LAM_U57 property");
+ info->callbacks->einfo (lam_u57_msg, abfd, missing);
}
}
}
@@ -3008,8 +3062,7 @@ _bfd_x86_elf_link_setup_gnu_properties
void
_bfd_x86_elf_link_fixup_gnu_properties
- (struct bfd_link_info *info ATTRIBUTE_UNUSED,
- elf_property_list **listp)
+ (struct bfd_link_info *info, elf_property_list **listp)
{
elf_property_list *p;
@@ -3037,6 +3090,12 @@ _bfd_x86_elf_link_fixup_gnu_properties
continue;
}
+ /* Keep LAM features only for 64-bit output. */
+ if (type == GNU_PROPERTY_X86_FEATURE_1_AND
+ && !ABI_64_P (info->output_bfd))
+ p->property.u.number &= ~(GNU_PROPERTY_X86_FEATURE_1_LAM_U48
+ | GNU_PROPERTY_X86_FEATURE_1_LAM_U57);
+
listp = &p->next;
}
else if (type > GNU_PROPERTY_HIPROC)