Module Name:    src
Committed By:   ryo
Date:           Fri May 15 04:55:40 UTC 2020

Modified Files:
        src/sys/arch/aarch64/aarch64: cpufunc.c genassym.cf locore.S
        src/sys/arch/aarch64/include: cpufunc.h

Log Message:
SCTLR_EnIA should be enabled in the caller(locore).

For some reason, gcc make aarch64_pac_init() function non-leaf, and it uses 
paciasp/autiasp.


To generate a diff of this commit:
cvs rdiff -u -r1.17 -r1.18 src/sys/arch/aarch64/aarch64/cpufunc.c
cvs rdiff -u -r1.23 -r1.24 src/sys/arch/aarch64/aarch64/genassym.cf
cvs rdiff -u -r1.59 -r1.60 src/sys/arch/aarch64/aarch64/locore.S
cvs rdiff -u -r1.13 -r1.14 src/sys/arch/aarch64/include/cpufunc.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/aarch64/cpufunc.c
diff -u src/sys/arch/aarch64/aarch64/cpufunc.c:1.17 src/sys/arch/aarch64/aarch64/cpufunc.c:1.18
--- src/sys/arch/aarch64/aarch64/cpufunc.c:1.17	Sun Apr 12 07:49:58 2020
+++ src/sys/arch/aarch64/aarch64/cpufunc.c	Fri May 15 04:55:40 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpufunc.c,v 1.17 2020/04/12 07:49:58 maxv Exp $	*/
+/*	$NetBSD: cpufunc.c,v 1.18 2020/05/15 04:55:40 ryo Exp $	*/
 
 /*
  * Copyright (c) 2017 Ryo Shimizu <r...@nerv.org>
@@ -30,7 +30,7 @@
 #include "opt_multiprocessor.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cpufunc.c,v 1.17 2020/04/12 07:49:58 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpufunc.c,v 1.18 2020/05/15 04:55:40 ryo Exp $");
 
 #include <sys/param.h>
 #include <sys/types.h>
@@ -443,14 +443,15 @@ set_cpufuncs(void)
 }
 
 /*
- * TODO: this function should have a "no-pac" attribute. Right now it
- * doesn't use PAC so that's fine.
+ * In order to avoid inconsistencies with pointer authentication
+ * in this function itself, the caller must enable PAC according
+ * to the return value.
  */
-void
+int
 aarch64_pac_init(int primary)
 {
 #ifdef ARMV83_PAC
-	uint64_t reg, sctlr;
+	uint64_t reg;
 
 	/* CPU0 does the detection. */
 	if (primary) {
@@ -470,15 +471,14 @@ aarch64_pac_init(int primary)
 	}
 
 	if (!aarch64_pac_enabled)
-		return;
-
-	/* Enable PAC on the CPU. */
-	sctlr = reg_sctlr_el1_read();
-	sctlr |= SCTLR_EnIA;
-	reg_sctlr_el1_write(sctlr);
+		return -1;
 
 	/* Set the key. Curlwp here is the CPU's idlelwp. */
 	reg_APIAKeyLo_EL1_write(curlwp->l_md.md_ia_kern_lo);
 	reg_APIAKeyHi_EL1_write(curlwp->l_md.md_ia_kern_hi);
+
+	return 0;
+#else
+	return -1;
 #endif
 }

Index: src/sys/arch/aarch64/aarch64/genassym.cf
diff -u src/sys/arch/aarch64/aarch64/genassym.cf:1.23 src/sys/arch/aarch64/aarch64/genassym.cf:1.24
--- src/sys/arch/aarch64/aarch64/genassym.cf:1.23	Sun Apr 12 07:49:58 2020
+++ src/sys/arch/aarch64/aarch64/genassym.cf	Fri May 15 04:55:40 2020
@@ -1,4 +1,4 @@
-# $NetBSD: genassym.cf,v 1.23 2020/04/12 07:49:58 maxv Exp $
+# $NetBSD: genassym.cf,v 1.24 2020/05/15 04:55:40 ryo Exp $
 #-
 # Copyright (c) 2014 The NetBSD Foundation, Inc.
 # All rights reserved.
