Module Name:    src
Committed By:   skrll
Date:           Sun Jul  2 16:16:44 UTC 2017

Modified Files:
        src/sys/arch/arm/arm: syscall.c undefined.c
        src/sys/arch/arm/arm32: arm32_boot.c arm32_machdep.c fault.c

Log Message:
Consistency around the user trapframe for all LWPs and there's no need to
keep assigning it in kernel entry points.


To generate a diff of this commit:
cvs rdiff -u -r1.61 -r1.62 src/sys/arch/arm/arm/syscall.c
cvs rdiff -u -r1.59 -r1.60 src/sys/arch/arm/arm/undefined.c
cvs rdiff -u -r1.18 -r1.19 src/sys/arch/arm/arm32/arm32_boot.c
cvs rdiff -u -r1.113 -r1.114 src/sys/arch/arm/arm32/arm32_machdep.c
cvs rdiff -u -r1.103 -r1.104 src/sys/arch/arm/arm32/fault.c

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/arm/arm/syscall.c
diff -u src/sys/arch/arm/arm/syscall.c:1.61 src/sys/arch/arm/arm/syscall.c:1.62
--- src/sys/arch/arm/arm/syscall.c:1.61	Sun Jul  2 16:06:42 2017
+++ src/sys/arch/arm/arm/syscall.c	Sun Jul  2 16:16:44 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: syscall.c,v 1.61 2017/07/02 16:06:42 skrll Exp $	*/
+/*	$NetBSD: syscall.c,v 1.62 2017/07/02 16:16:44 skrll Exp $	*/
 
 /*-
  * Copyright (c) 2000, 2003 The NetBSD Foundation, Inc.
@@ -71,7 +71,7 @@
 
 #include <sys/param.h>
 
-__KERNEL_RCSID(0, "$NetBSD: syscall.c,v 1.61 2017/07/02 16:06:42 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: syscall.c,v 1.62 2017/07/02 16:16:44 skrll Exp $");
 
 #include <sys/cpu.h>
 #include <sys/device.h>
@@ -155,7 +155,7 @@ swi_handler(trapframe_t *tf)
 #endif
 	}
 
-	lwp_settrapframe(l, tf);
+	KASSERTMSG(tf == lwp_trapframe(l), "tf %p vs %p", tf, lwp_trapframe(l));
 
 #ifdef CPU_ARM7
 	/*

Index: src/sys/arch/arm/arm/undefined.c
diff -u src/sys/arch/arm/arm/undefined.c:1.59 src/sys/arch/arm/arm/undefined.c:1.60
--- src/sys/arch/arm/arm/undefined.c:1.59	Sat May  6 13:05:59 2017
+++ src/sys/arch/arm/arm/undefined.c	Sun Jul  2 16:16:44 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: undefined.c,v 1.59 2017/05/06 13:05:59 skrll Exp $	*/
+/*	$NetBSD: undefined.c,v 1.60 2017/07/02 16:16:44 skrll Exp $	*/
 
 /*
  * Copyright (c) 2001 Ben Harris.
@@ -55,7 +55,7 @@
 #include <sys/kgdb.h>
 #endif
 
-__KERNEL_RCSID(0, "$NetBSD: undefined.c,v 1.59 2017/05/06 13:05:59 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: undefined.c,v 1.60 2017/07/02 16:16:44 skrll Exp $");
 
 #include <sys/kmem.h>
 #include <sys/queue.h>
@@ -420,7 +420,8 @@ undefinedinstruction(trapframe_t *tf)
 		 * time of fault.
 		 */
 		fault_code = FAULT_USER;
-		lwp_settrapframe(l, tf);
+		KASSERTMSG(tf == lwp_trapframe(l), "tf %p vs %p", tf,
+		    lwp_trapframe(l));
 	} else
 		fault_code = 0;
 

