Module Name:    src
Committed By:   matt
Date:           Thu Aug 16 17:35:01 UTC 2012

Modified Files:
        src/sys/arch/acorn26/acorn26: cpuswitch.c except.c machdep.c
            vm_machdep.c
        src/sys/arch/arm/arm: arm_machdep.c ast.c compat_13_machdep.c
            compat_16_machdep.c syscall.c undefined.c
        src/sys/arch/arm/arm32: arm32_machdep.c cpuswitch.S fault.c genassym.cf
            vm_machdep.c
        src/sys/arch/arm/include: cpu.h frame.h pcb.h proc.h
        src/sys/arch/arm/include/arm32: frame.h

Log Message:
small rototill.
pcb_flags is dead.  PCB_NOALIGNFLT is now in stored l_md.md_flags as
MDLWP_NOALIGNFLT.  This avoids a few loads of the PCB in exception handling.
pcb_tf has been moved to l_md.md_tf.  Again this avoids a lot of pcb
references just to access or set this.  It also means that pcb doesn't
need to accessed by MI code.
Move pcb_onfault to after the pcb union.
Add pcb_sp macro to make code prettier.
Add lwp_settrapframe(l, tf) to set the l_md.md_tf field.
Use lwp_trapframe to access it (was process_frame but that name was changed
in a previous commit).
Kill off curpcb in acorn26.
Kill the checks for curlwp being NULL.
Move TRAP_USERMODE from arm32/fault.c to frame.h and a __PROG26 version.
Replace tests for usermode with that macro.


To generate a diff of this commit:
cvs rdiff -u -r1.17 -r1.18 src/sys/arch/acorn26/acorn26/cpuswitch.c
cvs rdiff -u -r1.28 -r1.29 src/sys/arch/acorn26/acorn26/except.c \
    src/sys/arch/acorn26/acorn26/vm_machdep.c
