Skip to contentSkip to conversation

arm64: signal: Report signal frame size to userspace via auxv

PATCH Superseded Dave Martin 2 participants 8 messages May 25, 2018 – Jun 1, 2018

Subsystems (3)

v5 of 6 Superseded Latest is v6 →

lore
Share & tools
lore
#0 lore raw

v5 cover arm64: signal: Report signal frame size to userspace via auxv

This series adds support for telling userspace the size of the signal frame via a new AT_MINSIGSTKSZ entry in the aux vector.

This is an update to [1]. Changes are minor. The main difference is that no attempt is made to give userspace a sensible AT_MINSIGSTKSZ if initialisation goes wrong, since this is indicative of a kernel bug anyway.

See individual patches for the delta.

[1] [PATCH v4 0/2] arm64: signal: Report signal frame size to userspace via auxv
http://lists.infradead.org/pipermail/linux-arm-kernel/2018-May/580284.html

Dave Martin (2):
arm64/sve: Thin out initialisation sanity-checks for sve_max_vl
arm64: signal: Report signal frame size to userspace via auxv

 arch/arm64/include/asm/elf.h         | 11 ++++++++
 arch/arm64/include/asm/processor.h   |  5 ++++
 arch/arm64/include/uapi/asm/auxvec.h |  3 ++-
 arch/arm64/kernel/cpufeature.c       |  1 +
 arch/arm64/kernel/fpsimd.c           | 17 +++---------
 arch/arm64/kernel/ptrace.c           |  3 ---
 arch/arm64/kernel/signal.c           | 52 +++++++++++++++++++++++++++++++-----
 7 files changed, 68 insertions(+), 24 deletions(-)
Signature · 1 line
2.1.4
#1 lore raw

PATCH v5 1/2 arm64/sve: Thin out initialisation sanity-checks for sve_max_vl

Now that the kernel SVE support is reasonably mature, it is excessive to default sve_max_vl to the invalid value -1 and then sprinkle WARN_ON()s around the place to make sure it has been initialised before use. The cpufeatures code already runs pretty early, and will ensure sve_max_vl gets initialised.

This patch initialises sve_max_vl to something sane that will be supported by every SVE implementation, and removes most of the sanity checks.

The checks in find_supported_vector_length() are retained for now. If anything goes horribly wrong, we are likely to trip a check here sooner or later.

---
 arch/arm64/kernel/fpsimd.c | 17 ++++-------------
 arch/arm64/kernel/ptrace.c |  3 ---
 2 files changed, 4 insertions(+), 16 deletions(-)
arch/arm64/kernel/fpsimd.c +4 -13
index 87a3536..f9ec640 100644
@@ -129,7 +129,7 @@ static int sve_default_vl = -1;
 #ifdef CONFIG_ARM64_SVE
 
 /* Maximum supported vector length across all CPUs (initially poisoned) */
-int __ro_after_init sve_max_vl = -1;
+int __ro_after_init sve_max_vl = SVE_VL_MIN;
 /* Set of available vector lengths, as vq_to_bit(vq): */
 static __ro_after_init DECLARE_BITMAP(sve_vq_map, SVE_VQ_MAX);
 static void __percpu *efi_sve_state;
@@ -360,22 +360,13 @@ static int sve_proc_do_default_vl(struct ctl_table *table, int write,
 		return ret;
 
 	/* Writing -1 has the special meaning "set to max": */
-	if (vl == -1) {
-		/* Fail safe if sve_max_vl wasn't initialised */
-		if (WARN_ON(!sve_vl_valid(sve_max_vl)))
-			vl = SVE_VL_MIN;
-		else
-			vl = sve_max_vl;
-
-		goto chosen;
-	}
+	if (vl == -1)
+		vl = sve_max_vl;
 
 	if (!sve_vl_valid(vl))
 		return -EINVAL;
 
-	vl = find_supported_vector_length(vl);
-chosen:
-	sve_default_vl = vl;
+	sve_default_vl = find_supported_vector_length(vl);
 	return 0;
 }
 
