summaryrefslogtreecommitdiff
path: root/sys/arch
diff options
context:
space:
mode:
authormatt <matt@NetBSD.org>2003-08-27 20:20:07 +0000
committermatt <matt@NetBSD.org>2003-08-27 20:20:07 +0000
commit31cc6ab700b7d2fa8b97ff9f7d8a485a84ab486e (patch)
tree725931e8c30825bc6765d1ee0473cbc67d0529ab /sys/arch
parent922a27ed299f048de97516dabe4d133035ccfe89 (diff)
Move SFRAMELEN to frame.h and use it in vm_machdep.c. In setfunc, setup
callframe linkages correctly. Restore use of ldptr to locore_subr.S [pthreads and gdb no longer crash/hang the system]
Diffstat (limited to 'sys/arch')
-rw-r--r--sys/arch/powerpc/ibm4xx/genassym.cf4
-rw-r--r--sys/arch/powerpc/include/frame.h28
-rw-r--r--sys/arch/powerpc/oea/genassym.cf4
-rw-r--r--sys/arch/powerpc/powerpc/locore_subr.S4
-rw-r--r--sys/arch/powerpc/powerpc/vm_machdep.c12
5 files changed, 17 insertions, 35 deletions
diff --git a/sys/arch/powerpc/ibm4xx/genassym.cf b/sys/arch/powerpc/ibm4xx/genassym.cf
index 983a43ead5a..c3cabbea7b8 100644
--- a/sys/arch/powerpc/ibm4xx/genassym.cf
+++ b/sys/arch/powerpc/ibm4xx/genassym.cf
@@ -1,4 +1,4 @@
-# $NetBSD: genassym.cf,v 1.7 2003/08/12 18:34:47 matt Exp $
+# $NetBSD: genassym.cf,v 1.8 2003/08/27 20:20:07 matt Exp $
#
# Copyright (C) 1995, 1996 Wolfgang Solfrank.
@@ -113,7 +113,7 @@ define CFRAME_LR offsetof(struct callframe, lr)
define CFRAME_R30 offsetof(struct callframe, r30)
define CFRAME_R31 offsetof(struct callframe, r31)
-define SFRAMELEN roundup(sizeof(struct switchframe), CALLFRAMELEN)
+define SFRAMELEN SFRAMELEN
define SFRAME_SP offsetof(struct switchframe, sp)
define SFRAME_LR offsetof(struct switchframe, lr)
define SFRAME_USER_SR offsetof(struct switchframe, user_sr)
diff --git a/sys/arch/powerpc/include/frame.h b/sys/arch/powerpc/include/frame.h
index 205fe9e587b..54f2e52c87e 100644
--- a/sys/arch/powerpc/include/frame.h
+++ b/sys/arch/powerpc/include/frame.h
@@ -1,4 +1,4 @@
-/* $NetBSD: frame.h,v 1.16 2003/08/12 18:34:48 matt Exp $ */
+/* $NetBSD: frame.h,v 1.17 2003/08/27 20:20:08 matt Exp $ */
/*
* Copyright (C) 1995, 1996 Wolfgang Solfrank.
@@ -99,14 +99,15 @@ struct utrapframe32 {
/*
* This is to ensure alignment of the stackpointer
*/
-#define FRAMELEN roundup(sizeof(struct trapframe) + 8, CALLFRAMELEN)
-#define trapframe(l) ((struct trapframe *)((char *)(l)->l_addr + USPACE - FRAMELEN + 8))
+#define FRAMELEN roundup(sizeof(struct trapframe) + 2*sizeof(register_t), CALLFRAMELEN)
+#define trapframe(l) ((struct trapframe *)((char *)(l)->l_addr + USPACE - FRAMELEN + 2*sizeof(register_t)))
+#define SFRAMELEN roundup(sizeof(struct switchframe), CALLFRAMELEN)
struct switchframe {
register_t sp;
register_t lr;
- register_t user_sr; /* VSID on IBM4XX */
- register_t cr;
+ register_t user_sr; /* VSID on IBM4XX */
+ register_t cr; /* why? CR is volatile. */
register_t fixreg2;
register_t fixreg[19]; /* R13-R31 */
};
@@ -164,21 +165,4 @@ struct intrframe {
register_t r0; /* 84 */
};
-#define SPFRAMELEN sizeof(struct spillframe)
-struct spillframe {
- register_t r1; /* 0 */
- register_t _pad4; /* 4 */
- register_t r12; /* 8 */
- register_t r11; /* 12 */
- register_t r10; /* 16 */
- register_t r9; /* 20 */
- register_t r8; /* 24 */
- register_t r7; /* 28 */
- register_t r6; /* 32 */
- register_t r5; /* 36 */
- register_t r4; /* 40 */
- register_t r3; /* 44 */
- register_t r0; /* 48 */
-};
-
#endif /* _POWERPC_FRAME_H_ */
diff --git a/sys/arch/powerpc/oea/genassym.cf b/sys/arch/powerpc/oea/genassym.cf
index 0bab93d87b1..b7871e8756a 100644
--- a/sys/arch/powerpc/oea/genassym.cf
+++ b/sys/arch/powerpc/oea/genassym.cf
@@ -1,4 +1,4 @@
-# $NetBSD: genassym.cf,v 1.5 2003/08/12 18:34:49 matt Exp $
+# $NetBSD: genassym.cf,v 1.6 2003/08/27 20:20:07 matt Exp $
#
# Copyright (C) 1995, 1996 Wolfgang Solfrank.
@@ -126,7 +126,7 @@ define CFRAME_LR offsetof(struct callframe, lr)
define CFRAME_R30 offsetof(struct callframe, r30)
define CFRAME_R31 offsetof(struct callframe, r31)
-define SFRAMELEN roundup(sizeof(struct switchframe), CALLFRAMELEN)
+define SFRAMELEN SFRAMELEN
define SFRAME_SP offsetof(struct switchframe, sp)
define SFRAME_LR offsetof(struct switchframe, lr)
define SFRAME_USER_SR offsetof(struct switchframe, user_sr)
diff --git a/sys/arch/powerpc/powerpc/locore_subr.S b/sys/arch/powerpc/powerpc/locore_subr.S
index 37f92bdc1a4..e2d14d611ee 100644
--- a/sys/arch/powerpc/powerpc/locore_subr.S
+++ b/sys/arch/powerpc/powerpc/locore_subr.S
@@ -1,4 +1,4 @@
-/* $NetBSD: locore_subr.S,v 1.19 2003/08/27 19:45:28 matt Exp $ */
+/* $NetBSD: locore_subr.S,v 1.20 2003/08/27 20:20:08 matt Exp $ */
/*
* Copyright (c) 2001 Wasabi Systems, Inc.
@@ -443,7 +443,7 @@ switch_return:
*/
ldreg %r31,CFRAME_R31(%r1) /* restore saved registers */
ldreg %r30,CFRAME_R30(%r1)
-#if 1
+#if 0
addi %r1,%r1,CALLFRAMELEN
#else
ldreg %r1,CFRAME_SP(%r1) /* pop stack frmae */
diff --git a/sys/arch/powerpc/powerpc/vm_machdep.c b/sys/arch/powerpc/powerpc/vm_machdep.c
index 8ce74bbe680..63e136f2ad8 100644
--- a/sys/arch/powerpc/powerpc/vm_machdep.c
+++ b/sys/arch/powerpc/powerpc/vm_machdep.c
@@ -1,4 +1,4 @@
-/* $NetBSD: vm_machdep.c,v 1.55 2003/08/12 18:34:50 matt Exp $ */
+/* $NetBSD: vm_machdep.c,v 1.56 2003/08/27 20:20:08 matt Exp $ */
/*
* Copyright (C) 1995, 1996 Wolfgang Solfrank.
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.55 2003/08/12 18:34:50 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.56 2003/08/27 20:20:08 matt Exp $");
#include "opt_altivec.h"
#include "opt_multiprocessor.h"
@@ -155,7 +155,7 @@ cpu_lwp_fork(l1, l2, stack, stacksize, func, arg)
/*
* Below that, we allocate the switch frame:
*/
- stktop2 -= roundup(sizeof *sf, CALLFRAMELEN); /* must match SFRAMELEN in genassym */
+ stktop2 -= SFRAMELEN; /* must match SFRAMELEN in genassym */
sf = (struct switchframe *)stktop2;
memset((void *)sf, 0, sizeof *sf); /* just in case */
sf->sp = (register_t)cf;
@@ -178,17 +178,15 @@ cpu_setfunc(l, func, arg)
struct trapframe *tf;
struct callframe *cf;
struct switchframe *sf;
- caddr_t vaddr;
tf = trapframe(l);
cf = (struct callframe *) ((uintptr_t)tf & ~(CALLFRAMELEN-1));
cf->lr = (register_t) fork_trampoline;
cf--;
+ cf->sp = (register_t) (cf+1);
cf->r31 = (register_t) func;
cf->r30 = (register_t) arg;
- vaddr = (unsigned char *) cf;
- vaddr -= roundup(sizeof *sf, CALLFRAMELEN);
- sf = (struct switchframe *) vaddr;
+ sf = (struct switchframe *) ((uintptr_t) cf - SFRAMELEN);
memset((void *)sf, 0, sizeof *sf); /* just in case */
sf->sp = (register_t) cf;
#ifdef PPC_OEA