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 <[email protected]>
@@ -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 <[email protected]>
@@ -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 <[email protected]>
@@ -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);