arch/arm64/kernel/ptrace.c +0 -3
index 7ff81fe..577deb0 100644
@@ -766,9 +766,6 @@ static void sve_init_header_from_task(struct user_sve_header *header,
 	vq = sve_vq_from_vl(header->vl);
 
 	header->max_vl = sve_max_vl;
-	if (WARN_ON(!sve_vl_valid(sve_max_vl)))
-		header->max_vl = header->vl;
-
 	header->size = SVE_PT_SIZE(vq, header->flags);
 	header->max_size = SVE_PT_SIZE(sve_vq_from_vl(header->max_vl),
 				      SVE_PT_REGS_SVE);
Signature · 1 line
2.1.4
#2 lore raw

PATCH v5 2/2 arm64: signal: Report signal frame size to userspace via auxv

In reply to Dave Martin

Stateful CPU architecture extensions may require the signal frame to grow to a size that exceeds the arch's MINSIGSTKSZ #define. However, changing this #define is an ABI break.

To allow userspace the option of determining the signal frame size in a more forwards-compatible way, this patch adds a new auxv entry tagged with AT_MINSIGSTKSZ, which provides the maximum signal frame size that the process can observe during its lifetime.

If AT_MINSIGSTKSZ is absent from the aux vector, the caller can assume that the MINSIGSTKSZ #define is sufficient. This allows for a consistent interface with older kernels that do not provide AT_MINSIGSTKSZ.

The idea is that libc could expose this via sysconf() or some similar mechanism.

There is deliberately no AT_SIGSTKSZ. The kernel knows nothing about userspace's own stack overheads and should not pretend to know.

For arm64:

The primary motivation for this interface is the Scalable Vector Extension, which can require at least 4KB or so of extra space in the signal frame for the largest hardware implementations.

To determine the correct value, a "Christmas tree" mode (via the add_all argument) is added to setup_sigframe_layout(), to simulate addition of all possible records to the signal frame at maximum possible size.

If this procedure goes wrong somehow, resulting in a stupidly large frame layout and hence failure of sigframe_alloc() to allocate a record to the frame, then this is indicative of a kernel bug. In this case, we WARN() and no attempt is made to populate AT_MINSIGSTKSZ for userspace.

For arm64 SVE:

The SVE context block in the signal frame needs to be considered too when computing the maximum possible signal frame size.

Because the size of this block depends on the vector length, this patch computes the size based not on the thread's current vector length but instead on the maximum possible vector length: this determines the maximum size of SVE context block that can be observed in any signal frame for the lifetime of the process.

Cc Catalin Marinas <[email protected]>
Cc Will Deacon <[email protected]>
Cc Ard Biesheuvel <[email protected]>
Cc Alex Benn?e <[email protected]>

---

Changes since v4:

Requested by Will Deacon:

* Fix typo in ARCH_INFO comment.

* Remove special-casing of minsigstksz_setup() failure. Just WARN() and don't populate AT_MINSIGSTKSZ for userspace in this case, rather than trying to make an intelligent guess about how to populate it when the kernel is obviously broken.

---
 arch/arm64/include/asm/elf.h         | 11 ++++++++
 arch/arm64/include/asm/processor.h   |  5 ++++
 arch/arm64/include/uapi/asm/auxvec.h |  3 ++-
 arch/arm64/kernel/cpufeature.c       |  1 +
 arch/arm64/kernel/signal.c           | 52 +++++++++++++++++++++++++++++++-----
 5 files changed, 64 insertions(+), 8 deletions(-)
arch/arm64/include/asm/elf.h +11 -0
index fac1c4d..8cf112b 100644
@@ -121,6 +121,9 @@
 
 #ifndef __ASSEMBLY__
 
+#include <linux/bug.h>
+#include <asm/processor.h> /* for signal_minsigstksz, used by ARCH_DLINFO */
+
 typedef unsigned long elf_greg_t;
 
 #define ELF_NGREG (sizeof(struct user_pt_regs) / sizeof(elf_greg_t))
@@ -148,6 +151,14 @@ typedef struct user_fpsimd_state elf_fpregset_t;
 do {									\
 	NEW_AUX_ENT(AT_SYSINFO_EHDR,					\
 		    (elf_addr_t)current->mm->context.vdso);		\
+									\
+	/*								\
+	 * Should always be nonzero unless there's a kernel bug.	\
+	 * If we haven't determined a sensible value to give to		\
+	 * userspace, omit the entry:					\
+	 */								\
+	if (likely(signal_minsigstksz))					\
+		NEW_AUX_ENT(AT_MINSIGSTKSZ, signal_minsigstksz);	\
 } while (0)
 
 #define ARCH_HAS_SETUP_ADDITIONAL_PAGES
arch/arm64/include/asm/processor.h +5 -0
index 7675989..65ab83e 100644
@@ -35,6 +35,8 @@
 #ifdef __KERNEL__
 
 #include <linux/build_bug.h>
+#include <linux/cache.h>
+#include <linux/init.h>
 #include <linux/stddef.h>
 #include <linux/string.h>
 
@@ -244,6 +246,9 @@ void cpu_enable_pan(const struct arm64_cpu_capabilities *__unused);
 void cpu_enable_cache_maint_trap(const struct arm64_cpu_capabilities *__unused);
 void cpu_clear_disr(const struct arm64_cpu_capabilities *__unused);
 
+extern unsigned long __ro_after_init signal_minsigstksz; /* sigframe size */
+extern void __init minsigstksz_setup(void);
+
 /* Userspace interface for PR_SVE_{SET,GET}_VL prctl()s: */
 #define SVE_SET_VL(arg)	sve_set_current_vl(arg)
 #define SVE_GET_VL()	sve_get_current_vl()
arch/arm64/include/uapi/asm/auxvec.h +2 -1
index ec0a86d..743c0b8 100644
@@ -19,7 +19,8 @@
 
 /* vDSO location */
 #define AT_SYSINFO_EHDR	33
+#define AT_MINSIGSTKSZ	51	/* stack needed for signal delivery */
 
-#define AT_VECTOR_SIZE_ARCH 1 /* entries in ARCH_DLINFO */
+#define AT_VECTOR_SIZE_ARCH 2 /* entries in ARCH_DLINFO */
 
 #endif
arch/arm64/kernel/cpufeature.c +1 -0
index 9d1b06d..0e0b53d 100644
@@ -1619,6 +1619,7 @@ void __init setup_cpu_features(void)
 		pr_info("emulated: Privileged Access Never (PAN) using TTBR0_EL1 switching\n");
 
 	sve_setup();
+	minsigstksz_setup();
 
 	/* Advertise that we have computed the system capabilities */
 	set_sys_caps_initialised();
arch/arm64/kernel/signal.c +45 -7

91 lines not on this page · raw message

Signature · 1 line
2.1.4
#3 lore raw

PATCH v5 2/2 arm64: signal: Report signal frame size to userspace via auxv

Quoted 14 lines · Dave Martin

Stateful CPU architecture extensions may require the signal frame to grow to a size that exceeds the arch's MINSIGSTKSZ #define. However, changing this #define is an ABI break.

To allow userspace the option of determining the signal frame size in a more forwards-compatible way, this patch adds a new auxv entry tagged with AT_MINSIGSTKSZ, which provides the maximum signal frame size that the process can observe during its lifetime.

If AT_MINSIGSTKSZ is absent from the aux vector, the caller can assume that the MINSIGSTKSZ #define is sufficient. This allows for a consistent interface with older kernels that do not provide AT_MINSIGSTKSZ.

Quoted 6 lines

The idea is that libc could expose this via sysconf() or some similar mechanism.

There is deliberately no AT_SIGSTKSZ. The kernel knows nothing about userspace's own stack overheads and should not pretend to know.

Thanks, Dave.

Will

#4 lore raw

PATCH v5 2/2 arm64: signal: Report signal frame size to userspace via auxv

In reply to Dave Martin

Hi Dave,

Cheers for respinning this. Just one observation below, which I only just thought about.

Quoted 20 lines · Dave Martin

Stateful CPU architecture extensions may require the signal frame to grow to a size that exceeds the arch's MINSIGSTKSZ #define. However, changing this #define is an ABI break.

To allow userspace the option of determining the signal frame size in a more forwards-compatible way, this patch adds a new auxv entry tagged with AT_MINSIGSTKSZ, which provides the maximum signal frame size that the process can observe during its lifetime.

If AT_MINSIGSTKSZ is absent from the aux vector, the caller can assume that the MINSIGSTKSZ #define is sufficient. This allows for a consistent interface with older kernels that do not provide AT_MINSIGSTKSZ.

The idea is that libc could expose this via sysconf() or some similar mechanism.

There is deliberately no AT_SIGSTKSZ. The kernel knows nothing about userspace's own stack overheads and should not pretend to know.

[...]

Quoted 17 lines
arch/arm64/include/asm/elf.h +3 -0
index fac1c4d..8cf112b 100644
@@ -121,6 +121,9 @@
 
 #ifndef __ASSEMBLY__
 
+#include <linux/bug.h>
+#include <asm/processor.h> /* for signal_minsigstksz, used by ARCH_DLINFO */
+
 typedef unsigned long elf_greg_t;
 
 #define ELF_NGREG (sizeof(struct user_pt_regs) / sizeof(elf_greg_t))
@@ -148,6 +151,14 @@ typedef struct user_fpsimd_state elf_fpregset_t;
 do {									\
 	NEW_AUX_ENT(AT_SYSINFO_EHDR,					\

arch/arm64/include/asm/elf.h typedef struct user_fpsimd_state elf_fpregset_t; · line 162

Quoted 10 lines
arch/arm64/include/asm/elf.h +8 -0
 		    (elf_addr_t)current->mm->context.vdso);		\
+									\
+	/*								\
+	 * Should always be nonzero unless there's a kernel bug.	\
+	 * If we haven't determined a sensible value to give to		\
+	 * userspace, omit the entry:					\
+	 */								\
+	if (likely(signal_minsigstksz))					\
+		NEW_AUX_ENT(AT_MINSIGSTKSZ, signal_minsigstksz);	\
 } while (0)

I think this is the desired behaviour, but now I'm worried that we're forced to have AT_VECTOR_SIZE_ARCH defined as 2 and, whilst you're correct that the ELF loader deals with this gracefuly, the FDPIC loader looks a lot less robust (in particular, my reading is that it decrements the stack pointer and then pushes these entries in reverse order by overloading NEW_AUX_ENT). There's also some checkpoint save/restore code in kernel/sys.c that looks like it could end up with uninitialised stack for the omitted entry.

Can we spit out an AT_IGNORE entry as an else clause if signal_minsigstksz is zero?

Will

#5 lore raw

PATCH v5 2/2 arm64: signal: Report signal frame size to userspace via auxv

Quoted 54 lines · Will Deacon

Hi Dave,

Cheers for respinning this. Just one observation below, which I only just thought about.

Quoted 20 lines · Dave Martin

Stateful CPU architecture extensions may require the signal frame to grow to a size that exceeds the arch's MINSIGSTKSZ #define. However, changing this #define is an ABI break.

To allow userspace the option of determining the signal frame size in a more forwards-compatible way, this patch adds a new auxv entry tagged with AT_MINSIGSTKSZ, which provides the maximum signal frame size that the process can observe during its lifetime.

If AT_MINSIGSTKSZ is absent from the aux vector, the caller can assume that the MINSIGSTKSZ #define is sufficient. This allows for a consistent interface with older kernels that do not provide AT_MINSIGSTKSZ.

The idea is that libc could expose this via sysconf() or some similar mechanism.

There is deliberately no AT_SIGSTKSZ. The kernel knows nothing about userspace's own stack overheads and should not pretend to know.

[...]

Quoted 25 lines
arch/arm64/include/asm/elf.h +10 -0
index fac1c4d..8cf112b 100644
@@ -121,6 +121,9 @@
 
 #ifndef __ASSEMBLY__
 
+#include <linux/bug.h>
+#include <asm/processor.h> /* for signal_minsigstksz, used by ARCH_DLINFO */
+
 typedef unsigned long elf_greg_t;
 
 #define ELF_NGREG (sizeof(struct user_pt_regs) / sizeof(elf_greg_t))
@@ -148,6 +151,14 @@ typedef struct user_fpsimd_state elf_fpregset_t;
 do {									\
 	NEW_AUX_ENT(AT_SYSINFO_EHDR,					\
 		    (elf_addr_t)current->mm->context.vdso);		\
+									\
+	/*								\
+	 * Should always be nonzero unless there's a kernel bug.	\
+	 * If we haven't determined a sensible value to give to		\
+	 * userspace, omit the entry:					\
+	 */								\
+	if (likely(signal_minsigstksz))					\
Quoted 8 lines

arch/arm64/include/asm/elf.h typedef struct user_fpsimd_state elf_fpregset_t; · line 162

Quoted 2 lines
arch/arm64/include/asm/elf.h +1 -0
+		NEW_AUX_ENT(AT_MINSIGSTKSZ, signal_minsigstksz);	\
 } while (0)

I think this is the desired behaviour, but now I'm worried that we're forced to have AT_VECTOR_SIZE_ARCH defined as 2 and, whilst you're correct that the ELF loader deals with this gracefuly, the FDPIC loader looks a lot less robust (in particular, my reading is that it decrements the stack pointer and then pushes these entries in reverse order by overloading NEW_AUX_ENT).

config BINFMT_ELF_FDPIC

	/* ... */
	depends on (ARM || (SUPERH32 & !MMU) || C6X)

The FDPIC loader seems to assume it's 32-bit only and also looks broken with regard to auxv:

	/* force 16 byte _final_ alignment here for generality */

#define DLINFO_ITEMS 15

/* ... */

		nr = 0;
		csp -= 2 * sizeof(unsigned long);
		NEW_AUX_ENT(AT_EXECFD, ...);
	}