@@ -363,6 +363,7 @@ define	SCTLR_EE		SCTLR_EE
 define	SCTLR_UCI		SCTLR_UCI
 define	SCTLR_nTLSMD		SCTLR_nTLSMD
 define	SCTLR_LSMAOE		SCTLR_LSMAOE
+define	SCTLR_EnIA		SCTLR_EnIA
 
 define	ICC_SRE_EL2_EN		ICC_SRE_EL2_EN
 define	ICC_SRE_EL2_SRE		ICC_SRE_EL2_SRE

Index: src/sys/arch/aarch64/aarch64/locore.S
diff -u src/sys/arch/aarch64/aarch64/locore.S:1.59 src/sys/arch/aarch64/aarch64/locore.S:1.60
--- src/sys/arch/aarch64/aarch64/locore.S:1.59	Sun Apr 12 07:49:58 2020
+++ src/sys/arch/aarch64/aarch64/locore.S	Fri May 15 04:55:40 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: locore.S,v 1.59 2020/04/12 07:49:58 maxv Exp $	*/
+/*	$NetBSD: locore.S,v 1.60 2020/05/15 04:55:40 ryo Exp $	*/
 
 /*
  * Copyright (c) 2017 Ryo Shimizu <r...@nerv.org>
@@ -38,7 +38,7 @@
 #include <aarch64/hypervisor.h>
 #include "assym.h"
 
-RCSID("$NetBSD: locore.S,v 1.59 2020/04/12 07:49:58 maxv Exp $")
+RCSID("$NetBSD: locore.S,v 1.60 2020/05/15 04:55:40 ryo Exp $")
 
 #ifdef AARCH64_DEVICE_MEM_STRONGLY_ORDERED
 #define	MAIR_DEVICE_MEM		MAIR_DEVICE_nGnRnE
@@ -181,6 +181,11 @@ vstart:
 	/* init PAC if supported */
 	mov	x0, #1
 	bl	aarch64_pac_init
+	cbnz	w0, 1f			/* if (aarch64_pac_init() == 0) */
+	mrs	x0, sctlr_el1
+	orr	x0, x0, #SCTLR_EnIA	/*  enable PAC */
+	msr	sctlr_el1, x0
+1:
 
 	/* set topology information */
 	mrs	x0, tpidr_el1		/* curcpu */
@@ -509,6 +514,11 @@ mp_vstart:
 	/* init PAC if supported */
 	mov	x0, #0
 	bl	aarch64_pac_init
+	cbnz	w0, 1f			/* if (aarch64_pac_init() == 0) */
+	mrs	x0, sctlr_el1
+	orr	x0, x0, #SCTLR_EnIA	/*  enable PAC */
+	msr	sctlr_el1, x0
+1:
 
 	mov	fp, xzr			/* trace back starts here */
 	mrs	x0, tpidr_el1		/* curcpu() */

Index: src/sys/arch/aarch64/include/cpufunc.h
diff -u src/sys/arch/aarch64/include/cpufunc.h:1.13 src/sys/arch/aarch64/include/cpufunc.h:1.14
--- src/sys/arch/aarch64/include/cpufunc.h:1.13	Wed May 13 06:08:51 2020
+++ src/sys/arch/aarch64/include/cpufunc.h	Fri May 15 04:55:40 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpufunc.h,v 1.13 2020/05/13 06:08:51 ryo Exp $	*/
+/*	$NetBSD: cpufunc.h,v 1.14 2020/05/15 04:55:40 ryo Exp $	*/
 
 /*
  * Copyright (c) 2017 Ryo Shimizu <r...@nerv.org>
@@ -70,7 +70,7 @@ extern u_int cputype;			/* compat arm */
 
 extern int aarch64_pac_enabled;
 
-void aarch64_pac_init(int);
+int aarch64_pac_init(int);
 
 int set_cpufuncs(void);
 void aarch64_getcacheinfo(int);

Reply via email to