[OpenWrt-Devel] kernel: Fix arm64 include files
diff mbox series

Message ID 20191019220059.31342-1-hauke@hauke-m.de
State Accepted
Delegated to: Hauke Mehrtens
Headers show
Series
  • [OpenWrt-Devel] kernel: Fix arm64 include files
Related show

Commit Message

Hauke Mehrtens Oct. 19, 2019, 10 p.m. UTC
This patch fixes the build of gdb and strace on arm64 targets with
kernel 4.19.

Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
---
 ...angle-uapi-asm-ptrace.h-from-uapi-as.patch | 280 ++++++++++++++++++
 1 file changed, 280 insertions(+)
 create mode 100644 target/linux/generic/backport-4.19/210-arm64-sve-Disentangle-uapi-asm-ptrace.h-from-uapi-as.patch

Patch
diff mbox series

diff --git a/target/linux/generic/backport-4.19/210-arm64-sve-Disentangle-uapi-asm-ptrace.h-from-uapi-as.patch b/target/linux/generic/backport-4.19/210-arm64-sve-Disentangle-uapi-asm-ptrace.h-from-uapi-as.patch
new file mode 100644
index 0000000000..f061adf3e7
--- /dev/null
+++ b/target/linux/generic/backport-4.19/210-arm64-sve-Disentangle-uapi-asm-ptrace.h-from-uapi-as.patch
@@ -0,0 +1,280 @@ 
+From 7a06dfecb95d8a5ac6b136fce003bbedb3176000 Mon Sep 17 00:00:00 2001
+From: Dave Martin <Dave.Martin@arm.com>
+Date: Fri, 4 Jan 2019 13:09:51 +0000
+Subject: [PATCH] arm64/sve: Disentangle <uapi/asm/ptrace.h> from
+ <uapi/asm/sigcontext.h>
+
+Currently, <uapi/asm/sigcontext.h> provides common definitions for
+describing SVE context structures that are also used by the ptrace
+definitions in <uapi/asm/ptrace.h>.
+
+For this reason, a #include of <asm/sigcontext.h> was added in
+ptrace.h, but it this turns out that this can interact badly with
+userspace code that tries to include ptrace.h on top of the libc
+headers (which may provide their own shadow definitions for
+sigcontext.h).
+
+To make the headers easier for userspace to consume, this patch
+bounces the common definitions into an __SVE_* namespace and moves
+them to a backend header <uapi/asm/sve_context.h> that can be
+included by the other headers as appropriate.  This should allow
+ptrace.h to be used alongside libc's sigcontext.h (if any) without
+ill effects.
+
+This should make the situation unambiguous: <asm/sigcontext.h> is
+the header to include for the sigframe-specific definitions, while
+<asm/ptrace.h> is the header to include for ptrace-specific
+definitions.
+
+To avoid conflicting with existing usage, <asm/sigcontext.h>
+remains the canonical way to get the common definitions for
+SVE_VQ_MIN, sve_vq_from_vl() etc., both in userspace and in the
+kernel: relying on these being defined as a side effect of
+including just <asm/ptrace.h> was never intended to be safe.
+
+Signed-off-by: Dave Martin <Dave.Martin@arm.com>
+Signed-off-by: Will Deacon <will.deacon@arm.com>
+---
+ arch/arm64/include/uapi/asm/ptrace.h      | 39 ++++++++--------
+ arch/arm64/include/uapi/asm/sigcontext.h  | 56 +++++++++++------------
+ arch/arm64/include/uapi/asm/sve_context.h | 53 +++++++++++++++++++++
+ 3 files changed, 99 insertions(+), 49 deletions(-)
+ create mode 100644 arch/arm64/include/uapi/asm/sve_context.h
+
+--- a/arch/arm64/include/uapi/asm/ptrace.h
++++ b/arch/arm64/include/uapi/asm/ptrace.h
+@@ -23,7 +23,7 @@
+ #include <linux/types.h>
+ 
+ #include <asm/hwcap.h>
+-#include <asm/sigcontext.h>
++#include <asm/sve_context.h>
+ 
+ 
+ /*
+@@ -128,9 +128,9 @@ struct user_sve_header {
+  */
+ 
+ /* Offset from the start of struct user_sve_header to the register data */
+-#define SVE_PT_REGS_OFFSET					\
+-	((sizeof(struct user_sve_header) + (SVE_VQ_BYTES - 1))	\
+-		/ SVE_VQ_BYTES * SVE_VQ_BYTES)
++#define SVE_PT_REGS_OFFSET						\
++	((sizeof(struct user_sve_header) + (__SVE_VQ_BYTES - 1))	\
++		/ __SVE_VQ_BYTES * __SVE_VQ_BYTES)
+ 
+ /*
+  * The register data content and layout depends on the value of the
+@@ -176,39 +176,36 @@ struct user_sve_header {
+  * Additional data might be appended in the future.
+  */
+ 
+-#define SVE_PT_SVE_ZREG_SIZE(vq)	SVE_SIG_ZREG_SIZE(vq)
+-#define SVE_PT_SVE_PREG_SIZE(vq)	SVE_SIG_PREG_SIZE(vq)
+-#define SVE_PT_SVE_FFR_SIZE(vq)		SVE_SIG_FFR_SIZE(vq)
++#define SVE_PT_SVE_ZREG_SIZE(vq)	__SVE_ZREG_SIZE(vq)
++#define SVE_PT_SVE_PREG_SIZE(vq)	__SVE_PREG_SIZE(vq)
++#define SVE_PT_SVE_FFR_SIZE(vq)		__SVE_FFR_SIZE(vq)
+ #define SVE_PT_SVE_FPSR_SIZE		sizeof(__u32)
+ #define SVE_PT_SVE_FPCR_SIZE		sizeof(__u32)
+ 
+-#define __SVE_SIG_TO_PT(offset) \
+-	((offset) - SVE_SIG_REGS_OFFSET + SVE_PT_REGS_OFFSET)
+-
+ #define SVE_PT_SVE_OFFSET		SVE_PT_REGS_OFFSET
+ 
+ #define SVE_PT_SVE_ZREGS_OFFSET \
+-	__SVE_SIG_TO_PT(SVE_SIG_ZREGS_OFFSET)
++	(SVE_PT_REGS_OFFSET + __SVE_ZREGS_OFFSET)
+ #define SVE_PT_SVE_ZREG_OFFSET(vq, n) \
+-	__SVE_SIG_TO_PT(SVE_SIG_ZREG_OFFSET(vq, n))
++	(SVE_PT_REGS_OFFSET + __SVE_ZREG_OFFSET(vq, n))
+ #define SVE_PT_SVE_ZREGS_SIZE(vq) \
+-	(SVE_PT_SVE_ZREG_OFFSET(vq, SVE_NUM_ZREGS) - SVE_PT_SVE_ZREGS_OFFSET)
++	(SVE_PT_SVE_ZREG_OFFSET(vq, __SVE_NUM_ZREGS) - SVE_PT_SVE_ZREGS_OFFSET)
+ 
+ #define SVE_PT_SVE_PREGS_OFFSET(vq) \
+-	__SVE_SIG_TO_PT(SVE_SIG_PREGS_OFFSET(vq))
++	(SVE_PT_REGS_OFFSET + __SVE_PREGS_OFFSET(vq))
+ #define SVE_PT_SVE_PREG_OFFSET(vq, n) \
+-	__SVE_SIG_TO_PT(SVE_SIG_PREG_OFFSET(vq, n))
++	(SVE_PT_REGS_OFFSET + __SVE_PREG_OFFSET(vq, n))
+ #define SVE_PT_SVE_PREGS_SIZE(vq) \
+-	(SVE_PT_SVE_PREG_OFFSET(vq, SVE_NUM_PREGS) - \
++	(SVE_PT_SVE_PREG_OFFSET(vq, __SVE_NUM_PREGS) - \
+ 		SVE_PT_SVE_PREGS_OFFSET(vq))
+ 
+ #define SVE_PT_SVE_FFR_OFFSET(vq) \
+-	__SVE_SIG_TO_PT(SVE_SIG_FFR_OFFSET(vq))
++	(SVE_PT_REGS_OFFSET + __SVE_FFR_OFFSET(vq))
+ 
+ #define SVE_PT_SVE_FPSR_OFFSET(vq)				\
+ 	((SVE_PT_SVE_FFR_OFFSET(vq) + SVE_PT_SVE_FFR_SIZE(vq) +	\
+-			(SVE_VQ_BYTES - 1))			\
+-		/ SVE_VQ_BYTES * SVE_VQ_BYTES)
++			(__SVE_VQ_BYTES - 1))			\
++		/ __SVE_VQ_BYTES * __SVE_VQ_BYTES)
+ #define SVE_PT_SVE_FPCR_OFFSET(vq) \
+ 	(SVE_PT_SVE_FPSR_OFFSET(vq) + SVE_PT_SVE_FPSR_SIZE)
+ 
+@@ -219,8 +216,8 @@ struct user_sve_header {
+ 
+ #define SVE_PT_SVE_SIZE(vq, flags)					\
+ 	((SVE_PT_SVE_FPCR_OFFSET(vq) + SVE_PT_SVE_FPCR_SIZE		\
+-			- SVE_PT_SVE_OFFSET + (SVE_VQ_BYTES - 1))	\
+-		/ SVE_VQ_BYTES * SVE_VQ_BYTES)
++			- SVE_PT_SVE_OFFSET + (__SVE_VQ_BYTES - 1))	\
++		/ __SVE_VQ_BYTES * __SVE_VQ_BYTES)
+ 
+ #define SVE_PT_SIZE(vq, flags)						\
+ 	 (((flags) & SVE_PT_REGS_MASK) == SVE_PT_REGS_SVE ?		\
+--- a/arch/arm64/include/uapi/asm/sigcontext.h
++++ b/arch/arm64/include/uapi/asm/sigcontext.h
+@@ -130,6 +130,8 @@ struct sve_context {
+ 
+ #endif /* !__ASSEMBLY__ */
+ 
++#include <asm/sve_context.h>
++
+ /*
+  * The SVE architecture leaves space for future expansion of the
+  * vector length beyond its initial architectural limit of 2048 bits
+@@ -138,21 +140,20 @@ struct sve_context {
+  * See linux/Documentation/arm64/sve.txt for a description of the VL/VQ
+  * terminology.
+  */
+-#define SVE_VQ_BYTES		16	/* number of bytes per quadword */
++#define SVE_VQ_BYTES		__SVE_VQ_BYTES	/* bytes per quadword */
+ 
+-#define SVE_VQ_MIN		1
+-#define SVE_VQ_MAX		512
++#define SVE_VQ_MIN		__SVE_VQ_MIN
++#define SVE_VQ_MAX		__SVE_VQ_MAX
+ 
+-#define SVE_VL_MIN		(SVE_VQ_MIN * SVE_VQ_BYTES)
+-#define SVE_VL_MAX		(SVE_VQ_MAX * SVE_VQ_BYTES)
++#define SVE_VL_MIN		__SVE_VL_MIN
++#define SVE_VL_MAX		__SVE_VL_MAX
+ 
+-#define SVE_NUM_ZREGS		32
+-#define SVE_NUM_PREGS		16
++#define SVE_NUM_ZREGS		__SVE_NUM_ZREGS
++#define SVE_NUM_PREGS		__SVE_NUM_PREGS
+ 
+-#define sve_vl_valid(vl) \
+-	((vl) % SVE_VQ_BYTES == 0 && (vl) >= SVE_VL_MIN && (vl) <= SVE_VL_MAX)
+-#define sve_vq_from_vl(vl)	((vl) / SVE_VQ_BYTES)
+-#define sve_vl_from_vq(vq)	((vq) * SVE_VQ_BYTES)
++#define sve_vl_valid(vl)	__sve_vl_valid(vl)
++#define sve_vq_from_vl(vl)	__sve_vq_from_vl(vl)
++#define sve_vl_from_vq(vq)	__sve_vl_from_vq(vq)
+ 
+ /*
+  * If the SVE registers are currently live for the thread at signal delivery,
+@@ -205,34 +206,33 @@ struct sve_context {
+  * Additional data might be appended in the future.
+  */
+ 
+-#define SVE_SIG_ZREG_SIZE(vq)	((__u32)(vq) * SVE_VQ_BYTES)
+-#define SVE_SIG_PREG_SIZE(vq)	((__u32)(vq) * (SVE_VQ_BYTES / 8))
+-#define SVE_SIG_FFR_SIZE(vq)	SVE_SIG_PREG_SIZE(vq)
++#define SVE_SIG_ZREG_SIZE(vq)	__SVE_ZREG_SIZE(vq)
++#define SVE_SIG_PREG_SIZE(vq)	__SVE_PREG_SIZE(vq)
++#define SVE_SIG_FFR_SIZE(vq)	__SVE_FFR_SIZE(vq)
+ 
+ #define SVE_SIG_REGS_OFFSET					\
+-	((sizeof(struct sve_context) + (SVE_VQ_BYTES - 1))	\
+-		/ SVE_VQ_BYTES * SVE_VQ_BYTES)
++	((sizeof(struct sve_context) + (__SVE_VQ_BYTES - 1))	\
++		/ __SVE_VQ_BYTES * __SVE_VQ_BYTES)
+ 
+-#define SVE_SIG_ZREGS_OFFSET	SVE_SIG_REGS_OFFSET
++#define SVE_SIG_ZREGS_OFFSET \
++		(SVE_SIG_REGS_OFFSET + __SVE_ZREGS_OFFSET)
+ #define SVE_SIG_ZREG_OFFSET(vq, n) \
+-	(SVE_SIG_ZREGS_OFFSET + SVE_SIG_ZREG_SIZE(vq) * (n))
+-#define SVE_SIG_ZREGS_SIZE(vq) \
+-	(SVE_SIG_ZREG_OFFSET(vq, SVE_NUM_ZREGS) - SVE_SIG_ZREGS_OFFSET)
++		(SVE_SIG_REGS_OFFSET + __SVE_ZREG_OFFSET(vq, n))
++#define SVE_SIG_ZREGS_SIZE(vq) __SVE_ZREGS_SIZE(vq)
+ 
+ #define SVE_SIG_PREGS_OFFSET(vq) \
+-	(SVE_SIG_ZREGS_OFFSET + SVE_SIG_ZREGS_SIZE(vq))
++		(SVE_SIG_REGS_OFFSET + __SVE_PREGS_OFFSET(vq))
+ #define SVE_SIG_PREG_OFFSET(vq, n) \
+-	(SVE_SIG_PREGS_OFFSET(vq) + SVE_SIG_PREG_SIZE(vq) * (n))
+-#define SVE_SIG_PREGS_SIZE(vq) \
+-	(SVE_SIG_PREG_OFFSET(vq, SVE_NUM_PREGS) - SVE_SIG_PREGS_OFFSET(vq))
++		(SVE_SIG_REGS_OFFSET + __SVE_PREG_OFFSET(vq, n))
++#define SVE_SIG_PREGS_SIZE(vq) __SVE_PREGS_SIZE(vq)
+ 
+ #define SVE_SIG_FFR_OFFSET(vq) \
+-	(SVE_SIG_PREGS_OFFSET(vq) + SVE_SIG_PREGS_SIZE(vq))
++		(SVE_SIG_REGS_OFFSET + __SVE_FFR_OFFSET(vq))
+ 
+ #define SVE_SIG_REGS_SIZE(vq) \
+-	(SVE_SIG_FFR_OFFSET(vq) + SVE_SIG_FFR_SIZE(vq) - SVE_SIG_REGS_OFFSET)
+-
+-#define SVE_SIG_CONTEXT_SIZE(vq) (SVE_SIG_REGS_OFFSET + SVE_SIG_REGS_SIZE(vq))
++		(__SVE_FFR_OFFSET(vq) + __SVE_FFR_SIZE(vq))
+ 
++#define SVE_SIG_CONTEXT_SIZE(vq) \
++		(SVE_SIG_REGS_OFFSET + SVE_SIG_REGS_SIZE(vq))
+ 
+ #endif /* _UAPI__ASM_SIGCONTEXT_H */
+--- /dev/null
++++ b/arch/arm64/include/uapi/asm/sve_context.h
+@@ -0,0 +1,53 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
++/* Copyright (C) 2017-2018 ARM Limited */
++
++/*
++ * For use by other UAPI headers only.
++ * Do not make direct use of header or its definitions.
++ */
++
++#ifndef _UAPI__ASM_SVE_CONTEXT_H
++#define _UAPI__ASM_SVE_CONTEXT_H
++
++#include <linux/types.h>
++
++#define __SVE_VQ_BYTES		16	/* number of bytes per quadword */
++
++#define __SVE_VQ_MIN		1
++#define __SVE_VQ_MAX		512
++
++#define __SVE_VL_MIN		(__SVE_VQ_MIN * __SVE_VQ_BYTES)
++#define __SVE_VL_MAX		(__SVE_VQ_MAX * __SVE_VQ_BYTES)
++
++#define __SVE_NUM_ZREGS		32
++#define __SVE_NUM_PREGS		16
++
++#define __sve_vl_valid(vl)			\
++	((vl) % __SVE_VQ_BYTES == 0 &&		\
++	 (vl) >= __SVE_VL_MIN &&		\
++	 (vl) <= __SVE_VL_MAX)
++
++#define __sve_vq_from_vl(vl)	((vl) / __SVE_VQ_BYTES)
++#define __sve_vl_from_vq(vq)	((vq) * __SVE_VQ_BYTES)
++
++#define __SVE_ZREG_SIZE(vq)	((__u32)(vq) * __SVE_VQ_BYTES)
++#define __SVE_PREG_SIZE(vq)	((__u32)(vq) * (__SVE_VQ_BYTES / 8))
++#define __SVE_FFR_SIZE(vq)	__SVE_PREG_SIZE(vq)
++
++#define __SVE_ZREGS_OFFSET	0
++#define __SVE_ZREG_OFFSET(vq, n) \
++	(__SVE_ZREGS_OFFSET + __SVE_ZREG_SIZE(vq) * (n))
++#define __SVE_ZREGS_SIZE(vq) \
++	(__SVE_ZREG_OFFSET(vq, __SVE_NUM_ZREGS) - __SVE_ZREGS_OFFSET)
++
++#define __SVE_PREGS_OFFSET(vq) \
++	(__SVE_ZREGS_OFFSET + __SVE_ZREGS_SIZE(vq))
++#define __SVE_PREG_OFFSET(vq, n) \
++	(__SVE_PREGS_OFFSET(vq) + __SVE_PREG_SIZE(vq) * (n))
++#define __SVE_PREGS_SIZE(vq) \
++	(__SVE_PREG_OFFSET(vq, __SVE_NUM_PREGS) - __SVE_PREGS_OFFSET(vq))
++
++#define __SVE_FFR_OFFSET(vq) \
++	(__SVE_PREGS_OFFSET(vq) + __SVE_PREGS_SIZE(vq))
++
++#endif /* ! _UAPI__ASM_SVE_CONTEXT_H */