/* ... */

	csp -= DLINFO_ITEMS * 2 * sizeof(unsigned long);
	NEW_AUX_ENT(AT_HWCAP,   ELF_HWCAP);
#ifdef ELF_HWCAP2
	NEW_AUX_ENT(AT_HWCAP2,  ELF_HWCAP2);
#endif
	/* 14 more NEW_AUX_ENT() */

Looks like commit 2171364d1a92 ("powerpc: Add HWCAP2 aux entry") added HWCAP2 without ensuring that space is reserved.

I can try to draft a patch to handle the auxv in a more sane way for FDPIC, but either way I don't see that it should be relevant to arm64.

AT_IGNORE feels like a bit of a fig leaf, but it's harmless enough. I'm happy to add it if you prefer.

Cheers
---Dave

#6 lore raw

PATCH v5 2/2 arm64: signal: Report signal frame size to userspace via auxv

Quoted 36 lines · Dave Martin
Quoted 26 lines · Will Deacon
Quoted 25 lines · Dave Martin
arch/arm64/include/asm/elf.h +10 -0
index fac1c4d..8cf112b 100644
@@ -121,6 +121,9 @@
 
 #ifndef __ASSEMBLY__
 
+#include <linux/bug.h>
+#include <asm/processor.h> /* for signal_minsigstksz, used by ARCH_DLINFO */
+
 typedef unsigned long elf_greg_t;
 
 #define ELF_NGREG (sizeof(struct user_pt_regs) / sizeof(elf_greg_t))
