Module Name:    src
Committed By:   ryo
Date:           Mon May 11 03:00:57 UTC 2020

Modified Files:
        src/sys/arch/aarch64/conf: Makefile.aarch64
        src/sys/arch/aarch64/include: armreg.h asm.h

Log Message:
"options ARMV83_PAC" is now supported for gcc as well.

- add "-msign-return-address=all" to CFLAGS for gcc when specified options 
ARMV83_PAC
- AARCH64REG_{READ,WRITE}_INLINE3 macro can now use the APIAKey registers in 
both gcc and llvm.
  llvm requires asm(".arch armv8.3-a"), whereas gcc requires 
__attribute__((target("arch=armv8.3-a"))).
- use ".arch armv8.3-a" rather than ".arch armv8.3-a+pac" in *.S for llvm.


To generate a diff of this commit:
cvs rdiff -u -r1.20 -r1.21 src/sys/arch/aarch64/conf/Makefile.aarch64
cvs rdiff -u -r1.41 -r1.42 src/sys/arch/aarch64/include/armreg.h
cvs rdiff -u -r1.7 -r1.8 src/sys/arch/aarch64/include/asm.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/aarch64/conf/Makefile.aarch64
diff -u src/sys/arch/aarch64/conf/Makefile.aarch64:1.20 src/sys/arch/aarch64/conf/Makefile.aarch64:1.21
--- src/sys/arch/aarch64/conf/Makefile.aarch64:1.20	Mon Apr 13 07:32:36 2020
+++ src/sys/arch/aarch64/conf/Makefile.aarch64	Mon May 11 03:00:57 2020
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile.aarch64,v 1.20 2020/04/13 07:32:36 maxv Exp $
+#	$NetBSD: Makefile.aarch64,v 1.21 2020/05/11 03:00:57 ryo Exp $
 
 # Makefile for NetBSD
 #
@@ -52,6 +52,15 @@ CFLAGS+=	-mbranch-protection=bti
 .endif
 .endif
 
+.if ${HAVE_GCC:U0} > 0
+.if ${ARMV83_PAC:U0} > 0
+CFLAGS+=	-msign-return-address=all
+.endif
+.if ${ARMV85_BTI:U0} > 0
+# XXX: notyet for gcc
+.endif
+.endif
+
 .if ${KASAN:U0} > 0 && ${HAVE_GCC:U0} > 0
 KASANFLAGS=	-fsanitize=kernel-address \
 		--param asan-globals=1 --param asan-stack=1 \

Index: src/sys/arch/aarch64/include/armreg.h
diff -u src/sys/arch/aarch64/include/armreg.h:1.41 src/sys/arch/aarch64/include/armreg.h:1.42
--- src/sys/arch/aarch64/include/armreg.h:1.41	Sun May 10 21:40:38 2020
+++ src/sys/arch/aarch64/include/armreg.h	Mon May 11 03:00:57 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: armreg.h,v 1.41 2020/05/10 21:40:38 riastradh Exp $ */
+/* $NetBSD: armreg.h,v 1.42 2020/05/11 03:00:57 ryo Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -35,23 +35,39 @@
 #include <arm/cputypes.h>
 #include <sys/types.h>
 
-#define AARCH64REG_READ_INLINE3(regname, regdesc, fnattrs)	\
-static __inline uint64_t fnattrs				\
+#ifdef __clang__
+#define ATTR_ARCH(arch)			".arch " arch ";"
+#define ATTR_TARGET_ARCH(x)
+#define ASM_ARCH(x)			x
+#else
+#define ATTR_ARCH(arch)			__attribute__((target("arch=" arch)))
+#define ATTR_TARGET_ARCH(x)		x
+#define ASM_ARCH(x)
+#endif
+
+#define AARCH64REG_READ_INLINE3(regname, regdesc, arch)		\
+static __inline uint64_t ATTR_TARGET_ARCH(arch)			\
 reg_##regname##_read(void)					\
 {								\
 	uint64_t __rv;						\
-	__asm __volatile("mrs %0, " #regdesc : "=r"(__rv));	\
+	__asm __volatile(					\
+	    ASM_ARCH(arch)					\
+	    "mrs %0, " #regdesc : "=r"(__rv)			\
+	);							\
 	return __rv;						\
 }
 
 #define AARCH64REG_READ_INLINE2(regname, regdesc)		\
 	AARCH64REG_READ_INLINE3(regname, regdesc, )
 
-#define AARCH64REG_WRITE_INLINE3(regname, regdesc, fnattrs)	\
-static __inline void fnattrs					\
+#define AARCH64REG_WRITE_INLINE3(regname, regdesc, arch)	\
+static __inline void ATTR_TARGET_ARCH(arch)			\
 reg_##regname##_write(uint64_t __val)				\
 {								\
-	__asm __volatile("msr " #regdesc ", %0" :: "r"(__val));	\
+	__asm __volatile(					\
+	    ASM_ARCH(arch)					\
+	    "msr " #regdesc ", %0" :: "r"(__val)		\
+	);							\
 }
 
 #define AARCH64REG_WRITE_INLINE2(regname, regdesc)		\
@@ -380,7 +396,7 @@ AARCH64REG_READ_INLINE(id_aa64mmfr1_el1)
 #define	 ID_AA64MMFR1_EL1_HAFDBS_AD	 2
 
 AARCH64REG_READ_INLINE3(id_aa64mmfr2_el1, id_aa64mmfr2_el1,
-    __attribute__((target("arch=armv8.2-a"))))
+    ATTR_ARCH("armv8.2-a"))
 
 #define	ID_AA64MMFR2_EL1_E0PD		__BITS(63,60)
 #define	 ID_AA64MMFR2_EL1_E0PD_NONE	 0
@@ -548,6 +564,11 @@ AARCH64REG_READ_INLINE(revidr_el1)
 /*
  * These are read/write registers
  */