Index: src/sys/arch/arm/arm32/arm32_boot.c
diff -u src/sys/arch/arm/arm32/arm32_boot.c:1.18 src/sys/arch/arm/arm32/arm32_boot.c:1.19
--- src/sys/arch/arm/arm32/arm32_boot.c:1.18	Thu Dec 22 14:47:54 2016
+++ src/sys/arch/arm/arm32/arm32_boot.c	Sun Jul  2 16:16:44 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: arm32_boot.c,v 1.18 2016/12/22 14:47:54 cherry Exp $	*/
+/*	$NetBSD: arm32_boot.c,v 1.19 2017/07/02 16:16:44 skrll Exp $	*/
 
 /*
  * Copyright (c) 2002, 2003, 2005  Genetec Corporation.  All rights reserved.
@@ -123,7 +123,7 @@
 
 #include <sys/cdefs.h>
 
-__KERNEL_RCSID(1, "$NetBSD: arm32_boot.c,v 1.18 2016/12/22 14:47:54 cherry Exp $");
+__KERNEL_RCSID(1, "$NetBSD: arm32_boot.c,v 1.19 2017/07/02 16:16:44 skrll Exp $");
 
 #include "opt_ddb.h"
 #include "opt_kgdb.h"
@@ -173,6 +173,27 @@ initarm_common(vaddr_t kvm_base, vsize_t
 	 */
 	uvm_lwp_setuarea(&lwp0, kernelstack.pv_va);
 
+	struct lwp * const l = &lwp0;
+	struct pcb * const pcb = lwp_getpcb(l);
+
+	/* Zero out the PCB. */
+ 	memset(pcb, 0, sizeof(*pcb));
+
+	pcb->pcb_ksp = uvm_lwp_getuarea(l) + USPACE_SVC_STACK_TOP;
+	pcb->pcb_ksp -= sizeof(struct trapframe);
+
+	struct trapframe * tf = (struct trapframe *)pcb->pcb_ksp;
+
+	/* Zero out the trapframe. */
+	memset(tf, 0, sizeof(*tf));
+	lwp_settrapframe(l, tf);
+
+#if defined(__ARMEB__)
+	tf->tf_spsr = PSR_USR32_MODE | (CPU_IS_ARMV7_P() ? PSR_E_BIT : 0);
+#else
+ 	tf->tf_spsr = PSR_USR32_MODE;
+#endif
+
 #ifdef VERBOSE_INIT_ARM
 	printf("bootstrap done.\n");
 #endif
@@ -313,7 +334,7 @@ initarm_common(vaddr_t kvm_base, vsize_t
 #endif
 
 	/* We return the new stack pointer address */
-	return kernelstack.pv_va + USPACE_SVC_STACK_TOP;
+	return pcb->pcb_ksp;
 }
 
 #ifdef MULTIPROCESSOR

Index: src/sys/arch/arm/arm32/arm32_machdep.c
diff -u src/sys/arch/arm/arm32/arm32_machdep.c:1.113 src/sys/arch/arm/arm32/arm32_machdep.c:1.114
--- src/sys/arch/arm/arm32/arm32_machdep.c:1.113	Sun Jul  2 16:06:42 2017
+++ src/sys/arch/arm/arm32/arm32_machdep.c	Sun Jul  2 16:16:44 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: arm32_machdep.c,v 1.113 2017/07/02 16:06:42 skrll Exp $	*/
+/*	$NetBSD: arm32_machdep.c,v 1.114 2017/07/02 16:16:44 skrll Exp $	*/
 
 /*
  * Copyright (c) 1994-1998 Mark Brinicombe.
@@ -42,7 +42,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: arm32_machdep.c,v 1.113 2017/07/02 16:06:42 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: arm32_machdep.c,v 1.114 2017/07/02 16:16:44 skrll Exp $");
 
 #include "opt_modular.h"
 #include "opt_md.h"
@@ -315,10 +315,30 @@ cpu_startup(void)
 	format_bytes(pbuf, sizeof(pbuf), ptoa(uvmexp.free));
 	printf("avail memory = %s\n", pbuf);
 
+	/*
+	 * This is actually done by initarm_common, but not all ports use it
+	 * yet so do it here to catch them as well
+	 */
 	struct lwp * const l = &lwp0;
 	struct pcb * const pcb = lwp_getpcb(l);
+
+	/* Zero out the PCB. */
+ 	memset(pcb, 0, sizeof(*pcb));
+
 	pcb->pcb_ksp = uvm_lwp_getuarea(l) + USPACE_SVC_STACK_TOP;