@@ -148,6 +151,14 @@ typedef struct user_fpsimd_state elf_fpregset_t;
 do {									\
 	NEW_AUX_ENT(AT_SYSINFO_EHDR,					\
 		    (elf_addr_t)current->mm->context.vdso);		\
+									\
+	/*								\
+	 * Should always be nonzero unless there's a kernel bug.	\
+	 * If we haven't determined a sensible value to give to		\
+	 * userspace, omit the entry:					\
+	 */								\
+	if (likely(signal_minsigstksz))					\
Quoted 8 lines

arch/arm64/include/asm/elf.h typedef struct user_fpsimd_state elf_fpregset_t; · line 162

Quoted 2 lines
arch/arm64/include/asm/elf.h +1 -0
+		NEW_AUX_ENT(AT_MINSIGSTKSZ, signal_minsigstksz);	\
 } while (0)

I think this is the desired behaviour, but now I'm worried that we're forced to have AT_VECTOR_SIZE_ARCH defined as 2 and, whilst you're correct that the ELF loader deals with this gracefuly, the FDPIC loader looks a lot less robust (in particular, my reading is that it decrements the stack pointer and then pushes these entries in reverse order by overloading NEW_AUX_ENT).

Quoted 3 lines

config BINFMT_ELF_FDPIC

	/* ... */
	depends on (ARM || (SUPERH32 & !MMU) || C6X)