+AARCH64REG_READ_INLINE3(APIAKeyLo_EL1, apiakeylo_el1, ATTR_ARCH("armv8.3-a"))
+AARCH64REG_WRITE_INLINE3(APIAKeyLo_EL1, apiakeylo_el1, ATTR_ARCH("armv8.3-a"))
+AARCH64REG_READ_INLINE3(APIAKeyHi_EL1, apiakeyhi_el1, ATTR_ARCH("armv8.3-a"))
+AARCH64REG_WRITE_INLINE3(APIAKeyHi_EL1, apiakeyhi_el1, ATTR_ARCH("armv8.3-a"))
+
 AARCH64REG_READ_INLINE(cpacr_el1)	// Coprocessor Access Control Regiser
 AARCH64REG_WRITE_INLINE(cpacr_el1)
 
@@ -786,20 +807,6 @@ AARCH64REG_WRITE_INLINE(sctlr_el1)
 #define	SCTLR_ATA		__BIT(43)
 #define	SCTLR_DSSBS		__BIT(44)
 
-static __inline void
-reg_APIAKeyLo_EL1_write(uint64_t __val)
-{
-	__asm __volatile(".arch armv8.3-a+pac\n"
-	    "msr APIAKeyLo_EL1, %0" :: "r"(__val));
-}
-
-static __inline void
-reg_APIAKeyHi_EL1_write(uint64_t __val)
-{
-	__asm __volatile(".arch armv8.3-a+pac\n"
-	    "msr APIAKeyHi_EL1, %0" :: "r"(__val));
-}
-
 #define	PTR_VA_RANGE_SELECT	__BIT(55)
 #define	PTR_PAC_MASK		(__BITS(63,56) | __BITS(54, 48))
 

Index: src/sys/arch/aarch64/include/asm.h
diff -u src/sys/arch/aarch64/include/asm.h:1.7 src/sys/arch/aarch64/include/asm.h:1.8
--- src/sys/arch/aarch64/include/asm.h:1.7	Sun Apr 12 07:49:58 2020
+++ src/sys/arch/aarch64/include/asm.h	Mon May 11 03:00:57 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: asm.h,v 1.7 2020/04/12 07:49:58 maxv Exp $ */
+/* $NetBSD: asm.h,v 1.8 2020/05/11 03:00:57 ryo Exp $ */
 
 #ifndef _AARCH64_ASM_H_
 #define _AARCH64_ASM_H_
@@ -38,7 +38,7 @@
  */
 #ifdef ARMV83_PAC
 #define ARMV8_DEFINE_OPTIONS	\
-	.arch armv8.3-a+pac
+	.arch armv8.3-a
 #else
 #define ARMV8_DEFINE_OPTIONS	/* nothing */
 #endif

Reply via email to