aboutsummaryrefslogtreecommitdiff
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
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.
-rw-r--r--bfd/ChangeLog12
-rw-r--r--bfd/elf-linker-x86.h28
-rw-r--r--bfd/elfxx-x86.c97
-rw-r--r--binutils/ChangeLog13
-rw-r--r--binutils/NEWS2
-rw-r--r--binutils/doc/binutils.texi3
-rw-r--r--binutils/elfedit.c8
-rw-r--r--binutils/readelf.c6
-rw-r--r--binutils/testsuite/binutils-all/x86-64/lam-u48.d12
-rw-r--r--binutils/testsuite/binutils-all/x86-64/lam-u48.s27
-rw-r--r--binutils/testsuite/binutils-all/x86-64/lam-u57.d12
-rw-r--r--binutils/testsuite/binutils-all/x86-64/lam-u57.s27
-rw-r--r--include/ChangeLog5
-rw-r--r--include/elf/common.h2
-rw-r--r--ld/ChangeLog25
-rw-r--r--ld/NEWS13
-rw-r--r--ld/emulparams/cet.sh14
-rw-r--r--ld/emulparams/elf_x86_64.sh1
-rw-r--r--ld/emulparams/x86-64-lam.sh69
-rw-r--r--ld/ld.texi44
-rw-r--r--ld/testsuite/ld-x86-64/property-x86-lam-u48-1a.d11
-rw-r--r--ld/testsuite/ld-x86-64/property-x86-lam-u48-1b.d11
-rw-r--r--ld/testsuite/ld-x86-64/property-x86-lam-u48-2.d11
-rw-r--r--ld/testsuite/ld-x86-64/property-x86-lam-u48-3a.d12
-rw-r--r--ld/testsuite/ld-x86-64/property-x86-lam-u48-3b.d12
-rw-r--r--ld/testsuite/ld-x86-64/property-x86-lam-u48-4.d11
-rw-r--r--ld/testsuite/ld-x86-64/property-x86-lam-u48-5.d11
-rw-r--r--ld/testsuite/ld-x86-64/property-x86-lam-u48.s27
-rw-r--r--ld/testsuite/ld-x86-64/property-x86-lam-u57-1a.d11
-rw-r--r--ld/testsuite/ld-x86-64/property-x86-lam-u57-1b.d11
-rw-r--r--ld/testsuite/ld-x86-64/property-x86-lam-u57-2.d11
-rw-r--r--ld/testsuite/ld-x86-64/property-x86-lam-u57-3a.d12
-rw-r--r--ld/testsuite/ld-x86-64/property-x86-lam-u57-3b.d12
-rw-r--r--ld/testsuite/ld-x86-64/property-x86-lam-u57-4.d11
-rw-r--r--ld/testsuite/ld-x86-64/property-x86-lam-u57-5.d11
-rw-r--r--ld/testsuite/ld-x86-64/property-x86-lam-u57.s27
-rw-r--r--ld/testsuite/ld-x86-64/x86-64.exp14
37 files changed, 609 insertions, 37 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)
diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index 885b470..298c28c 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -1,3 +1,16 @@
+2020-12-23 H.J. Lu <hongjiu.lu@intel.com>
+
+ * 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.
+
2020-12-15 Vivek Das Mohapatra <vivek@collabora.com>
* readelf.c (get_dynamic_type): Handle DT_GNU_FLAGS_1.
diff --git a/binutils/NEWS b/binutils/NEWS
index a5a3195..20b73f5 100644
--- a/binutils/NEWS
+++ b/binutils/NEWS
@@ -1,5 +1,7 @@
-*- text -*-
+* Update elfedit and readelf with LAM_U48 and LAM_U57 support.
+
* Nm has a new command line option: --ifunc-chars=CHARS. This specifies a
string of one or two characters. The first character is used as the type
character when displaying global ifunc symbols. The second character, if
diff --git a/binutils/doc/binutils.texi b/binutils/doc/binutils.texi
index 671694f..0ed3548 100644
--- a/binutils/doc/binutils.texi
+++ b/binutils/doc/binutils.texi
@@ -5117,7 +5117,8 @@ supported ELF OSABI are the same as @option{--input-osabi}.
@item --enable-x86-feature=@var{feature}
Set the @var{feature} bit in program property in @var{exec} or @var{dyn}
ELF files with machine types of @var{i386} or @var{x86-64}. The
-supported features are, @var{ibt} and @var{shstk}.
+supported features are, @var{ibt}, @var{shstk}, @var{lam_u48} and
+@var{lam_u57}.
@item --disable-x86-feature=@var{feature}
Clear the @var{feature} bit in program property in @var{exec} or
diff --git a/binutils/elfedit.c b/binutils/elfedit.c
index 55474ff..dc2f722 100644
--- a/binutils/elfedit.c
+++ b/binutils/elfedit.c
@@ -260,6 +260,10 @@ elf_x86_feature (const char *feature, int enable)
x86_feature = GNU_PROPERTY_X86_FEATURE_1_IBT;
else if (strcasecmp (feature, "shstk") == 0)
x86_feature = GNU_PROPERTY_X86_FEATURE_1_SHSTK;
+ else if (strcasecmp (feature, "lam_u48") == 0)
+ x86_feature = GNU_PROPERTY_X86_FEATURE_1_LAM_U48;
+ else if (strcasecmp (feature, "lam_u57") == 0)
+ x86_feature = GNU_PROPERTY_X86_FEATURE_1_LAM_U57;
else
{
error (_("Unknown x86 feature: %s\n"), feature);
@@ -920,9 +924,9 @@ usage (FILE *stream, int exit_status)
osabi, osabi);
#ifdef HAVE_MMAP
fprintf (stream, _("\
- --enable-x86-feature [ibt|shstk]\n\
+ --enable-x86-feature [ibt|shstk|lam_u48|lam_u57]\n\
Enable x86 feature\n\
- --disable-x86-feature [ibt|shstk]\n\
+ --disable-x86-feature [ibt|shstk|lam_u48|lam_u57]\n\
Disable x86 feature\n"));
#endif
fprintf (stream, _("\
diff --git a/binutils/readelf.c b/binutils/readelf.c
index 22354ba..46fd87a 100644
--- a/binutils/readelf.c
+++ b/binutils/readelf.c
@@ -18748,6 +18748,12 @@ decode_x86_feature_1 (unsigned int bitmask)
case GNU_PROPERTY_X86_FEATURE_1_SHSTK:
printf ("SHSTK");
break;
+ case GNU_PROPERTY_X86_FEATURE_1_LAM_U48:
+ printf ("LAM_U48");
+ break;
+ case GNU_PROPERTY_X86_FEATURE_1_LAM_U57:
+ printf ("LAM_U57");
+ break;
default:
printf (_("<unknown: %x>"), bit);
break;
diff --git a/binutils/testsuite/binutils-all/x86-64/lam-u48.d b/binutils/testsuite/binutils-all/x86-64/lam-u48.d
new file mode 100644
index 0000000..92d7d81
--- /dev/null
+++ b/binutils/testsuite/binutils-all/x86-64/lam-u48.d
@@ -0,0 +1,12 @@
+#PROG: objcopy
+#as: --64 -defsym __64_bit__=1 -mx86-used-note=yes
+#objcopy:
+#readelf: -n
+
+Displaying notes found in: .note.gnu.property
+[ ]+Owner[ ]+Data size[ ]+Description
+ GNU 0x00000010 NT_GNU_PROPERTY_TYPE_0
+ Properties: x86 feature: LAM_U48
+ GNU 0x00000020 NT_GNU_PROPERTY_TYPE_0
+ Properties: x86 ISA used:
+ x86 feature used: x86
diff --git a/binutils/testsuite/binutils-all/x86-64/lam-u48.s b/binutils/testsuite/binutils-all/x86-64/lam-u48.s
new file mode 100644
index 0000000..52db75f
--- /dev/null
+++ b/binutils/testsuite/binutils-all/x86-64/lam-u48.s
@@ -0,0 +1,27 @@
+ .section ".note.gnu.property", "a"
+.ifdef __64_bit__
+ .p2align 3
+.else
+ .p2align 2
+.endif
+ .long 1f - 0f /* name length */
+ .long 5f - 2f /* data length */
+ .long 5 /* note type */
+0: .asciz "GNU" /* vendor name */
+1:
+.ifdef __64_bit__
+ .p2align 3
+.else
+ .p2align 2
+.endif
+2: .long 0xc0000002 /* pr_type. */
+ .long 4f - 3f /* pr_datasz. */
+3:
+ .long 0x4
+4:
+.ifdef __64_bit__
+ .p2align 3
+.else
+ .p2align 2
+.endif
+5:
diff --git a/binutils/testsuite/binutils-all/x86-64/lam-u57.d b/binutils/testsuite/binutils-all/x86-64/lam-u57.d
new file mode 100644
index 0000000..c922075
--- /dev/null
+++ b/binutils/testsuite/binutils-all/x86-64/lam-u57.d
@@ -0,0 +1,12 @@
+#PROG: objcopy
+#as: --64 -defsym __64_bit__=1 -mx86-used-note=yes
+#objcopy:
+#readelf: -n
+
+Displaying notes found in: .note.gnu.property
+[ ]+Owner[ ]+Data size[ ]+Description
+ GNU 0x00000010 NT_GNU_PROPERTY_TYPE_0
+ Properties: x86 feature: LAM_U57
+ GNU 0x00000020 NT_GNU_PROPERTY_TYPE_0
+ Properties: x86 ISA used:
+ x86 feature used: x86
diff --git a/binutils/testsuite/binutils-all/x86-64/lam-u57.s b/binutils/testsuite/binutils-all/x86-64/lam-u57.s
new file mode 100644
index 0000000..d53098d
--- /dev/null
+++ b/binutils/testsuite/binutils-all/x86-64/lam-u57.s
@@ -0,0 +1,27 @@
+ .section ".note.gnu.property", "a"
+.ifdef __64_bit__
+ .p2align 3
+.else
+ .p2align 2
+.endif
+ .long 1f - 0f /* name length */
+ .long 5f - 2f /* data length */
+ .long 5 /* note type */
+0: .asciz "GNU" /* vendor name */
+1:
+.ifdef __64_bit__
+ .p2align 3
+.else
+ .p2align 2
+.endif
+2: .long 0xc0000002 /* pr_type. */
+ .long 4f - 3f /* pr_datasz. */
+3:
+ .long 0x8
+4:
+.ifdef __64_bit__
+ .p2align 3
+.else
+ .p2align 2
+.endif
+5:
diff --git a/include/ChangeLog b/include/ChangeLog
index 933e7da..976b361 100644
--- a/include/ChangeLog
+++ b/include/ChangeLog
@@ -1,3 +1,8 @@
+2020-12-23 H.J. Lu <hongjiu.lu@intel.com>
+
+ * elf/common.h (GNU_PROPERTY_X86_FEATURE_1_LAM_U48): New.
+ (GNU_PROPERTY_X86_FEATURE_1_LAM_U57): Likewise.
+
2020-12-18 Alan Modra <amodra@gmail.com>
* xtensa-isa-internal.h (xtisa_errno, xtisa_error_msg): Delete.
diff --git a/include/elf/common.h b/include/elf/common.h
index 4d3718a..39e1a3f 100644
--- a/include/elf/common.h
+++ b/include/elf/common.h
@@ -842,6 +842,8 @@
#define GNU_PROPERTY_X86_FEATURE_1_IBT (1U << 0)
#define GNU_PROPERTY_X86_FEATURE_1_SHSTK (1U << 1)
+#define GNU_PROPERTY_X86_FEATURE_1_LAM_U48 (1U << 2)
+#define GNU_PROPERTY_X86_FEATURE_1_LAM_U57 (1U << 3)
#define GNU_PROPERTY_X86_FEATURE_2_X86 (1U << 0)
#define GNU_PROPERTY_X86_FEATURE_2_X87 (1U << 1)
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 05eaada..c34409c 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,28 @@
+2020-12-23 H.J. Lu <hongjiu.lu@intel.com>
+
+ * 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.
+
2020-12-18 H.J. Lu <hongjiu.lu@intel.com>
PR ld/27082
diff --git a/ld/NEWS b/ld/NEWS
index 1c3f9c1..a5c0d7a 100644
--- a/ld/NEWS
+++ b/ld/NEWS
@@ -8,6 +8,19 @@
encountered. This option can be suppressed via the configure time
switch: --enable-error-handling-script=no.
+* Add -z lam-u48 to x86-64 ELF linker to generate LAM_U48 property.
+
+* Add -z lam-u57 to x86-64 ELF linker to enerate LAM_U57 property.
+
+* Add -z lam-u48-report=[none|warning|error] to report missing LAM_U48
+ property.
+
+* Add -z lam-u57-report=[none|warning|error] to report missing LAM_U57
+ property.
+
+* Add -z lam-report=[none|warning|error] to report missing LAM_U48 and
+ LAM_U57 properties.
+
* Add -z x86-64-{baseline|v[234]} to the x86 ELF linker to mark
x86-64-{baseline|v[234]} ISA level as needed.
diff --git a/ld/emulparams/cet.sh b/ld/emulparams/cet.sh
index f9a83ec..d9e81df 100644
--- a/ld/emulparams/cet.sh
+++ b/ld/emulparams/cet.sh
@@ -19,15 +19,15 @@ PARSE_AND_LIST_ARGS_CASE_Z_CET='
else if (strncmp (optarg, "cet-report=", 11) == 0)
{
if (strcmp (optarg + 11, "none") == 0)
- params.cet_report = cet_report_none;
+ params.cet_report = prop_report_none;
else if (strcmp (optarg + 11, "warning") == 0)
- params.cet_report = (cet_report_warning
- | cet_report_ibt
- | cet_report_shstk);
+ params.cet_report = (prop_report_warning
+ | prop_report_ibt
+ | prop_report_shstk);
else if (strcmp (optarg + 11, "error") == 0)
- params.cet_report = (cet_report_error
- | cet_report_ibt
- | cet_report_shstk);
+ params.cet_report = (prop_report_error
+ | prop_report_ibt
+ | prop_report_shstk);
else
einfo (_("%F%P: invalid option for -z cet-report=: %s\n"),
optarg + 11);
diff --git a/ld/emulparams/elf_x86_64.sh b/ld/emulparams/elf_x86_64.sh
index 5996055..664ff18 100644
--- a/ld/emulparams/elf_x86_64.sh
+++ b/ld/emulparams/elf_x86_64.sh
@@ -5,6 +5,7 @@ source_sh ${srcdir}/emulparams/reloc_overflow.sh
source_sh ${srcdir}/emulparams/call_nop.sh
source_sh ${srcdir}/emulparams/cet.sh
source_sh ${srcdir}/emulparams/x86-64-level.sh
+source_sh ${srcdir}/emulparams/x86-64-lam.sh
source_sh ${srcdir}/emulparams/static.sh
SCRIPT_NAME=elf
ELFSIZE=64
diff --git a/ld/emulparams/x86-64-lam.sh b/ld/emulparams/x86-64-lam.sh
new file mode 100644
index 0000000..40ddb05
--- /dev/null
+++ b/ld/emulparams/x86-64-lam.sh
@@ -0,0 +1,69 @@
+PARSE_AND_LIST_OPTIONS_LAM='
+ fprintf (file, _("\
+ -z lam-u48 Generate GNU_PROPERTY_X86_FEATURE_1_LAM_U48\n"));
+ fprintf (file, _("\
+ -z lam-u48-report=[none|warning|error] (default: none)\n\
+ Report missing LAM_U48 property\n"));
+ fprintf (file, _("\
+ -z lam-u57 Generate GNU_PROPERTY_X86_FEATURE_1_LAM_U57\n"));
+ fprintf (file, _("\
+ -z lam-u57-report=[none|warning|error] (default: none)\n\
+ Report missing LAM_U57 property\n"));
+ fprintf (file, _("\
+ -z lam-report=[none|warning|error] (default: none)\n\
+ Report missing LAM_U48 and LAM_U57 properties\n"));
+'
+PARSE_AND_LIST_ARGS_CASE_Z_LAM='
+ else if (strcmp (optarg, "lam-u48") == 0)
+ params.lam_u48 = TRUE;
+ else if (strncmp (optarg, "lam-u48-report=", 15) == 0)
+ {
+ if (strcmp (optarg + 15, "none") == 0)
+ params.lam_u48_report = prop_report_none;
+ else if (strcmp (optarg + 15, "warning") == 0)
+ params.lam_u48_report = prop_report_warning;
+ else if (strcmp (optarg + 15, "error") == 0)
+ params.lam_u48_report = prop_report_error;
+ else
+ einfo (_("%F%P: invalid option for -z lam-u48-report=: %s\n"),
+ optarg + 15);
+ }
+ else if (strcmp (optarg, "lam-u57") == 0)
+ params.lam_u57 = TRUE;
+ else if (strncmp (optarg, "lam-u57-report=", 15) == 0)
+ {
+ if (strcmp (optarg + 15, "none") == 0)
+ params.lam_u57_report = prop_report_none;
+ else if (strcmp (optarg + 15, "warning") == 0)
+ params.lam_u57_report = prop_report_warning;
+ else if (strcmp (optarg + 15, "error") == 0)
+ params.lam_u57_report = prop_report_error;
+ else
+ einfo (_("%F%P: invalid option for -z lam-u57-report=: %s\n"),
+ optarg + 15);
+ }
+ else if (strncmp (optarg, "lam-report=", 11) == 0)
+ {
+ if (strcmp (optarg + 11, "none") == 0)
+ {
+ params.lam_u48_report = prop_report_none;
+ params.lam_u57_report = prop_report_none;
+ }
+ else if (strcmp (optarg + 11, "warning") == 0)
+ {
+ params.lam_u48_report = prop_report_warning;
+ params.lam_u57_report = prop_report_warning;
+ }
+ else if (strcmp (optarg + 11, "error") == 0)
+ {
+ params.lam_u48_report = prop_report_error;
+ params.lam_u57_report = prop_report_error;
+ }
+ else
+ einfo (_("%F%P: invalid option for -z lam-report=: %s\n"),
+ optarg + 11);
+ }
+'
+
+PARSE_AND_LIST_OPTIONS="$PARSE_AND_LIST_OPTIONS $PARSE_AND_LIST_OPTIONS_LAM"
+PARSE_AND_LIST_ARGS_CASE_Z="$PARSE_AND_LIST_ARGS_CASE_Z $PARSE_AND_LIST_ARGS_CASE_Z_LAM"
diff --git a/ld/ld.texi b/ld/ld.texi
index 88b1687..98609a0 100644
--- a/ld/ld.texi
+++ b/ld/ld.texi
@@ -1316,6 +1316,50 @@ al which do not usually function correctly unless they are the sole instances
of themselves. This behaviour can be overridden by the @code{dlmopen} caller
and does not apply to certain loading mechanisms (such as audit libraries).
+@item lam-u48
+Generate GNU_PROPERTY_X86_FEATURE_1_LAM_U48 in .note.gnu.property section
+to indicate compatibility with Intel LAM_U48. Supported for Linux/x86_64.
+
+@item lam-u57
+Generate GNU_PROPERTY_X86_FEATURE_1_LAM_U57 in .note.gnu.property section
+to indicate compatibility with Intel LAM_U57. Supported for Linux/x86_64.
+
+@item lam-u48-report=none
+@itemx lam-u48-report=warning
+@itemx lam-u48-report=error
+Specify how to report the missing GNU_PROPERTY_X86_FEATURE_1_LAM_U48
+property in input .note.gnu.property section.
+@option{lam-u48-report=none}, which is the default, will make the
+linker not report missing properties in input files.
+@option{lam-u48-report=warning} will make the linker issue a warning for
+missing properties in input files. @option{lam-u48-report=error} will
+make the linker issue an error for missing properties in input files.
+Supported for Linux/x86_64.
+
+@item lam-u57-report=none
+@itemx lam-u57-report=warning
+@itemx lam-u57-report=error
+Specify how to report the missing GNU_PROPERTY_X86_FEATURE_1_LAM_U57
+property in input .note.gnu.property section.
+@option{lam-u57-report=none}, which is the default, will make the
+linker not report missing properties in input files.
+@option{lam-u57-report=warning} will make the linker issue a warning for
+missing properties in input files. @option{lam-u57-report=error} will
+make the linker issue an error for missing properties in input files.
+Supported for Linux/x86_64.
+
+@item lam-report=none
+@itemx lam-report=warning
+@itemx lam-report=error
+Specify how to report the missing GNU_PROPERTY_X86_FEATURE_1_LAM_U48 and
+GNU_PROPERTY_X86_FEATURE_1_LAM_U57 properties in input .note.gnu.property
+section. @option{lam-report=none}, which is the default, will make the
+linker not report missing properties in input files.
+@option{lam-report=warning} will make the linker issue a warning for
+missing properties in input files. @option{lam-report=error} will make
+the linker issue an error for missing properties in input files.
+Supported for Linux/x86_64.
+
@item lazy
When generating an executable or shared library, mark it to tell the
dynamic linker to defer function call resolution to the point when
diff --git a/ld/testsuite/ld-x86-64/property-x86-lam-u48-1a.d b/ld/testsuite/ld-x86-64/property-x86-lam-u48-1a.d
new file mode 100644
index 0000000..5c46f6e
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/property-x86-lam-u48-1a.d
@@ -0,0 +1,11 @@
+#source: property-x86-empty.s
+#source: property-x86-lam-u48.s
+#as: --64 -defsym __64_bit__=1 -mx86-used-note=yes
+#ld: -r -melf_x86_64
+#readelf: -n
+
+Displaying notes found in: .note.gnu.property
+[ ]+Owner[ ]+Data size[ ]+Description
+ GNU 0x00000020 NT_GNU_PROPERTY_TYPE_0
+ Properties: x86 feature used: x86
+ x86 ISA used:
diff --git a/ld/testsuite/ld-x86-64/property-x86-lam-u48-1b.d b/ld/testsuite/ld-x86-64/property-x86-lam-u48-1b.d
new file mode 100644
index 0000000..ed083fb
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/property-x86-lam-u48-1b.d
@@ -0,0 +1,11 @@
+#source: property-x86-lam-u48.s
+#source: property-x86-empty.s
+#as: --64 -defsym __64_bit__=1 -mx86-used-note=yes
+#ld: -r -melf_x86_64
+#readelf: -n
+
+Displaying notes found in: .note.gnu.property
+[ ]+Owner[ ]+Data size[ ]+Description
+ GNU 0x00000020 NT_GNU_PROPERTY_TYPE_0
+ Properties: x86 feature used: x86
+ x86 ISA used:
diff --git a/ld/testsuite/ld-x86-64/property-x86-lam-u48-2.d b/ld/testsuite/ld-x86-64/property-x86-lam-u48-2.d
new file mode 100644
index 0000000..7e9c50e
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/property-x86-lam-u48-2.d
@@ -0,0 +1,11 @@
+#source: property-x86-lam-u48.s
+#as: --64 -defsym __64_bit__=1 -mx86-used-note=yes
+#ld: -r -melf_x86_64
+#readelf: -n
+
+Displaying notes found in: .note.gnu.property
+[ ]+Owner[ ]+Data size[ ]+Description
+ GNU 0x00000030 NT_GNU_PROPERTY_TYPE_0
+ Properties: x86 feature: LAM_U48
+ x86 feature used: x86
+ x86 ISA used:
diff --git a/ld/testsuite/ld-x86-64/property-x86-lam-u48-3a.d b/ld/testsuite/ld-x86-64/property-x86-lam-u48-3a.d
new file mode 100644
index 0000000..6e9194a
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/property-x86-lam-u48-3a.d
@@ -0,0 +1,12 @@
+#source: property-x86-3.s
+#source: property-x86-lam-u48.s
+#as: --64 -defsym __64_bit__=1 -mx86-used-note=yes
+#ld: -r -melf_x86_64
+#readelf: -n
+
+Displaying notes found in: .note.gnu.property
+[ ]+Owner[ ]+Data size[ ]+Description
+ GNU 0x00000030 NT_GNU_PROPERTY_TYPE_0
+ Properties: x86 ISA needed: x86-64-baseline, x86-64-v2, <unknown: 10>, <unknown: 20>
+ x86 feature used: x86
+ x86 ISA used: x86-64-v2, x86-64-v4, <unknown: 20>, <unknown: 80>
diff --git a/ld/testsuite/ld-x86-64/property-x86-lam-u48-3b.d b/ld/testsuite/ld-x86-64/property-x86-lam-u48-3b.d
new file mode 100644
index 0000000..1541751
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/property-x86-lam-u48-3b.d
@@ -0,0 +1,12 @@
+#source: property-x86-lam-u48.s
+#source: property-x86-3.s
+#as: --64 -defsym __64_bit__=1 -mx86-used-note=yes
+#ld: -r -melf_x86_64
+#readelf: -n
+
+Displaying notes found in: .note.gnu.property
+[ ]+Owner[ ]+Data size[ ]+Description
+ GNU 0x00000030 NT_GNU_PROPERTY_TYPE_0
+ Properties: x86 ISA needed: x86-64-baseline, x86-64-v2, <unknown: 10>, <unknown: 20>
+ x86 feature used: x86
+ x86 ISA used: x86-64-v2, x86-64-v4, <unknown: 20>, <unknown: 80>
diff --git a/ld/testsuite/ld-x86-64/property-x86-lam-u48-4.d b/ld/testsuite/ld-x86-64/property-x86-lam-u48-4.d
new file mode 100644
index 0000000..82cd7e2
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/property-x86-lam-u48-4.d
@@ -0,0 +1,11 @@
+#source: property-x86-empty.s
+#as: --64 -defsym __64_bit__=1 -mx86-used-note=yes
+#ld: -r -melf_x86_64 -z lam-u48
+#readelf: -n
+
+Displaying notes found in: .note.gnu.property
+[ ]+Owner[ ]+Data size[ ]+Description
+ GNU 0x00000030 NT_GNU_PROPERTY_TYPE_0
+ Properties: x86 feature: LAM_U48
+ x86 feature used: x86
+ x86 ISA used:
diff --git a/ld/testsuite/ld-x86-64/property-x86-lam-u48-5.d b/ld/testsuite/ld-x86-64/property-x86-lam-u48-5.d
new file mode 100644
index 0000000..755d0d5
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/property-x86-lam-u48-5.d
@@ -0,0 +1,11 @@
+#source: start.s
+#as: --64 -defsym __64_bit__=1 -mx86-used-note=yes
+#ld: -r -melf_x86_64 -z lam-u48
+#readelf: -n
+
+Displaying notes found in: .note.gnu.property
+[ ]+Owner[ ]+Data size[ ]+Description
+ GNU 0x00000030 NT_GNU_PROPERTY_TYPE_0
+ Properties: x86 feature: LAM_U48
+ x86 feature used: x86
+ x86 ISA used:
diff --git a/ld/testsuite/ld-x86-64/property-x86-lam-u48.s b/ld/testsuite/ld-x86-64/property-x86-lam-u48.s
new file mode 100644
index 0000000..52db75f
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/property-x86-lam-u48.s
@@ -0,0 +1,27 @@
+ .section ".note.gnu.property", "a"
+.ifdef __64_bit__
+ .p2align 3
+.else
+ .p2align 2
+.endif
+ .long 1f - 0f /* name length */
+ .long 5f - 2f /* data length */
+ .long 5 /* note type */
+0: .asciz "GNU" /* vendor name */
+1:
+.ifdef __64_bit__
+ .p2align 3
+.else
+ .p2align 2
+.endif
+2: .long 0xc0000002 /* pr_type. */
+ .long 4f - 3f /* pr_datasz. */
+3:
+ .long 0x4
+4:
+.ifdef __64_bit__
+ .p2align 3
+.else
+ .p2align 2
+.endif
+5:
diff --git a/ld/testsuite/ld-x86-64/property-x86-lam-u57-1a.d b/ld/testsuite/ld-x86-64/property-x86-lam-u57-1a.d
new file mode 100644
index 0000000..e1c237c
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/property-x86-lam-u57-1a.d
@@ -0,0 +1,11 @@
+#source: property-x86-empty.s
+#source: property-x86-lam-u57.s
+#as: --64 -defsym __64_bit__=1 -mx86-used-note=yes
+#ld: -r -melf_x86_64
+#readelf: -n
+
+Displaying notes found in: .note.gnu.property
+[ ]+Owner[ ]+Data size[ ]+Description
+ GNU 0x00000020 NT_GNU_PROPERTY_TYPE_0
+ Properties: x86 feature used: x86
+ x86 ISA used:
diff --git a/ld/testsuite/ld-x86-64/property-x86-lam-u57-1b.d b/ld/testsuite/ld-x86-64/property-x86-lam-u57-1b.d
new file mode 100644
index 0000000..26eca4a
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/property-x86-lam-u57-1b.d
@@ -0,0 +1,11 @@
+#source: property-x86-lam-u57.s
+#source: property-x86-empty.s
+#as: --64 -defsym __64_bit__=1 -mx86-used-note=yes
+#ld: -r -melf_x86_64
+#readelf: -n
+
+Displaying notes found in: .note.gnu.property
+[ ]+Owner[ ]+Data size[ ]+Description
+ GNU 0x00000020 NT_GNU_PROPERTY_TYPE_0
+ Properties: x86 feature used: x86
+ x86 ISA used:
diff --git a/ld/testsuite/ld-x86-64/property-x86-lam-u57-2.d b/ld/testsuite/ld-x86-64/property-x86-lam-u57-2.d
new file mode 100644
index 0000000..1f1c86a
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/property-x86-lam-u57-2.d
@@ -0,0 +1,11 @@
+#source: property-x86-lam-u57.s
+#as: --64 -defsym __64_bit__=1 -mx86-used-note=yes
+#ld: -r -melf_x86_64
+#readelf: -n
+
+Displaying notes found in: .note.gnu.property
+[ ]+Owner[ ]+Data size[ ]+Description
+ GNU 0x00000030 NT_GNU_PROPERTY_TYPE_0
+ Properties: x86 feature: LAM_U57
+ x86 feature used: x86
+ x86 ISA used:
diff --git a/ld/testsuite/ld-x86-64/property-x86-lam-u57-3a.d b/ld/testsuite/ld-x86-64/property-x86-lam-u57-3a.d
new file mode 100644
index 0000000..fb6289a
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/property-x86-lam-u57-3a.d
@@ -0,0 +1,12 @@
+#source: property-x86-3.s
+#source: property-x86-lam-u57.s
+#as: --64 -defsym __64_bit__=1 -mx86-used-note=yes
+#ld: -r -melf_x86_64
+#readelf: -n
+
+Displaying notes found in: .note.gnu.property
+[ ]+Owner[ ]+Data size[ ]+Description
+ GNU 0x00000030 NT_GNU_PROPERTY_TYPE_0
+ Properties: x86 ISA needed: x86-64-baseline, x86-64-v2, <unknown: 10>, <unknown: 20>
+ x86 feature used: x86
+ x86 ISA used: x86-64-v2, x86-64-v4, <unknown: 20>, <unknown: 80>
diff --git a/ld/testsuite/ld-x86-64/property-x86-lam-u57-3b.d b/ld/testsuite/ld-x86-64/property-x86-lam-u57-3b.d
new file mode 100644
index 0000000..f33818d
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/property-x86-lam-u57-3b.d
@@ -0,0 +1,12 @@
+#source: property-x86-lam-u57.s
+#source: property-x86-3.s
+#as: --64 -defsym __64_bit__=1 -mx86-used-note=yes
+#ld: -r -melf_x86_64
+#readelf: -n
+
+Displaying notes found in: .note.gnu.property
+[ ]+Owner[ ]+Data size[ ]+Description
+ GNU 0x00000030 NT_GNU_PROPERTY_TYPE_0
+ Properties: x86 ISA needed: x86-64-baseline, x86-64-v2, <unknown: 10>, <unknown: 20>
+ x86 feature used: x86
+ x86 ISA used: x86-64-v2, x86-64-v4, <unknown: 20>, <unknown: 80>
diff --git a/ld/testsuite/ld-x86-64/property-x86-lam-u57-4.d b/ld/testsuite/ld-x86-64/property-x86-lam-u57-4.d
new file mode 100644
index 0000000..9f51f89
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/property-x86-lam-u57-4.d
@@ -0,0 +1,11 @@
+#source: property-x86-empty.s
+#as: --64 -defsym __64_bit__=1 -mx86-used-note=yes
+#ld: -r -melf_x86_64 -z lam-u57
+#readelf: -n
+
+Displaying notes found in: .note.gnu.property
+[ ]+Owner[ ]+Data size[ ]+Description
+ GNU 0x00000030 NT_GNU_PROPERTY_TYPE_0
+ Properties: x86 feature: LAM_U57
+ x86 feature used: x86
+ x86 ISA used:
diff --git a/ld/testsuite/ld-x86-64/property-x86-lam-u57-5.d b/ld/testsuite/ld-x86-64/property-x86-lam-u57-5.d
new file mode 100644
index 0000000..d0b69e6
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/property-x86-lam-u57-5.d
@@ -0,0 +1,11 @@
+#source: start.s
+#as: --64 -defsym __64_bit__=1 -mx86-used-note=yes
+#ld: -r -melf_x86_64 -z lam-u57
+#readelf: -n
+
+Displaying notes found in: .note.gnu.property
+[ ]+Owner[ ]+Data size[ ]+Description
+ GNU 0x00000030 NT_GNU_PROPERTY_TYPE_0
+ Properties: x86 feature: LAM_U57
+ x86 feature used: x86
+ x86 ISA used:
diff --git a/ld/testsuite/ld-x86-64/property-x86-lam-u57.s b/ld/testsuite/ld-x86-64/property-x86-lam-u57.s
new file mode 100644
index 0000000..d53098d
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/property-x86-lam-u57.s
@@ -0,0 +1,27 @@
+ .section ".note.gnu.property", "a"
+.ifdef __64_bit__
+ .p2align 3
+.else
+ .p2align 2
+.endif
+ .long 1f - 0f /* name length */
+ .long 5f - 2f /* data length */
+ .long 5 /* note type */
+0: .asciz "GNU" /* vendor name */
+1:
+.ifdef __64_bit__
+ .p2align 3
+.else
+ .p2align 2
+.endif
+2: .long 0xc0000002 /* pr_type. */
+ .long 4f - 3f /* pr_datasz. */
+3:
+ .long 0x8
+4:
+.ifdef __64_bit__
+ .p2align 3
+.else
+ .p2align 2
+.endif
+5:
diff --git a/ld/testsuite/ld-x86-64/x86-64.exp b/ld/testsuite/ld-x86-64/x86-64.exp
index 41d385b..a548a32 100644
--- a/ld/testsuite/ld-x86-64/x86-64.exp
+++ b/ld/testsuite/ld-x86-64/x86-64.exp
@@ -373,6 +373,20 @@ run_dump_test "property-x86-cet5b"
run_dump_test "property-x86-cet5b-x32"
run_dump_test "property-x86-cet6"
run_dump_test "property-x86-cet6-x32"
+run_dump_test "property-x86-lam-u48-1a"
+run_dump_test "property-x86-lam-u48-1b"
+run_dump_test "property-x86-lam-u48-2"
+run_dump_test "property-x86-lam-u48-3a"
+run_dump_test "property-x86-lam-u48-3b"
+run_dump_test "property-x86-lam-u48-4"
+run_dump_test "property-x86-lam-u48-5"
+run_dump_test "property-x86-lam-u57-1a"
+run_dump_test "property-x86-lam-u57-1b"
+run_dump_test "property-x86-lam-u57-2"
+run_dump_test "property-x86-lam-u57-3a"
+run_dump_test "property-x86-lam-u57-3b"
+run_dump_test "property-x86-lam-u57-4"
+run_dump_test "property-x86-lam-u57-5"
run_dump_test "pr21884"
run_dump_test "pr22071"
run_dump_test "pr22115-1a"