Ok, that's a relief. The checkpoint stuff is still a bit worrying though (prctl_set_mm_map).

Quoted 26 lines

The FDPIC loader seems to assume it's 32-bit only and also looks broken with regard to auxv:

	/* force 16 byte _final_ alignment here for generality */

#define DLINFO_ITEMS 15

/* ... */

		nr = 0;
		csp -= 2 * sizeof(unsigned long);
		NEW_AUX_ENT(AT_EXECFD, ...);
	}

/* ... */

	csp -= DLINFO_ITEMS * 2 * sizeof(unsigned long);
	NEW_AUX_ENT(AT_HWCAP,   ELF_HWCAP);
#ifdef ELF_HWCAP2
	NEW_AUX_ENT(AT_HWCAP2,  ELF_HWCAP2);
#endif
	/* 14 more NEW_AUX_ENT() */

Looks like commit 2171364d1a92 ("powerpc: Add HWCAP2 aux entry") added HWCAP2 without ensuring that space is reserved.

Quoted 6 lines

I can try to draft a patch to handle the auxv in a more sane way for FDPIC, but either way I don't see that it should be relevant to arm64.

AT_IGNORE feels like a bit of a fig leaf, but it's harmless enough. I'm happy to add it if you prefer.

The only userspace code I could find that uses it is something that prints out auxv, but I'd still better spitting it out so we don't have to worry about being smaller than AT_VECTOR_SIZE_ARCH.