cvs rdiff -u -r1.36 -r1.37 src/sys/arch/acorn26/acorn26/machdep.c
cvs rdiff -u -r1.32 -r1.33 src/sys/arch/arm/arm/arm_machdep.c
cvs rdiff -u -r1.20 -r1.21 src/sys/arch/arm/arm/ast.c
cvs rdiff -u -r1.16 -r1.17 src/sys/arch/arm/arm/compat_13_machdep.c
cvs rdiff -u -r1.15 -r1.16 src/sys/arch/arm/arm/compat_16_machdep.c
cvs rdiff -u -r1.55 -r1.56 src/sys/arch/arm/arm/syscall.c
cvs rdiff -u -r1.46 -r1.47 src/sys/arch/arm/arm/undefined.c
cvs rdiff -u -r1.80 -r1.81 src/sys/arch/arm/arm32/arm32_machdep.c
cvs rdiff -u -r1.65 -r1.66 src/sys/arch/arm/arm32/cpuswitch.S
cvs rdiff -u -r1.82 -r1.83 src/sys/arch/arm/arm32/fault.c
cvs rdiff -u -r1.48 -r1.49 src/sys/arch/arm/arm32/genassym.cf
cvs rdiff -u -r1.58 -r1.59 src/sys/arch/arm/arm32/vm_machdep.c
cvs rdiff -u -r1.67 -r1.68 src/sys/arch/arm/include/cpu.h
cvs rdiff -u -r1.16 -r1.17 src/sys/arch/arm/include/frame.h
cvs rdiff -u -r1.23 -r1.24 src/sys/arch/arm/include/pcb.h
cvs rdiff -u -r1.11 -r1.12 src/sys/arch/arm/include/proc.h
cvs rdiff -u -r1.30 -r1.31 src/sys/arch/arm/include/arm32/frame.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/acorn26/acorn26/cpuswitch.c
diff -u src/sys/arch/acorn26/acorn26/cpuswitch.c:1.17 src/sys/arch/acorn26/acorn26/cpuswitch.c:1.18
--- src/sys/arch/acorn26/acorn26/cpuswitch.c:1.17	Sat Nov 21 20:32:17 2009
+++ src/sys/arch/acorn26/acorn26/cpuswitch.c	Thu Aug 16 17:35:01 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpuswitch.c,v 1.17 2009/11/21 20:32:17 rmind Exp $	*/
+/*	$NetBSD: cpuswitch.c,v 1.18 2012/08/16 17:35:01 matt Exp $	*/
 
 /*
  * Copyright (c) 2000 Ben Harris.
@@ -38,7 +38,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cpuswitch.c,v 1.17 2009/11/21 20:32:17 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpuswitch.c,v 1.18 2012/08/16 17:35:01 matt Exp $");
 
 #include "opt_lockdebug.h"
 
@@ -60,8 +60,6 @@ __KERNEL_RCSID(0, "$NetBSD: cpuswitch.c,
 lwp_t *
 cpu_switchto(lwp_t *old, lwp_t *new, bool returning)
 {
-	struct cpu_info * const ci = curcpu();
-	struct pcb *pcb;
 	struct proc *p2;
 
 	/*
@@ -73,14 +71,12 @@ cpu_switchto(lwp_t *old, lwp_t *new, boo
 #endif
 
 	curlwp = new;
-	pcb = lwp_getpcb(curlwp);
-	ci->ci_curpcb = pcb;
 
 	if ((new->l_flag & LW_SYSTEM) == 0) {
 		/* Check for Restartable Atomic Sequences. */
 		p2 = new->l_proc;
 		if (p2->p_raslist != NULL) {
-			struct trapframe *tf = pcb->pcb_tf;
+			struct trapframe * const tf = lwp_trapframe(curlwp);
 			void *pc;
 
 			pc = ras_lookup(p2, (void *)(tf->tf_r15 & R15_PC));

Index: src/sys/arch/acorn26/acorn26/except.c
diff -u src/sys/arch/acorn26/acorn26/except.c:1.28 src/sys/arch/acorn26/acorn26/except.c:1.29
--- src/sys/arch/acorn26/acorn26/except.c:1.28	Fri May 11 15:39:17 2012
+++ src/sys/arch/acorn26/acorn26/except.c	Thu Aug 16 17:35:01 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: except.c,v 1.28 2012/05/11 15:39:17 skrll Exp $ */
+/* $NetBSD: except.c,v 1.29 2012/08/16 17:35:01 matt Exp $ */
 /*-
  * Copyright (c) 1998, 1999, 2000 Ben Harris
  * All rights reserved.
@@ -31,7 +31,7 @@
 
 #include <sys/param.h>
 
-__KERNEL_RCSID(0, "$NetBSD: except.c,v 1.28 2012/05/11 15:39:17 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: except.c,v 1.29 2012/08/16 17:35:01 matt Exp $");
 
 #include "opt_ddb.h"
 
@@ -93,9 +93,8 @@ checkvectors(void)
 void
 prefetch_abort_handler(struct trapframe *tf)
 {
-	vaddr_t pc;
-	struct proc *p;
-	struct lwp *l;
+	struct lwp * const l = curlwp;
+	struct proc * const p = l->l_proc;
 
 	/* Enable interrupts if they were enabled before the trap. */
 	if ((tf->tf_r15 & R15_IRQ_DISABLE) == 0)
@@ -109,18 +108,11 @@ prefetch_abort_handler(struct trapframe 
 	 */
 
 	curcpu()->ci_data.cpu_ntrap++;
-	l = curlwp;
-	if (l == NULL)
-		l = &lwp0;
-	p = l->l_proc;
 
-	if ((tf->tf_r15 & R15_MODE) == R15_MODE_USR) {
-		struct pcb *pcb = lwp_getpcb(l);
-		pcb->pcb_tf = tf;
+	if (TRAP_USERMODE(tf)) {
+		lwp_settrapframe(l, tf);
 		LWP_CACHE_CREDS(l, p);
-	}
-
-	if ((tf->tf_r15 & R15_MODE) != R15_MODE_USR) {
+	} else {
 #ifdef DDB
 		db_printf("Prefetch abort in kernel mode\n");
 		kdb_trap(T_FAULT, tf);
@@ -134,7 +126,7 @@ prefetch_abort_handler(struct trapframe 
 	}
 
 	/* User-mode prefetch abort */
-	pc = tf->tf_r15 & R15_PC;
+	vaddr_t pc = tf->tf_r15 & R15_PC;
 
 	do_fault(tf, l, &p->p_vmspace->vm_map, pc, VM_PROT_EXECUTE);
 
@@ -144,13 +136,13 @@ prefetch_abort_handler(struct trapframe 
 void
 data_abort_handler(struct trapframe *tf)
 {
-	vaddr_t pc, va;
-	vsize_t asize;
-	struct proc *p;
-	struct lwp *l;
+	struct lwp * const l = curlwp;
+	struct proc * const p = l->l_proc;
 	vm_prot_t atype;
 	bool usrmode, twopages;
 	struct vm_map *map;
+	vaddr_t pc, va;
+	vsize_t asize;
 
 	/*
 	 * Data aborts in kernel mode are possible (copyout etc), so
@@ -167,13 +159,8 @@ data_abort_handler(struct trapframe *tf)
 	if ((tf->tf_r15 & R15_IRQ_DISABLE) == 0)
 		int_on();
 	curcpu()->ci_data.cpu_ntrap++;
-	l = curlwp;
-	if (l == NULL)
-		l = &lwp0;
-	p = l->l_proc;
 	if ((tf->tf_r15 & R15_MODE) == R15_MODE_USR) {
-		struct pcb *pcb = lwp_getpcb(l);
-		pcb->pcb_tf = tf;
+		lwp_settrapframe(l, tf);
 		LWP_CACHE_CREDS(l, p);
 	}
 	pc = tf->tf_r15 & R15_PC;
@@ -190,7 +177,7 @@ data_abort_handler(struct trapframe *tf)
 	if (twopages)
 		do_fault(tf, l, map, va + asize - 4, atype);
 
-	if ((tf->tf_r15 & R15_MODE) == R15_MODE_USR)
+	if (TRAP_USERMODE(tf))
 		userret(l);
 }
 
@@ -202,16 +189,13 @@ do_fault(struct trapframe *tf, struct lw
     struct vm_map *map, vaddr_t va, vm_prot_t atype)
 {
 	int error;
-	struct pcb *pcb;
-	void *onfault;
-	bool user;
 
 	if (pmap_fault(map->pmap, va, atype))
 		return;
 
-	pcb = lwp_getpcb(l);
-	onfault = pcb->pcb_onfault;
-	user = (tf->tf_r15 & R15_MODE) == R15_MODE_USR;
+	struct pcb * const pcb = lwp_getpcb(l);
+	void * const onfault = pcb->pcb_onfault;
+	const bool user = TRAP_USERMODE(tf);
 
 	if (cpu_intr_p()) {
 		KASSERT(!user);
@@ -459,7 +443,7 @@ data_abort_usrmode(struct trapframe *tf)
 {
 	register_t insn;
 
-	if ((tf->tf_r15 & R15_MODE) == R15_MODE_USR)
+	if (TRAP_USERMODE(tf))
 		return true;
 	insn = *(register_t *)(tf->tf_r15 & R15_PC);
 	if ((insn & 0x0d200000) == 0x04200000)
@@ -471,33 +455,30 @@ data_abort_usrmode(struct trapframe *tf)
 void
 address_exception_handler(struct trapframe *tf)
 {
-	struct lwp *l;
-	vaddr_t pc;
+	struct lwp * const l = curlwp;
+	struct pcb * const pcb = lwp_getpcb(l);
 	ksiginfo_t ksi;
 
 	/* Enable interrupts if they were enabled before the trap. */
 	if ((tf->tf_r15 & R15_IRQ_DISABLE) == 0)
 		int_on();
+
 	curcpu()->ci_data.cpu_ntrap++;
-	l = curlwp;
-	if (l == NULL)
-		l = &lwp0;
-	if ((tf->tf_r15 & R15_MODE) == R15_MODE_USR) {
-		struct pcb *pcb = lwp_getpcb(l);
-		pcb->pcb_tf = tf;
+	if (TRAP_USERMODE(tf)) {
+		lwp_settrapframe(l, tf);
 		LWP_CACHE_CREDS(l, l->l_proc);
 	}
 
-	if (curpcb->pcb_onfault != NULL) {
+	if (pcb->pcb_onfault != NULL) {
 		tf->tf_r0 = EFAULT;
 		tf->tf_r15 = (tf->tf_r15 & ~R15_PC) |
-		    (register_t)curpcb->pcb_onfault;
+		    (uintptr_t)pcb->pcb_onfault;
 		return;
 	}
 
-	pc = tf->tf_r15 & R15_PC;
+	vaddr_t pc = tf->tf_r15 & R15_PC;
 
-	if ((tf->tf_r15 & R15_MODE) != R15_MODE_USR) {
+	if (!TRAP_USERMODE(tf)) {
 #ifdef DDB
 		db_printf("Address exception in kernel mode\n");
 		kdb_trap(T_FAULT, tf);
Index: src/sys/arch/acorn26/acorn26/vm_machdep.c
diff -u src/sys/arch/acorn26/acorn26/vm_machdep.c:1.28 src/sys/arch/acorn26/acorn26/vm_machdep.c:1.29
--- src/sys/arch/acorn26/acorn26/vm_machdep.c:1.28	Sun Feb 19 21:05:58 2012
+++ src/sys/arch/acorn26/acorn26/vm_machdep.c	Thu Aug 16 17:35:01 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: vm_machdep.c,v 1.28 2012/02/19 21:05:58 rmind Exp $ */
+/* $NetBSD: vm_machdep.c,v 1.29 2012/08/16 17:35:01 matt Exp $ */
 
 /*-
  * Copyright (c) 2000, 2001 Ben Harris
@@ -64,7 +64,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.28 2012/02/19 21:05:58 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.29 2012/08/16 17:35:01 matt Exp $");
 
 #include <sys/param.h>
 #include <sys/buf.h>
@@ -80,6 +80,7 @@ __KERNEL_RCSID(0, "$NetBSD: vm_machdep.c
 #include <machine/frame.h>
 #include <machine/intr.h>
 #include <machine/machdep.h>
+#include <machine/pcb.h>
 
 /*
  * Finish a fork operation, with thread l2 nearly set up.
@@ -122,21 +123,21 @@ cpu_lwp_fork(struct lwp *l1, struct lwp 
 	tf = (struct trapframe *)(uvm_lwp_getuarea(l2) + USPACE) - 1;
 	sf = (struct switchframe *)tf - 1;
 	/* Duplicate old process's trapframe (if it had one) */
-	if (pcb1->pcb_tf == NULL)
+	if (lwp_trapframe(l1) == NULL)
 		memset(tf, 0, sizeof(*tf));
 	else
-		*tf = *pcb1->pcb_tf;
+		*tf = *lwp_trapframe(l1);
 	/* If specified, give the child a different stack. */
 	if (stack != NULL)
 		tf->tf_usr_sp = (u_int)stack + stacksize;
-	pcb2->pcb_tf = tf;
+	lwp_settrapframe(l2, tf);
 	/* Fabricate a new switchframe */
 	memset(sf, 0, sizeof(*sf));
 
 	sf->sf_r13 = (register_t)tf; /* Initial stack pointer */
 	sf->sf_pc  = (register_t)lwp_trampoline | R15_MODE_SVC;
 
-	pcb2->pcb_tf = tf;
+	lwp_settrapframe(l2, tf);
 	pcb2->pcb_sf = sf;
 	pcb2->pcb_onfault = NULL;
 	sf->sf_r4 = (register_t)func;

Index: src/sys/arch/acorn26/acorn26/machdep.c
diff -u src/sys/arch/acorn26/acorn26/machdep.c:1.36 src/sys/arch/acorn26/acorn26/machdep.c:1.37
--- src/sys/arch/acorn26/acorn26/machdep.c:1.36	Fri May 11 15:39:17 2012
+++ src/sys/arch/acorn26/acorn26/machdep.c	Thu Aug 16 17:35:01 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: machdep.c,v 1.36 2012/05/11 15:39:17 skrll Exp $ */
+/* $NetBSD: machdep.c,v 1.37 2012/08/16 17:35:01 matt Exp $ */
 
 /*-
  * Copyright (c) 1998 Ben Harris
@@ -32,7 +32,7 @@
 
 #include <sys/param.h>
 
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.36 2012/05/11 15:39:17 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.37 2012/08/16 17:35:01 matt Exp $");
 
 #include <sys/buf.h>
 #include <sys/kernel.h>
@@ -169,8 +169,6 @@ cpu_startup(void)
 	format_bytes(pbuf, sizeof(pbuf), ptoa(uvmexp.free));
 	printf("avail memory = %s\n", pbuf);
 
-	curpcb = lwp_getpcb(&lwp0);
-
 #if 0
 	/* Test exception handlers */
 	__asm(".word 0x06000010"); /* undefined instruction */

Index: src/sys/arch/arm/arm/arm_machdep.c
diff -u src/sys/arch/arm/arm/arm_machdep.c:1.32 src/sys/arch/arm/arm/arm_machdep.c:1.33
--- src/sys/arch/arm/arm/arm_machdep.c:1.32	Sun Aug 12 05:05:47 2012
+++ src/sys/arch/arm/arm/arm_machdep.c	Thu Aug 16 17:35:01 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: arm_machdep.c,v 1.32 2012/08/12 05:05:47 matt Exp $	*/
+/*	$NetBSD: arm_machdep.c,v 1.33 2012/08/16 17:35:01 matt Exp $	*/
 
 /*
  * Copyright (c) 2001 Wasabi Systems, Inc.
@@ -78,7 +78,7 @@
 
 #include <sys/param.h>
 
-__KERNEL_RCSID(0, "$NetBSD: arm_machdep.c,v 1.32 2012/08/12 05:05:47 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: arm_machdep.c,v 1.33 2012/08/16 17:35:01 matt Exp $");
 
 #include <sys/exec.h>
 #include <sys/proc.h>
@@ -94,7 +94,6 @@ __KERNEL_RCSID(0, "$NetBSD: arm_machdep.
 
 #include <arm/cpufunc.h>
 
-#include <machine/pcb.h>
 #include <machine/vmparam.h>
 
 /* the following is used externally (sysctl_hw) */
@@ -152,11 +151,7 @@ EVCNT_ATTACH_STATIC(_lock_cas_fail);
 void
 setregs(struct lwp *l, struct exec_package *pack, vaddr_t stack)
 {
-	struct pcb *pcb;
-	struct trapframe *tf;
-
-	pcb = lwp_getpcb(l);
-	tf = pcb->pcb_tf;
+	struct trapframe * const tf = lwp_trapframe(l);
 
 	memset(tf, 0, sizeof(*tf));
 	tf->tf_r0 = l->l_proc->p_psstrp;
@@ -173,12 +168,11 @@ setregs(struct lwp *l, struct exec_packa
 #endif
 #endif
 
+	l->l_md.md_flags = 0;
 #ifdef EXEC_AOUT
 	if (pack->ep_esch->es_makecmds == exec_aout_makecmds)
-		pcb->pcb_flags = PCB_NOALIGNFLT;
-	else
+		l->l_md.md_flags |= MDLWP_NOALIGNFLT;
 #endif
-	pcb->pcb_flags = 0;
 #ifdef FPU_VFP
 	vfp_discardcontext();
 #endif

Index: src/sys/arch/arm/arm/ast.c
diff -u src/sys/arch/arm/arm/ast.c:1.20 src/sys/arch/arm/arm/ast.c:1.21
--- src/sys/arch/arm/arm/ast.c:1.20	Mon Dec 20 00:25:26 2010
+++ src/sys/arch/arm/arm/ast.c	Thu Aug 16 17:35:01 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: ast.c,v 1.20 2010/12/20 00:25:26 matt Exp $	*/
+/*	$NetBSD: ast.c,v 1.21 2012/08/16 17:35:01 matt Exp $	*/
 
 /*
  * Copyright (c) 1994,1995 Mark Brinicombe
@@ -41,7 +41,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ast.c,v 1.20 2010/12/20 00:25:26 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ast.c,v 1.21 2012/08/16 17:35:01 matt Exp $");
 
 #include "opt_ddb.h"
 
@@ -77,10 +77,7 @@ userret(struct lwp *l)
 	mi_userret(l);
 
 #if defined(__PROG32) && defined(DIAGNOSTIC)
-	{
-		struct pcb *pcb = lwp_getpcb(l);
-		KASSERT((pcb->pcb_tf->tf_spsr & IF32_bits) == 0);
-	}
+	KASSERT((lwp_trapframe(l)->tf_spsr & IF32_bits) == 0);
 #endif
 }
 
@@ -94,8 +91,7 @@ userret(struct lwp *l)
 void
 ast(struct trapframe *tf)
 {
-	struct lwp *l = curlwp;
-	struct proc *p;
+	struct lwp * const l = curlwp;
 
 #ifdef acorn26
 	/* Enable interrupts if they were enabled before the trap. */
@@ -109,20 +105,13 @@ ast(struct trapframe *tf)
 	KASSERT((tf->tf_spsr & IF32_bits) == 0);
 #endif
 
-
 	curcpu()->ci_data.cpu_ntrap++;
 	//curcpu()->ci_data.cpu_nast++;
 
 #ifdef DEBUG
 	KDASSERT(curcpu()->ci_cpl == IPL_NONE);
-	if (l == NULL)
-		panic("ast: no curlwp!");
-	if (lwp_getpcb(l) == NULL)
-		panic("ast: no pcb!");
 #endif	
 
-	p = l->l_proc;
-
 	if (l->l_pflag & LP_OWEUPC) {
 		l->l_pflag &= ~LP_OWEUPC;
 		ADDUPROF(l);

Index: src/sys/arch/arm/arm/compat_13_machdep.c
diff -u src/sys/arch/arm/arm/compat_13_machdep.c:1.16 src/sys/arch/arm/arm/compat_13_machdep.c:1.17
--- src/sys/arch/arm/arm/compat_13_machdep.c:1.16	Sat Nov 21 20:32:17 2009
+++ src/sys/arch/arm/arm/compat_13_machdep.c	Thu Aug 16 17:35:01 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: compat_13_machdep.c,v 1.16 2009/11/21 20:32:17 rmind Exp $	*/
+/*	$NetBSD: compat_13_machdep.c,v 1.17 2012/08/16 17:35:01 matt Exp $	*/
 
 /*
  * Copyright (c) 1994-1998 Mark Brinicombe.
@@ -38,7 +38,7 @@
 
 #include <sys/param.h>
 
-__KERNEL_RCSID(0, "$NetBSD: compat_13_machdep.c,v 1.16 2009/11/21 20:32:17 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: compat_13_machdep.c,v 1.17 2012/08/16 17:35:01 matt Exp $");
 
 #include <sys/systm.h>
 #include <sys/signalvar.h>
@@ -57,9 +57,8 @@ compat_13_sys_sigreturn(struct lwp *l, c
 		syscallarg(struct sigcontext13 *) sigcntxp;
 	} */
 	struct sigcontext13 *scp, context;
-	struct trapframe *tf;
-	struct proc *p = l->l_proc;
-	struct pcb *pcb;
+	struct trapframe * const tf = lwp_trapframe(l);
+	struct proc * const p = l->l_proc;
 	sigset_t mask;
 
 	/*
@@ -79,8 +78,6 @@ compat_13_sys_sigreturn(struct lwp *l, c
 		return EINVAL;
 
 	/* Restore register context. */
-	pcb = lwp_getpcb(l);
-	tf = pcb->pcb_tf;
 	tf->tf_r0    = context.sc_r0;
 	tf->tf_r1    = context.sc_r1;
 	tf->tf_r2    = context.sc_r2;

Index: src/sys/arch/arm/arm/compat_16_machdep.c
diff -u src/sys/arch/arm/arm/compat_16_machdep.c:1.15 src/sys/arch/arm/arm/compat_16_machdep.c:1.16
--- src/sys/arch/arm/arm/compat_16_machdep.c:1.15	Thu Aug 16 16:41:53 2012
+++ src/sys/arch/arm/arm/compat_16_machdep.c	Thu Aug 16 17:35:01 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: compat_16_machdep.c,v 1.15 2012/08/16 16:41:53 matt Exp $	*/
+/*	$NetBSD: compat_16_machdep.c,v 1.16 2012/08/16 17:35:01 matt Exp $	*/
 
 /*
  * Copyright (c) 1994-1998 Mark Brinicombe.
@@ -42,7 +42,7 @@
 
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: compat_16_machdep.c,v 1.15 2012/08/16 16:41:53 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: compat_16_machdep.c,v 1.16 2012/08/16 17:35:01 matt Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_compat_netbsd.h"
@@ -62,7 +62,6 @@ __KERNEL_RCSID(0, "$NetBSD: compat_16_ma
 
 #include <machine/cpu.h>
 #include <machine/frame.h>
-#include <machine/pcb.h>
 #ifndef acorn26
 #include <arm/cpufunc.h>
 #endif

Index: src/sys/arch/arm/arm/syscall.c
diff -u src/sys/arch/arm/arm/syscall.c:1.55 src/sys/arch/arm/arm/syscall.c:1.56
--- src/sys/arch/arm/arm/syscall.c:1.55	Thu Aug 16 17:04:21 2012
+++ src/sys/arch/arm/arm/syscall.c	Thu Aug 16 17:35:01 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: syscall.c,v 1.55 2012/08/16 17:04:21 matt Exp $	*/
+/*	$NetBSD: syscall.c,v 1.56 2012/08/16 17:35:01 matt 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.55 2012/08/16 17:04:21 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: syscall.c,v 1.56 2012/08/16 17:35:01 matt Exp $");
 
 #include <sys/device.h>
 #include <sys/errno.h>
@@ -87,7 +87,6 @@ __KERNEL_RCSID(0, "$NetBSD: syscall.c,v 
 
 #include <machine/cpu.h>
 #include <machine/frame.h>
-#include <machine/pcb.h>
 #include <arm/swi.h>
 
 #ifdef acorn26
@@ -97,8 +96,7 @@ __KERNEL_RCSID(0, "$NetBSD: syscall.c,v 
 void
 swi_handler(trapframe_t *tf)
 {
-	lwp_t *l = curlwp;
-	struct pcb *pcb;
+	lwp_t * const l = curlwp;
 	uint32_t insn;
 
 	/*
@@ -161,8 +159,7 @@ swi_handler(trapframe_t *tf)
 #endif
 	}
 
-	pcb = lwp_getpcb(l);
-	pcb->pcb_tf = tf;
+	lwp_settrapframe(l, tf);
 
 #ifdef CPU_ARM7
 	/*
@@ -314,9 +311,8 @@ syscall(struct trapframe *tf, lwp_t *l, 
 void
 child_return(void *arg)
 {
-	lwp_t *l = arg;
-	struct pcb *pcb = lwp_getpcb(l);
-	struct trapframe *tf = pcb->pcb_tf;
+	lwp_t * const l = arg;
+	struct trapframe * const tf = lwp_trapframe(l);
 
 	tf->tf_r0 = 0;
 #ifdef __PROG32

Index: src/sys/arch/arm/arm/undefined.c
diff -u src/sys/arch/arm/arm/undefined.c:1.46 src/sys/arch/arm/arm/undefined.c:1.47
--- src/sys/arch/arm/arm/undefined.c:1.46	Sun Aug 12 05:05:47 2012
+++ src/sys/arch/arm/arm/undefined.c	Thu Aug 16 17:35:01 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: undefined.c,v 1.46 2012/08/12 05:05:47 matt Exp $	*/
+/*	$NetBSD: undefined.c,v 1.47 2012/08/16 17:35:01 matt Exp $	*/
 
 /*
  * Copyright (c) 2001 Ben Harris.
@@ -54,7 +54,7 @@
 #include <sys/kgdb.h>
 #endif
 
-__KERNEL_RCSID(0, "$NetBSD: undefined.c,v 1.46 2012/08/12 05:05:47 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: undefined.c,v 1.47 2012/08/16 17:35:01 matt Exp $");
 
 #include <sys/kmem.h>
 #include <sys/queue.h>
@@ -63,6 +63,7 @@ __KERNEL_RCSID(0, "$NetBSD: undefined.c,
 #include <sys/proc.h>
 #include <sys/syslog.h>
 #include <sys/vmmeter.h>
+#include <sys/cpu.h>
 #ifdef FAST_FPE
 #include <sys/acct.h>
 #endif
@@ -70,11 +71,12 @@ __KERNEL_RCSID(0, "$NetBSD: undefined.c,
 
 #include <uvm/uvm_extern.h>
 
-#include <machine/cpu.h>
 #include <machine/frame.h>
-#include <arm/undefined.h>
+#include <machine/pcb.h>
 #include <machine/trap.h>
 
+#include <arm/undefined.h>
+
 #include <arch/arm/arm/disassem.h>
 
 #ifdef DDB
@@ -363,13 +365,12 @@ undefinedinstruction(trapframe_t *frame)
 	}
 
 	if (user) {
-		struct pcb *pcb = lwp_getpcb(l);
 		/*
 		 * Modify the fault_code to reflect the USR/SVC state at
 		 * time of fault.
 		 */
 		fault_code = FAULT_USER;
-		pcb->pcb_tf = frame;
+		lwp_settrapframe(l, frame);
 	} else
 		fault_code = 0;
 

Index: src/sys/arch/arm/arm32/arm32_machdep.c
diff -u src/sys/arch/arm/arm32/arm32_machdep.c:1.80 src/sys/arch/arm/arm32/arm32_machdep.c:1.81
--- src/sys/arch/arm/arm32/arm32_machdep.c:1.80	Tue Aug 14 20:42:33 2012
+++ src/sys/arch/arm/arm32/arm32_machdep.c	Thu Aug 16 17:35:01 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: arm32_machdep.c,v 1.80 2012/08/14 20:42:33 matt Exp $	*/
+/*	$NetBSD: arm32_machdep.c,v 1.81 2012/08/16 17:35:01 matt Exp $	*/
 
 /*
  * Copyright (c) 1994-1998 Mark Brinicombe.
@@ -42,7 +42,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: arm32_machdep.c,v 1.80 2012/08/14 20:42:33 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: arm32_machdep.c,v 1.81 2012/08/16 17:35:01 matt Exp $");
 
 #include "opt_modular.h"
 #include "opt_md.h"
@@ -70,7 +70,12 @@ __KERNEL_RCSID(0, "$NetBSD: arm32_machde
 
 #include <arm/arm32/katelib.h>
 #include <arm/arm32/machdep.h>
+
 #include <machine/bootconfig.h>
+#include <machine/pcb.h>
+
+//void (*cpu_reset_address)(void);	/* Used by locore */
+//paddr_t cpu_reset_address_paddr;	/* Used by locore */
 
 struct vm_map *phys_map = NULL;
 
@@ -251,11 +256,10 @@ cpu_startup(void)
 	format_bytes(pbuf, sizeof(pbuf), ptoa(uvmexp.free));
 	printf("avail memory = %s\n", pbuf);
 
-	struct pcb * pcb = lwp_getpcb(&lwp0);
-	pcb->pcb_flags = 0;
-	pcb->pcb_un.un_32.pcb32_sp =
-	    uvm_lwp_getuarea(&lwp0) + USPACE_SVC_STACK_TOP;
-	pcb->pcb_tf = (struct trapframe *)pcb->pcb_un.un_32.pcb32_sp - 1;
+	struct lwp * const l = &lwp0;
+	struct pcb * const pcb = lwp_getpcb(l);
+	pcb->pcb_sp = uvm_lwp_getuarea(l) + USPACE_SVC_STACK_TOP;
+	lwp_settrapframe(l, (struct trapframe *)pcb->pcb_sp - 1);
 }
 
 /*

Index: src/sys/arch/arm/arm32/cpuswitch.S
diff -u src/sys/arch/arm/arm32/cpuswitch.S:1.65 src/sys/arch/arm/arm32/cpuswitch.S:1.66
--- src/sys/arch/arm/arm32/cpuswitch.S:1.65	Tue Aug 14 20:42:33 2012
+++ src/sys/arch/arm/arm32/cpuswitch.S	Thu Aug 16 17:35:01 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpuswitch.S,v 1.65 2012/08/14 20:42:33 matt Exp $	*/
+/*	$NetBSD: cpuswitch.S,v 1.66 2012/08/16 17:35:01 matt Exp $	*/
 
 /*
  * Copyright 2003 Wasabi Systems, Inc.
@@ -89,7 +89,7 @@
 #include <machine/asm.h>
 #include <machine/cpu.h>
 
-	RCSID("$NetBSD: cpuswitch.S,v 1.65 2012/08/14 20:42:33 matt Exp $")
+	RCSID("$NetBSD: cpuswitch.S,v 1.66 2012/08/16 17:35:01 matt Exp $")
 
 /* LINTSTUB: include <sys/param.h> */
 	
@@ -295,7 +295,7 @@ ENTRY(cpu_switchto)
 	 */
 
 	ldr	r2, [r5, #(P_RASLIST)]
-	ldr	r1, [r7, #(PCB_TF)]	/* r1 = trapframe (used below) */
+	ldr	r1, [r6, #(L_MD_TF)]	/* r1 = trapframe (used below) */
 	teq	r2, #0			/* p->p_nras == 0? */
 	bne	.Lswitch_do_ras		/* no, check for one */
 
@@ -316,7 +316,7 @@ ENTRY(cpu_switchto)
 	mov	r0, r5			/* first ras_lookup() arg */
 	bl	_C_LABEL(ras_lookup)
 	cmn	r0, #1			/* -1 means "not in a RAS" */
-	ldrne	r1, [r7, #(PCB_TF)]
+	ldrne	r1, [r6, #(L_MD_TF)]
 	strne	r0, [r1, #(TF_PC)]
 	b	.Lswitch_return
 
@@ -403,7 +403,7 @@ ENTRY_NP(softint_switch)
 	 * it's existing state doesn't matter.  We start the stack just
 	 * below the trapframe.
 	 */
-	ldr	sp, [r2, #(PCB_TF)]	/* get new lwp's stack ptr */
+	ldr	sp, [r5, #(L_MD_TF)]	/* get new lwp's stack ptr */
 
 	/* At this point we can allow IRQ's again. */
 #ifndef __HAVE_UNNESTED_INTRS

Index: src/sys/arch/arm/arm32/fault.c
diff -u src/sys/arch/arm/arm32/fault.c:1.82 src/sys/arch/arm/arm32/fault.c:1.83
--- src/sys/arch/arm/arm32/fault.c:1.82	Tue Aug 14 20:42:33 2012
+++ src/sys/arch/arm/arm32/fault.c	Thu Aug 16 17:35:01 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: fault.c,v 1.82 2012/08/14 20:42:33 matt Exp $	*/
+/*	$NetBSD: fault.c,v 1.83 2012/08/16 17:35:01 matt 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.82 2012/08/14 20:42:33 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fault.c,v 1.83 2012/08/16 17:35:01 matt Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -98,9 +98,10 @@ __KERNEL_RCSID(0, "$NetBSD: fault.c,v 1.
 
 #include <arm/cpuconf.h>
 
-#include <machine/frame.h>
 #include <arm/arm32/katelib.h>
+
 #include <machine/intr.h>
+#include <machine/pcb.h>
 #if defined(DDB) || defined(KGDB)
 #include <machine/db_machdep.h>
 #ifdef KGDB
@@ -154,9 +155,6 @@ static const struct data_abort data_abor
 	{NULL,		"Permission Fault (P)"}
 };
 
-/* Determine if a fault came from user mode */
-#define	TRAP_USERMODE(tf)	((tf->tf_spsr & PSR_MODE) == PSR_USR32_MODE)
-
 /* Determine if 'x' is a permission fault */
 #define	IS_PERMISSION_FAULT(x)					\
 	(((1 << ((x) & FAULT_TYPE_MASK)) &			\
@@ -220,9 +218,9 @@ void
 data_abort_handler(trapframe_t *tf)
 {
 	struct vm_map *map;
-	struct pcb *pcb;
-	struct lwp *l;
-	u_int user, far, fsr;
+	struct lwp * const l = curlwp;
+	struct cpu_info * const ci = curcpu();
+	u_int far, fsr;
 	vm_prot_t ftype;
 	void *onfault;
 	vaddr_t va;
@@ -237,7 +235,7 @@ data_abort_handler(trapframe_t *tf)
 
 	UVMHIST_CALLED(maphist);
 	/* Update vmmeter statistics */
-	curcpu()->ci_data.cpu_ntrap++;
+	ci->ci_data.cpu_ntrap++;
 
 	/* Re-enable interrupts if they were enabled previously */
 	KASSERT(!TRAP_USERMODE(tf) || (tf->tf_spsr & IF32_bits) == 0);
@@ -245,18 +243,17 @@ data_abort_handler(trapframe_t *tf)
 		restore_interrupts(tf->tf_spsr & IF32_bits);
 
 	/* Get the current lwp structure */
-	KASSERT(curlwp != NULL);
-	l = curlwp;
 
 	UVMHIST_LOG(maphist, " (pc=0x%x, l=0x%x, far=0x%x, fsr=0x%x)",
 	    tf->tf_pc, l, far, fsr);
 
 	/* Data abort came from user mode? */
-	if ((user = TRAP_USERMODE(tf)) != 0)
+	bool user = (TRAP_USERMODE(tf) != 0);
+	if (user)
 		LWP_CACHE_CREDS(l, l->l_proc);
 
 	/* Grab the current pcb */
-	pcb = lwp_getpcb(l);
+	struct pcb * const pcb = lwp_getpcb(l);
 
 	/* Invoke the appropriate handler, if necessary */
 	if (__predict_false(data_aborts[fsr & FAULT_TYPE_MASK].func != NULL)) {
@@ -287,12 +284,12 @@ data_abort_handler(trapframe_t *tf)
 	/* fusubailout is used by [fs]uswintr to avoid page faulting */
 	if (__predict_false(pcb->pcb_onfault == fusubailout)) {
 		tf->tf_r0 = EFAULT;
-		tf->tf_pc = (register_t)(intptr_t) pcb->pcb_onfault;
+		tf->tf_pc = (intptr_t) pcb->pcb_onfault;
 		return;
 	}
 
 	if (user) {
-		pcb->pcb_tf = tf;
+		lwp_settrapframe(l, tf);
 	}
 
 	/*
@@ -359,7 +356,7 @@ data_abort_handler(trapframe_t *tf)
 	 *	2. pcb_onfault not set or
 	 *	3. pcb_onfault set and not LDRT/LDRBT/STRT/STRBT instruction.
 	 */
-	if (user == 0 && (va >= VM_MIN_KERNEL_ADDRESS ||
+	if (!user && (va >= VM_MIN_KERNEL_ADDRESS ||
 	    (va < VM_MIN_ADDRESS && vector_page == ARM_VECTORS_LOW)) &&
 	    __predict_true((pcb->pcb_onfault == NULL ||
 	     (ReadWord(tf->tf_pc) & 0x05200000) != 0x04200000))) {
@@ -379,7 +376,7 @@ data_abort_handler(trapframe_t *tf)
 			 * userland that actually runs in a priveledged mode
 			 * but uses USR mode permissions for its accesses.
 			 */
-			user = 1;
+			user = true;
 			goto do_trapsignal;
 		}
 	} else {
@@ -524,9 +521,7 @@ out:
 static int
 dab_fatal(trapframe_t *tf, u_int fsr, u_int far, struct lwp *l, ksiginfo_t *ksi)
 {
-	const char *mode;
-
-	mode = TRAP_USERMODE(tf) ? "user" : "kernel";
+	const char * const mode = TRAP_USERMODE(tf) ? "user" : "kernel";
 
 	if (l != NULL) {
 		printf("Fatal %s mode data abort: '%s'\n", mode,
@@ -578,14 +573,12 @@ dab_fatal(trapframe_t *tf, u_int fsr, u_
 static int
 dab_align(trapframe_t *tf, u_int fsr, u_int far, struct lwp *l, ksiginfo_t *ksi)
 {
-	struct pcb *pcb = lwp_getpcb(l);
-
 	/* Alignment faults are always fatal if they occur in kernel mode */
 	if (!TRAP_USERMODE(tf))
 		dab_fatal(tf, fsr, far, l, NULL);
 
 	/* pcb_onfault *must* be NULL at this point */
-	KDASSERT(pcb->pcb_onfault == NULL);
+	KDASSERT(((struct pcb *)lwp_getpcb(l))->pcb_onfault == NULL);
 
 	/* See if the CPU state needs to be fixed up */
 	(void) data_abort_fixup(tf, fsr, far, l);
@@ -597,7 +590,7 @@ dab_align(trapframe_t *tf, u_int fsr, u_
 	ksi->ksi_addr = (u_int32_t *)(intptr_t)far;
 	ksi->ksi_trap = fsr;
 
-	pcb->pcb_tf = tf;
+	lwp_settrapframe(l, tf);
 
 	return (1);
 }
@@ -647,7 +640,7 @@ dab_buserr(trapframe_t *tf, u_int fsr, u
 		 * If the current trapframe is at the top of the kernel stack,
 		 * the fault _must_ have come from user mode.
 		 */
-		if (tf != ((trapframe_t *)pcb->pcb_un.un_32.pcb32_sp) - 1) {
+		if (tf != ((trapframe_t *)pcb->pcb_sp) - 1) {
 			/*
 			 * Kernel mode. We're either about to die a
 			 * spectacular death, or pcb_onfault will come
@@ -704,7 +697,7 @@ dab_buserr(trapframe_t *tf, u_int fsr, u
 	ksi->ksi_addr = (u_int32_t *)(intptr_t)far;
 	ksi->ksi_trap = fsr;
 
-	pcb->pcb_tf = tf;
+	lwp_settrapframe(l, tf);
 
 	return (1);
 }
@@ -801,7 +794,7 @@ prefetch_abort_handler(trapframe_t *tf)
 		ksi.ksi_signo = SIGILL;
 		ksi.ksi_code = ILL_ILLOPC;
 		ksi.ksi_addr = (u_int32_t *)(intptr_t) tf->tf_pc;
-		pcb->pcb_tf = tf;
+		lwp_settrapframe(l, tf);
 		goto do_trapsignal;
 	default:
 		break;
@@ -813,7 +806,7 @@ prefetch_abort_handler(trapframe_t *tf)
 
 	/* Get fault address */
 	fault_pc = tf->tf_pc;
-	pcb->pcb_tf = tf;
+	lwp_settrapframe(l, tf);
 	UVMHIST_LOG(maphist, " (pc=0x%x, l=0x%x, tf=0x%x)", fault_pc, l, tf,
 	    0);
 

Index: src/sys/arch/arm/arm32/genassym.cf
diff -u src/sys/arch/arm/arm32/genassym.cf:1.48 src/sys/arch/arm/arm32/genassym.cf:1.49
--- src/sys/arch/arm/arm32/genassym.cf:1.48	Tue Aug 14 20:42:33 2012
+++ src/sys/arch/arm/arm32/genassym.cf	Thu Aug 16 17:35:01 2012
@@ -1,4 +1,4 @@
-#	$NetBSD: genassym.cf,v 1.48 2012/08/14 20:42:33 matt Exp $
+#	$NetBSD: genassym.cf,v 1.49 2012/08/16 17:35:01 matt Exp $
 
 # Copyright (c) 1982, 1990 The Regents of the University of California.
 # All rights reserved.
@@ -50,6 +50,7 @@ include <arm/fiq.h>
 include <arm/arm32/pte.h>
 include <machine/pmap.h>
 include <machine/frame.h>
+include <machine/pcb.h>
 include <machine/vmparam.h>
 
 include "opt_multiprocessor.h"
@@ -109,10 +110,12 @@ define	L_STAT			offsetof(struct lwp, l_s
 define	L_PROC			offsetof(struct lwp, l_proc)
 define	L_CTXSWTCH		offsetof(struct lwp, l_ctxswtch)
 define	L_PRIVATE		offsetof(struct lwp, l_private)
+define	L_MD_FLAGS		offsetof(struct lwp, l_md.md_flags)
+define	L_MD_TF			offsetof(struct lwp, l_md.md_tf)
+define	MDLWP_NOALIGNFLT	MDLWP_NOALIGNFLT
+
 define	P_RASLIST		offsetof(struct proc, p_raslist)
 
-define	PCB_TF			offsetof(struct pcb, pcb_tf)
-define	PCB_FLAGS		offsetof(struct pcb, pcb_flags)
 define	PCB_R8			offsetof(struct pcb, pcb_un.un_32.pcb32_r8)
 define	PCB_R9			offsetof(struct pcb, pcb_un.un_32.pcb32_r9)
 define	PCB_R10			offsetof(struct pcb, pcb_un.un_32.pcb32_r10)
@@ -123,7 +126,6 @@ define	PCB_LR			offsetof(struct pcb, pcb
 define	PCB_PC			offsetof(struct pcb, pcb_un.un_32.pcb32_pc)
 define	PCB_USER_PID_RW		offsetof(struct pcb, pcb_un.un_32.pcb32_user_pid_rw)
 define	PCB_ONFAULT		offsetof(struct pcb, pcb_onfault)
-define	PCB_NOALIGNFLT		PCB_NOALIGNFLT
 
 define	PCB_SIZE		sizeof(struct pcb)
 

Index: src/sys/arch/arm/arm32/vm_machdep.c
diff -u src/sys/arch/arm/arm32/vm_machdep.c:1.58 src/sys/arch/arm/arm32/vm_machdep.c:1.59
--- src/sys/arch/arm/arm32/vm_machdep.c:1.58	Sun Aug 12 05:05:47 2012
+++ src/sys/arch/arm/arm32/vm_machdep.c	Thu Aug 16 17:35:01 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: vm_machdep.c,v 1.58 2012/08/12 05:05:47 matt Exp $	*/
+/*	$NetBSD: vm_machdep.c,v 1.59 2012/08/16 17:35:01 matt Exp $	*/
 
 /*
  * Copyright (c) 1994-1998 Mark Brinicombe.
@@ -44,7 +44,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.58 2012/08/12 05:05:47 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.59 2012/08/16 17:35:01 matt Exp $");
 
 #include "opt_armfpe.h"
 #include "opt_pmap_debug.h"
@@ -56,6 +56,7 @@ __KERNEL_RCSID(0, "$NetBSD: vm_machdep.c
 #include <sys/proc.h>
 #include <sys/malloc.h>
 #include <sys/vnode.h>
+#include <sys/cpu.h>
 #include <sys/buf.h>
 #include <sys/pmc.h>
 #include <sys/exec.h>
@@ -63,7 +64,7 @@ __KERNEL_RCSID(0, "$NetBSD: vm_machdep.c
 
 #include <uvm/uvm_extern.h>
 
-#include <machine/cpu.h>
+#include <machine/pcb.h>
 #include <machine/pmap.h>
 #include <machine/reg.h>
 #include <machine/vmparam.h>
@@ -118,7 +119,6 @@ cpu_lwp_fork(struct lwp *l1, struct lwp 
     void (*func)(void *), void *arg)
 {
 	struct pcb *pcb1, *pcb2;
-	struct trapframe *tf;
 	struct switchframe *sf;
 	vaddr_t uv;
 
@@ -147,7 +147,7 @@ cpu_lwp_fork(struct lwp *l1, struct lwp 
 	 * Note: this stack is not in use if we are forking from p1
 	 */
 	uv = uvm_lwp_getuarea(l2);
-	pcb2->pcb_un.un_32.pcb32_sp = uv + USPACE_SVC_STACK_TOP;
+	pcb2->pcb_sp = uv + USPACE_SVC_STACK_TOP;
 
 #ifdef STACKCHECKS
 	/* Fill the kernel stack with a known pattern */
@@ -170,9 +170,9 @@ cpu_lwp_fork(struct lwp *l1, struct lwp 
 	arm_fpe_copycontext(FP_CONTEXT(l1), FP_CONTEXT(l2));
 #endif	/* ARMFPE */
 
-	tf = (struct trapframe *)pcb2->pcb_un.un_32.pcb32_sp - 1;
-	pcb2->pcb_tf = tf;
-	*tf = *pcb1->pcb_tf;
+	struct trapframe *tf = (struct trapframe *)pcb2->pcb_sp - 1;
+	lwp_settrapframe(l2, tf);
+	*tf = *lwp_trapframe(l1);
 
 	/*
 	 * If specified, give the child a different stack (make sure
@@ -186,7 +186,7 @@ cpu_lwp_fork(struct lwp *l1, struct lwp 
 	sf->sf_r5 = (u_int)arg;
 	sf->sf_sp = (u_int)tf;
 	sf->sf_pc = (u_int)lwp_trampoline;
-	pcb2->pcb_un.un_32.pcb32_sp = (u_int)sf;
+	pcb2->pcb_sp = (u_int)sf;
 }
 
 /*

Index: src/sys/arch/arm/include/cpu.h
diff -u src/sys/arch/arm/include/cpu.h:1.67 src/sys/arch/arm/include/cpu.h:1.68
--- src/sys/arch/arm/include/cpu.h:1.67	Tue Aug 14 20:42:33 2012
+++ src/sys/arch/arm/include/cpu.h	Thu Aug 16 17:35:01 2012
@@ -77,7 +77,6 @@
 
 #ifndef _LOCORE
 #include <machine/frame.h>
-#include <machine/pcb.h>
 #endif	/* !_LOCORE */
 
 #include <arm/armreg.h>
@@ -175,9 +174,9 @@ extern int cpu_do_powersave;
  * LWP_PC: Find out the program counter for the given lwp.
  */
 #ifdef __PROG32
-#define LWP_PC(l)	(((struct pcb *)lwp_getpcb(l))->pcb_tf->tf_pc)
+#define LWP_PC(l)		(lwp_trapframe(l)->tf_pc)
 #else
-#define LWP_PC(l)	(((struct pcb *)lwp_getpcb(l))->pcb_tf->tf_r15 & R15_PC)
+#define LWP_PC(l)		(lwp_trapframe(l)->tf_r15 & R15_PC)
 #endif
 
 /*

Index: src/sys/arch/arm/include/frame.h
diff -u src/sys/arch/arm/include/frame.h:1.16 src/sys/arch/arm/include/frame.h:1.17
--- src/sys/arch/arm/include/frame.h:1.16	Thu Aug 16 16:41:54 2012
+++ src/sys/arch/arm/include/frame.h	Thu Aug 16 17:35:01 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: frame.h,v 1.16 2012/08/16 16:41:54 matt Exp $	*/
+/*	$NetBSD: frame.h,v 1.17 2012/08/16 17:35:01 matt Exp $	*/
 
 /*
  * Copyright (c) 1994-1997 Mark Brinicombe.
@@ -79,6 +79,12 @@ typedef struct trapframe {
 #define tf_r14 tf_usr_lr
 #define tf_r15 tf_pc
 
+#ifdef __PROG32
+#define TRAP_USERMODE(tf)	(((tf)->tf_spsr & PSR_MODE) == PSR_USR32_MODE)
+#elif defined(__PROG26)
+#define TRAP_USERMODE(tf)	(((tf)->tf_r15 & R15_MODE) == R15_MODE_USR)
+#endif
+
 /*
  * Signal frame.  Pushed onto user stack before calling sigcode.
  */
@@ -99,7 +105,8 @@ __BEGIN_DECLS
 void sendsig_sigcontext(const ksiginfo_t *, const sigset_t *);
 void *getframe(struct lwp *, int, int *);
 __END_DECLS
-#define lwp_trapframe(l) (((struct pcb *)lwp_getpcb(l))->pcb_tf)
+#define lwp_trapframe(l)		((l)->l_md.md_tf)
+#define lwp_settrapframe(l, tf)		((l)->l_md.md_tf = (tf))
 #endif
 
 #endif /* _LOCORE */

Index: src/sys/arch/arm/include/pcb.h
diff -u src/sys/arch/arm/include/pcb.h:1.23 src/sys/arch/arm/include/pcb.h:1.24
--- src/sys/arch/arm/include/pcb.h:1.23	Tue Aug 14 20:42:33 2012
+++ src/sys/arch/arm/include/pcb.h	Thu Aug 16 17:35:01 2012
@@ -42,8 +42,6 @@
 #include <arm/arm32/pte.h>
 #include <arm/reg.h>
 
-struct trapframe;
-
 struct pcb_arm32 {
 	/*
 	 * WARNING!
@@ -72,26 +70,28 @@ struct pcb_arm32 {
 #define	pcb_dacr	pcb_un.un_32.pcb32_dacr
 #define	pcb_cstate	pcb_un.un_32.pcb32_cstate
 #define	pcb_user_pid_rw	pcb_un.un_32.pcb32_user_pid_rw
+#ifdef __PROG32
+#define	pcb_sp		pcb_un.un_32.pcb32_sp
+#endif
 
 struct pcb_arm26 {
 	struct	switchframe *pcb26_sf;
 };
 #define	pcb_sf	pcb_un.un_26.pcb26_sf
+#ifdef __PROG26
+#define	pcb_sp		pcb_sf.sf_r13
+#endif
 
 /*
  * WARNING!
  * See warning for struct pcb_arm32, above, before changing struct pcb!
  */
 struct pcb {
-	u_int	pcb_flags;
-#define	PCB_OWNFPU	0x00000001
-#define	PCB_NOALIGNFLT	0x00000002		/* For EXEC_AOUT */
-	struct	trapframe *pcb_tf;
-	void *	pcb_onfault;			/* On fault handler */
 	union	{
 		struct	pcb_arm32 un_32;
 		struct	pcb_arm26 un_26;
 	} pcb_un;
+	void *	pcb_onfault;			/* On fault handler */
 	struct	fpe_sp_state pcb_fpstate;	/* FPA Floating Point state */
 	struct	vfpreg pcb_vfp;			/* VFP registers */
 };

Index: src/sys/arch/arm/include/proc.h
diff -u src/sys/arch/arm/include/proc.h:1.11 src/sys/arch/arm/include/proc.h:1.12
--- src/sys/arch/arm/include/proc.h:1.11	Sun Aug 12 05:05:47 2012
+++ src/sys/arch/arm/include/proc.h	Thu Aug 16 17:35:01 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: proc.h,v 1.11 2012/08/12 05:05:47 matt Exp $	*/
+/*	$NetBSD: proc.h,v 1.12 2012/08/16 17:35:01 matt Exp $	*/
 
 /*
  * Copyright (c) 1994 Mark Brinicombe.
@@ -43,11 +43,13 @@ struct trapframe;
 struct lwp;
 
 struct mdlwp {
+	struct trapframe *md_tf;
 	int	md_flags;
 };
 
 /* Flags setttings for md_flags */
-#define MDLWP_VFPUSED	0x00000001	/* Process used the VFP */
+#define MDLWP_VFPUSED		0x00000001	/* Process used the VFP */
+#define MDLWP_NOALIGNFLT	0x00000002	/* For EXEC_AOUT */
 
 
 struct mdproc {

Index: src/sys/arch/arm/include/arm32/frame.h
diff -u src/sys/arch/arm/include/arm32/frame.h:1.30 src/sys/arch/arm/include/arm32/frame.h:1.31
--- src/sys/arch/arm/include/arm32/frame.h:1.30	Thu Aug  2 15:56:07 2012
+++ src/sys/arch/arm/include/arm32/frame.h	Thu Aug 16 17:35:01 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: frame.h,v 1.30 2012/08/02 15:56:07 skrll Exp $	*/
+/*	$NetBSD: frame.h,v 1.31 2012/08/16 17:35:01 matt Exp $	*/
 
 /*
  * Copyright (c) 1994-1997 Mark Brinicombe.
@@ -143,9 +143,9 @@ void validate_trapframe(trapframe_t *, i
 	teq	r0, #(PSR_USR32_MODE)					;\
 	GET_CURCPU(r4)			/* r4 = cpuinfo */		;\
 	bne	1f			/* Not USR mode skip AFLT */	;\
-	ldr	r1, [r4, #CI_CURPCB]	/* get curpcb from cpu_info */	;\
-	ldr	r1, [r1, #PCB_FLAGS]	/* Fetch curpcb->pcb_flags */	;\
-	tst	r1, #PCB_NOALIGNFLT					;\
+	ldr	r1, [r1, #CI_CURLWP]	/* get curlwp from cpu_info */	;\
+	ldr	r1, [r1, #L_MD_FLAGS]	/* Fetch l_md.md_flags */	;\
+	tst	r1, #MDLWP_NOALIGNFLT					;\
 	beq	1f			/* AFLTs already enabled */	;\
 	ldr	r2, .Laflt_cpufuncs					;\
 	ldr	r1, [r4, #CI_CTRL]	/* Fetch control register */	;\
@@ -172,9 +172,9 @@ void validate_trapframe(trapframe_t *, i
 1:	ldr	r1, [r4, #CI_ASTPENDING] /* Pending AST? */		;\
 	teq	r1, #0x00000000						;\
 	bne	2f			/* Yup. Go deal with it */	;\
-	ldr	r1, [r4, #CI_CURPCB]	/* Get current PCB */		;\
-	ldr	r0, [r1, #PCB_FLAGS]	/* Fetch curpcb->pcb_flags */	;\
-	tst	r0, #PCB_NOALIGNFLT					;\
+	ldr	r1, [r4, #CI_CURLWP]	/* get curlwp from cpu_info */	;\
+	ldr	r0, [r1, #L_MD_FLAGS]	/* get md_flags from lwp */	;\
+	tst	r0, #MDLWP_NOALIGNFLT					;\
 	beq	3f			/* Keep AFLTs enabled */	;\
 	ldr	r1, [r4, #CI_CTRL]	/* Fetch control register */	;\
 	ldr	r2, .Laflt_cpufuncs					;\
@@ -224,6 +224,7 @@ void validate_trapframe(trapframe_t *, i
 2:
 #endif /* EXEC_AOUT */
 
+#ifndef _ARM_ARCH_6
 #ifdef ARM_LOCK_CAS_DEBUG
 #define	LOCK_CAS_DEBUG_LOCALS						 \
 .L_lock_cas_restart:							;\
@@ -273,6 +274,11 @@ LOCK_CAS_DEBUG_LOCALS
 	LOCK_CAS_DEBUG_COUNT_RESTART					;\
 99:
 
+#else
+#define	LOCK_CAS_CHECK			/* nothing */
+#define	LOCK_CAS_CHECK_LOCALS		/* nothing */
+#endif
+
 /*
  * ASM macros for pushing and pulling trapframes from the stack
  *

Reply via email to