diff options
| author | matt <matt@NetBSD.org> | 2003-08-27 20:20:07 +0000 |
|---|---|---|
| committer | matt <matt@NetBSD.org> | 2003-08-27 20:20:07 +0000 |
| commit | 31cc6ab700b7d2fa8b97ff9f7d8a485a84ab486e (patch) | |
| tree | 725931e8c30825bc6765d1ee0473cbc67d0529ab /sys/arch | |
| parent | 922a27ed299f048de97516dabe4d133035ccfe89 (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.cf | 4 | ||||
| -rw-r--r-- | sys/arch/powerpc/include/frame.h | 28 | ||||
| -rw-r--r-- | sys/arch/powerpc/oea/genassym.cf | 4 | ||||
| -rw-r--r-- | sys/arch/powerpc/powerpc/locore_subr.S | 4 | ||||
| -rw-r--r-- | sys/arch/powerpc/powerpc/vm_machdep.c | 12 |
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 |