Thanks,

Will

#7 lore raw

PATCH v5 2/2 arm64: signal: Report signal frame size to userspace via auxv

Quoted 37 lines · Will Deacon
Quoted 36 lines · Dave Martin
Quoted 34 lines · Will Deacon
Quoted 17 lines · Dave Martin
arch/arm64/include/asm/elf.h +3 -0
index fac1c4d..8cf112b 100644
@@ -121,6 +121,9 @@
 
 #ifndef __ASSEMBLY__
 
+#include <linux/bug.h>
+#include <asm/processor.h> /* for signal_minsigstksz, used by ARCH_DLINFO */
+
 typedef unsigned long elf_greg_t;
 
 #define ELF_NGREG (sizeof(struct user_pt_regs) / sizeof(elf_greg_t))
@@ -148,6 +151,14 @@ typedef struct user_fpsimd_state elf_fpregset_t;
 do {									\
 	NEW_AUX_ENT(AT_SYSINFO_EHDR,					\

arch/arm64/include/asm/elf.h typedef struct user_fpsimd_state elf_fpregset_t; · line 162

Quoted 10 lines
arch/arm64/include/asm/elf.h +8 -0
 		    (elf_addr_t)current->mm->context.vdso);		\
+									\
+	/*								\
+	 * Should always be nonzero unless there's a kernel bug.	\
+	 * If we haven't determined a sensible value to give to		\
+	 * userspace, omit the entry:					\
+	 */								\
+	if (likely(signal_minsigstksz))					\
+		NEW_AUX_ENT(AT_MINSIGSTKSZ, signal_minsigstksz);	\
 } while (0)

I think this is the desired behaviour, but now I'm worried that we're forced to have AT_VECTOR_SIZE_ARCH defined as 2 and, whilst you're correct that the ELF loader deals with this gracefuly, the FDPIC loader looks a lot less robust (in particular, my reading is that it decrements the stack pointer and then pushes these entries in reverse order by overloading NEW_AUX_ENT).

Quoted 6 lines
Quoted 3 lines

config BINFMT_ELF_FDPIC

	/* ... */
	depends on (ARM || (SUPERH32 & !MMU) || C6X)

Ok, that's a relief. The checkpoint stuff is still a bit worrying though (prctl_set_mm_map).

This looks like a non-issue to me, although stuffing the gap with AT_IGNORE reduces the scope for unexpected consequences here.

Apart from avoiding buffer overruns in the kernel when stashing the data, I don't really see why we care what garbage userspace puts in the auxv that it gives to itself. It can be invalid in many ways that the code doesn't check, such as a bad pointer for AT_PLATFORM etc. etc.

Quoted 30 lines
Quoted 30 lines

The FDPIC loader seems to assume it's 32-bit only and also looks broken with regard to auxv:

	/* force 16 byte _final_ alignment here for generality */

#define DLINFO_ITEMS 15

/* ... */

		nr = 0;
		csp -= 2 * sizeof(unsigned long);
		NEW_AUX_ENT(AT_EXECFD, ...);
	}

/* ... */

	csp -= DLINFO_ITEMS * 2 * sizeof(unsigned long);
	NEW_AUX_ENT(AT_HWCAP,   ELF_HWCAP);
#ifdef ELF_HWCAP2
	NEW_AUX_ENT(AT_HWCAP2,  ELF_HWCAP2);
#endif
	/* 14 more NEW_AUX_ENT() */

Looks like commit 2171364d1a92 ("powerpc: Add HWCAP2 aux entry") added HWCAP2 without ensuring that space is reserved.

I can try to draft a patch to handle the auxv in a more sane way for FDPIC, but either way I don't see that it should be relevant to arm64.

Quoted 6 lines
Quoted 2 lines

AT_IGNORE feels like a bit of a fig leaf, but it's harmless enough. I'm happy to add it if you prefer.

The only userspace code I could find that uses it is something that prints out auxv, but I'd still better spitting it out so we don't have to worry about being smaller than AT_VECTOR_SIZE_ARCH.

OK, I'll add AT_IGNORE and respin.

I wondered whether we can just get rid of AT_VECTOR_SIZE{,_ARCH}, since they're just asking to be wrong in any case. But that would be a battle for another day.

Cheers
---Dave