-	lwp_settrapframe(l, (struct trapframe *)pcb->pcb_ksp - 1);
+	pcb->pcb_ksp -= sizeof(struct trapframe);
+
+	struct trapframe * tf = (struct trapframe *)pcb->pcb_ksp;
+
+	/* Zero out the trapframe. */
+	memset(tf, 0, sizeof(*tf));
+	lwp_settrapframe(l, tf);
+
+#if defined(__ARMEB__)
+	tf->tf_spsr = PSR_USR32_MODE | (CPU_IS_ARMV7_P() ? PSR_E_BIT : 0);
+#else
+ 	tf->tf_spsr = PSR_USR32_MODE;
+#endif
 }
 
 /*

Index: src/sys/arch/arm/arm32/fault.c
diff -u src/sys/arch/arm/arm32/fault.c:1.103 src/sys/arch/arm/arm32/fault.c:1.104
--- src/sys/arch/arm/arm32/fault.c:1.103	Mon Mar  2 13:36:36 2015
+++ src/sys/arch/arm/arm32/fault.c	Sun Jul  2 16:16:44 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: fault.c,v 1.103 2015/03/02 13:36:36 martin Exp $	*/
+/*	$NetBSD: fault.c,v 1.104 2017/07/02 16:16:44 skrll Exp $	*/
 
 /*
  * Copyright 2003 Wasabi Systems, Inc.
@@ -81,7 +81,7 @@
 #include "opt_kgdb.h"
 
 #include <sys/types.h>
-__KERNEL_RCSID(0, "$NetBSD: fault.c,v 1.103 2015/03/02 13:36:36 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fault.c,v 1.104 2017/07/02 16:16:44 skrll Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -310,9 +310,8 @@ data_abort_handler(trapframe_t *tf)
 		return;
 	}
 
-	if (user) {
-		lwp_settrapframe(l, tf);
-	}
+	KASSERTMSG(!user || tf == lwp_trapframe(l), "tf %p vs %p", tf,
+	    lwp_trapframe(l));
 
 	/*
 	 * Make sure the Program Counter is sane. We could fall foul of
@@ -624,7 +623,7 @@ dab_align(trapframe_t *tf, u_int fsr, u_
 	ksi->ksi_addr = (uint32_t *)(intptr_t)far;
 	ksi->ksi_trap = fsr;
 
-	lwp_settrapframe(l, tf);
+	KASSERTMSG(tf == lwp_trapframe(l), "tf %p vs %p", tf, lwp_trapframe(l));
 
 	return (1);
 }
@@ -731,7 +730,7 @@ dab_buserr(trapframe_t *tf, u_int fsr, u
 	ksi->ksi_addr = (uint32_t *)(intptr_t)far;
 	ksi->ksi_trap = fsr;
 
-	lwp_settrapframe(l, tf);
+	KASSERTMSG(tf == lwp_trapframe(l), "tf %p vs %p", tf, lwp_trapframe(l));
 
 	return (1);
 }
@@ -834,7 +833,8 @@ prefetch_abort_handler(trapframe_t *tf)
 		ksi.ksi_signo = SIGILL;
 		ksi.ksi_code = ILL_ILLOPC;
 		ksi.ksi_addr = (uint32_t *)(intptr_t) tf->tf_pc;
-		lwp_settrapframe(l, tf);
+		KASSERTMSG(tf == lwp_trapframe(l), "tf %p vs %p", tf,
+		    lwp_trapframe(l));
 		goto do_trapsignal;
 	default:
 		break;
@@ -846,7 +846,7 @@ prefetch_abort_handler(trapframe_t *tf)
 
 	/* Get fault address */
 	fault_pc = tf->tf_pc;
-	lwp_settrapframe(l, tf);
+	KASSERTMSG(tf == lwp_trapframe(l), "tf %p vs %p", tf, lwp_trapframe(l));
 	UVMHIST_LOG(maphist, " (pc=0x%x, l=0x%x, tf=0x%x)",
 	    fault_pc, l, tf, 0);
 

Reply via email to