From owner-p4-projects@FreeBSD.ORG Sat Nov 6 04:59:12 2004 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 3DD7716A4D0; Sat, 6 Nov 2004 04:59:12 +0000 (GMT) Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id F19F716A4CE for ; Sat, 6 Nov 2004 04:59:11 +0000 (GMT) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id AF32C43D46 for ; Sat, 6 Nov 2004 04:59:11 +0000 (GMT) (envelope-from peter@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.12.11/8.12.11) with ESMTP id iA64xBvY065580 for ; Sat, 6 Nov 2004 04:59:11 GMT (envelope-from peter@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.12.11/8.12.11/Submit) id iA64xBCC065577 for perforce@freebsd.org; Sat, 6 Nov 2004 04:59:11 GMT (envelope-from peter@freebsd.org) Date: Sat, 6 Nov 2004 04:59:11 GMT Message-Id: <200411060459.iA64xBCC065577@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to peter@freebsd.org using -f From: Peter Wemm To: Perforce Change Reviews Subject: PERFORCE change 64402 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 06 Nov 2004 04:59:12 -0000 http://perforce.freebsd.org/chv.cgi?CH=64402 Change 64402 by peter@peter_daintree on 2004/11/06 04:59:09 IFC @64401 Affected files ... .. //depot/projects/hammer/Makefile#27 integrate .. //depot/projects/hammer/Makefile.inc1#74 integrate .. //depot/projects/hammer/lib/libc/arm/Makefile.inc#1 branch .. //depot/projects/hammer/lib/libc/arm/gen/_ctx_start.S#2 integrate .. //depot/projects/hammer/lib/libc/arm/gen/_setjmp.S#2 integrate .. //depot/projects/hammer/lib/libc/arm/gen/makecontext.c#2 integrate .. //depot/projects/hammer/lib/libc/arm/gen/setjmp.S#3 integrate .. //depot/projects/hammer/lib/libc/arm/gen/signalcontext.c#2 integrate .. //depot/projects/hammer/lib/libc/arm/sys/Makefile.inc#2 integrate .. //depot/projects/hammer/lib/libc/arm/sys/getcontext.S#2 delete .. //depot/projects/hammer/lib/libc/i386/gen/_set_tp.c#4 integrate .. //depot/projects/hammer/lib/libc/i386/sys/Makefile.inc#5 integrate .. //depot/projects/hammer/lib/libpthread/arch/amd64/amd64/pthread_md.c#4 integrate .. //depot/projects/hammer/lib/libpthread/arch/arm/arm/context.S#2 integrate .. //depot/projects/hammer/lib/libpthread/arch/arm/arm/pthread_md.c#3 integrate .. //depot/projects/hammer/lib/libpthread/arch/arm/include/atomic_ops.h#2 integrate .. //depot/projects/hammer/lib/libpthread/arch/arm/include/pthread_md.h#5 integrate .. //depot/projects/hammer/lib/libpthread/arch/i386/i386/pthread_md.c#4 integrate .. //depot/projects/hammer/lib/libpthread/arch/i386/include/pthread_md.h#11 integrate .. //depot/projects/hammer/lib/libthr/arch/i386/i386/_setcurthread.c#15 integrate .. //depot/projects/hammer/libexec/rtld-elf/i386/reloc.c#6 integrate .. //depot/projects/hammer/sbin/geom/class/mirror/gmirror.8#4 integrate .. //depot/projects/hammer/sbin/geom/class/raid3/graid3.8#5 integrate .. //depot/projects/hammer/sys/alpha/alpha/machdep.c#26 integrate .. //depot/projects/hammer/sys/alpha/alpha/mp_machdep.c#12 integrate .. //depot/projects/hammer/sys/alpha/include/pcpu.h#2 integrate .. //depot/projects/hammer/sys/alpha/include/smp.h#2 integrate .. //depot/projects/hammer/sys/amd64/amd64/busdma_machdep.c#20 integrate .. //depot/projects/hammer/sys/amd64/amd64/mp_machdep.c#76 integrate .. //depot/projects/hammer/sys/arm/arm/cpufunc.c#4 integrate .. //depot/projects/hammer/sys/arm/arm/critical.c#2 integrate .. //depot/projects/hammer/sys/arm/arm/fusu.S#3 integrate .. //depot/projects/hammer/sys/arm/arm/identcpu.c#3 integrate .. //depot/projects/hammer/sys/arm/arm/locore.S#5 integrate .. //depot/projects/hammer/sys/arm/arm/support.S#4 integrate .. //depot/projects/hammer/sys/arm/arm/swtch.S#4 integrate .. //depot/projects/hammer/sys/arm/arm/trap.c#3 integrate .. //depot/projects/hammer/sys/arm/include/atomic.h#3 integrate .. //depot/projects/hammer/sys/arm/xscale/i80321/iq31244_machdep.c#2 integrate .. //depot/projects/hammer/sys/dev/random/randomdev_soft.c#8 integrate .. //depot/projects/hammer/sys/dev/snp/snp.c#14 integrate .. //depot/projects/hammer/sys/i386/include/sysarch.h#7 integrate .. //depot/projects/hammer/sys/kern/kern_intr.c#33 integrate .. //depot/projects/hammer/sys/kern/kern_shutdown.c#31 integrate .. //depot/projects/hammer/sys/kern/kern_thread.c#71 integrate .. //depot/projects/hammer/sys/kern/subr_sleepqueue.c#11 integrate .. //depot/projects/hammer/sys/vm/vm_zeroidle.c#17 integrate Differences ... ==== //depot/projects/hammer/Makefile#27 (text+ko) ==== @@ -1,5 +1,5 @@ # -# $FreeBSD: src/Makefile,v 1.309 2004/10/18 17:47:31 ru Exp $ +# $FreeBSD: src/Makefile,v 1.310 2004/11/06 03:14:26 peter Exp $ # # The user-driven targets are: # ==== //depot/projects/hammer/Makefile.inc1#74 (text+ko) ==== @@ -1,5 +1,5 @@ # -# $FreeBSD: src/Makefile.inc1,v 1.450 2004/10/24 15:32:23 ru Exp $ +# $FreeBSD: src/Makefile.inc1,v 1.451 2004/11/06 03:14:26 peter Exp $ # # Make command line options: # -DNO_DYNAMICROOT do not link /bin and /sbin dynamically ==== //depot/projects/hammer/lib/libc/arm/gen/_ctx_start.S#2 (text+ko) ==== @@ -1,8 +1,9 @@ #include -.ident "$FreeBSD: src/lib/libc/arm/gen/_ctx_start.S,v 1.1 2004/05/14 12:04:30 cognet Exp $" +.ident "$FreeBSD: src/lib/libc/arm/gen/_ctx_start.S,v 1.2 2004/11/05 23:53:02 cognet Exp $" ENTRY(_ctx_start) - mov pc, r0 - mov r0, r1 + mov lr, pc + mov pc, r4 + mov r0, r5 bl _C_LABEL(ctx_done) bl _C_LABEL(abort) ==== //depot/projects/hammer/lib/libc/arm/gen/_setjmp.S#2 (text+ko) ==== @@ -33,8 +33,8 @@ */ #include -__FBSDID("$FreeBSD: src/lib/libc/arm/gen/_setjmp.S,v 1.1 2004/05/14 12:04:30 cognet Exp $"); -#define SOFTFLOAT /* XXX */ +__FBSDID("$FreeBSD: src/lib/libc/arm/gen/_setjmp.S,v 1.2 2004/11/05 23:53:54 cognet Exp $"); + /* * C library -- _setjmp, _longjmp * ==== //depot/projects/hammer/lib/libc/arm/gen/makecontext.c#2 (text+ko) ==== @@ -37,7 +37,7 @@ */ #include -__FBSDID("$FreeBSD: src/lib/libc/arm/gen/makecontext.c,v 1.1 2004/05/14 12:04:30 cognet Exp $"); +__FBSDID("$FreeBSD: src/lib/libc/arm/gen/makecontext.c,v 1.2 2004/11/05 23:53:02 cognet Exp $"); #include #include @@ -46,7 +46,7 @@ #include -extern void _ctx_start(ucontext_t *, int argc, ...); +extern void _ctx_start(void); void ctx_done(ucontext_t *ucp) @@ -72,7 +72,8 @@ /* Compute and align stack pointer. */ sp = (unsigned int *) - (((uintptr_t)ucp->uc_stack.ss_sp + ucp->uc_stack.ss_size) & ~7); + (((uintptr_t)ucp->uc_stack.ss_sp + ucp->uc_stack.ss_size - + sizeof(double)) & ~7); /* Allocate necessary stack space for arguments exceeding r0-3. */ if (argc > 4) sp -= argc - 4; @@ -80,8 +81,9 @@ /* Wipe out frame pointer. */ gr[_REG_FP] = 0; /* Arrange for return via the trampoline code. */ - gr[_REG_LR] = (__greg_t)_ctx_start; - gr[_REG_PC] = (__greg_t)func; + gr[_REG_PC] = (__greg_t)_ctx_start; + gr[_REG_R4] = (__greg_t)func; + gr[_REG_R5] = (__greg_t)ucp; va_start(ap, argc); /* Pass up to four arguments in r0-3. */ ==== //depot/projects/hammer/lib/libc/arm/gen/setjmp.S#3 (text+ko) ==== @@ -33,7 +33,7 @@ */ #include -__FBSDID("$FreeBSD: src/lib/libc/arm/gen/setjmp.S,v 1.2 2004/09/23 23:13:46 cognet Exp $"); +__FBSDID("$FreeBSD: src/lib/libc/arm/gen/setjmp.S,v 1.3 2004/11/05 23:53:54 cognet Exp $"); /* * C library -- setjmp, longjmp * @@ -44,7 +44,6 @@ * The previous signal state is restored. */ -#define SOFTFLOAT /* XXX */ ENTRY(setjmp) /* Block all signals and retrieve the old signal mask */ stmfd sp!, {r0, r14} ==== //depot/projects/hammer/lib/libc/arm/gen/signalcontext.c#2 (text+ko) ==== @@ -25,7 +25,7 @@ */ #include -__FBSDID("$FreeBSD: src/lib/libc/arm/gen/signalcontext.c,v 1.1 2004/05/14 12:04:30 cognet Exp $"); +__FBSDID("$FreeBSD: src/lib/libc/arm/gen/signalcontext.c,v 1.2 2004/11/05 23:53:02 cognet Exp $"); #include #include @@ -51,11 +51,8 @@ struct sigframe *sfp; __greg_t *gr = ucp->uc_mcontext.__gregs; unsigned int *sp; - mcontext_t *mc; - mc = &ucp->uc_mcontext; - sp = (unsigned int *) - (((uintptr_t)ucp->uc_stack.ss_sp + ucp->uc_stack.ss_size) & ~7); + sp = (unsigned int *)gr[_REG_SP]; sfp = (struct sigframe *)sp - 1; @@ -63,13 +60,16 @@ bcopy(ucp, &sfp->sf_uc, sizeof(*ucp)); sfp->sf_si.si_signo = sig; - gr[_REG_SP] = (__greg_t)sp; + gr[_REG_SP] = (__greg_t)sfp; /* Wipe out frame pointer. */ gr[_REG_FP] = 0; /* Arrange for return via the trampoline code. */ - gr[_REG_LR] = (__greg_t)_ctx_start; - gr[_REG_PC] = (__greg_t)func; - gr[_REG_R0] = (__greg_t)ucp; + gr[_REG_PC] = (__greg_t)_ctx_start; + gr[_REG_R4] = (__greg_t)func; + gr[_REG_R5] = (__greg_t)ucp; + gr[_REG_R0] = (__greg_t)sig; + gr[_REG_R1] = (__greg_t)&sfp->sf_si; + gr[_REG_R2] = (__greg_t)&sfp->sf_uc; ucp->uc_link = &sfp->sf_uc; sigdelset(&ucp->uc_sigmask, sig); ==== //depot/projects/hammer/lib/libc/arm/sys/Makefile.inc#2 (text+ko) ==== @@ -1,6 +1,6 @@ -# $FreeBSD: src/lib/libc/arm/sys/Makefile.inc,v 1.1 2004/05/14 12:04:31 cognet Exp $ +# $FreeBSD: src/lib/libc/arm/sys/Makefile.inc,v 1.2 2004/11/05 23:52:05 cognet Exp $ -MDASM= Ovfork.S brk.S cerror.S getcontext.S pipe.S ptrace.S sbrk.S shmat.S sigreturn.S syscall.S +MDASM= Ovfork.S brk.S cerror.S pipe.S ptrace.S sbrk.S shmat.S sigreturn.S syscall.S # Don't generate default code for these syscalls: NOASM= break.o exit.o ftruncate.o getdomainname.o getlogin.o \ ==== //depot/projects/hammer/lib/libc/i386/gen/_set_tp.c#4 (text+ko) ==== @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/lib/libc/i386/gen/_set_tp.c,v 1.1 2004/08/15 16:18:03 dfr Exp $ + * $FreeBSD: src/lib/libc/i386/gen/_set_tp.c,v 1.2 2004/11/06 03:28:26 peter Exp $ */ #include ==== //depot/projects/hammer/lib/libc/i386/sys/Makefile.inc#5 (text+ko) ==== @@ -1,5 +1,5 @@ # from: Makefile.inc,v 1.1 1993/09/03 19:04:23 jtc Exp -# $FreeBSD: src/lib/libc/i386/sys/Makefile.inc,v 1.27 2003/09/04 00:20:40 peter Exp $ +# $FreeBSD: src/lib/libc/i386/sys/Makefile.inc,v 1.28 2004/11/06 03:28:26 peter Exp $ .if !defined(COMPAT_32BIT) SRCS+= i386_clr_watch.c i386_get_ioperm.c i386_get_ldt.c i386_set_ioperm.c \ ==== //depot/projects/hammer/lib/libpthread/arch/amd64/amd64/pthread_md.c#4 (text+ko) ==== @@ -23,7 +23,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $FreeBSD: src/lib/libpthread/arch/amd64/amd64/pthread_md.c,v 1.3 2004/08/15 16:28:04 dfr Exp $ + * $FreeBSD: src/lib/libpthread/arch/amd64/amd64/pthread_md.c,v 1.4 2004/11/06 03:33:19 peter Exp $ */ #include ==== //depot/projects/hammer/lib/libpthread/arch/arm/arm/context.S#2 (text+ko) ==== @@ -25,7 +25,7 @@ */ #include -__FBSDID("$FreeBSD: src/lib/libpthread/arch/arm/arm/context.S,v 1.1 2004/05/14 12:21:29 cognet Exp $"); +__FBSDID("$FreeBSD: src/lib/libpthread/arch/arm/arm/context.S,v 1.2 2004/11/05 23:49:21 cognet Exp $"); /* * int thr_setcontext(mcontext_t *mcp, intptr_t val, intptr_t *loc) @@ -43,18 +43,9 @@ cmp r0, #0 moveq r0, #-1 moveq pc, lr - add ip, r0, #8 - ldmia ip, {r2-r12} cmp r2, #0 - str r1, [r2] - add ip, r0, #4 - str ip, [r1] /* Restore r1. */ - add ip, r0, #64 - msr cpsr, ip - add ip, r0, #52 - mov r0, #0 /* Return 0. */ - ldr sp, [ip] /* Restore stack pointer. */ - mov pc, lr /* Return. */ + strne r1, [r2] + ldmia r0, {r0-r15} /* XXX: FP bits ? */ /* @@ -72,10 +63,14 @@ moveq r0, #-1 moveq pc, lr stmia r0, {r0-r13} + mov r1, #1 + str r1, [r0] /* Return 1 from setcontext */ + str lr, [r0, #(15 * 4)] /* PC */ + mrs r1, cpsr + str r1, [r0, #(16 * 4)] /* CPSR */ mov r0, #0 /* Return 0. */ mov pc, lr ENTRY(_arm_enter_uts) - add r4, r2, r3 /* Stack addr + size. */ - mov lr, pc + add sp, r2, r3 /* Stack addr + size. */ mov pc, r1 ==== //depot/projects/hammer/lib/libpthread/arch/arm/arm/pthread_md.c#3 (text+ko) ==== @@ -27,7 +27,7 @@ */ #include -__FBSDID("$FreeBSD: src/lib/libpthread/arch/arm/arm/pthread_md.c,v 1.2 2004/09/24 13:02:30 cognet Exp $"); +__FBSDID("$FreeBSD: src/lib/libpthread/arch/arm/arm/pthread_md.c,v 1.3 2004/11/05 23:49:21 cognet Exp $"); #include @@ -39,19 +39,15 @@ #include "pthread_md.h" +struct arm_tp *_tp = NULL; + struct tcb * _tcb_ctor(struct pthread *thread, int initial) { struct tcb *tcb; - void *addr; - addr = malloc(sizeof(struct tcb) + 63); - if (addr == NULL) - tcb = NULL; - else { - tcb = (struct tcb *)(((uintptr_t)(addr) + 63) & ~63); + if ((tcb = malloc(sizeof(struct tcb)))) { bzero(tcb, sizeof(struct tcb)); - tcb->tcb_addr = addr; tcb->tcb_thread = thread; /* XXX - Allocate tdv/tls */ } @@ -61,11 +57,8 @@ void _tcb_dtor(struct tcb *tcb) { - void *addr; - addr = tcb->tcb_addr; - tcb->tcb_addr = NULL; - free(addr); + free(tcb); } struct kcb * ==== //depot/projects/hammer/lib/libpthread/arch/arm/include/atomic_ops.h#2 (text+ko) ==== @@ -23,12 +23,15 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/lib/libpthread/arch/arm/include/atomic_ops.h,v 1.1 2004/05/14 12:21:29 cognet Exp $ + * $FreeBSD: src/lib/libpthread/arch/arm/include/atomic_ops.h,v 1.2 2004/11/05 23:49:21 cognet Exp $ */ #ifndef _ATOMIC_OPS_H_ #define _ATOMIC_OPS_H_ +#include +#include "thr_private.h" + /* * Atomic swap: * Atomic (tmp = *dst, *dst = val), then *res = tmp @@ -38,9 +41,7 @@ static inline void atomic_swap32(intptr_t *dst, intptr_t val, intptr_t *res) { - __asm __volatile( - "swp %2, %2, [%1]; mov %2, %0" - : "=r" (*res) : "r" (dst), "r" (val) : "cc"); + *res = __swp(val, dst); } #define atomic_swap_ptr(d, v, r) \ @@ -49,3 +50,19 @@ #define atomic_swap_int(d, v, r) \ atomic_swap32((intptr_t *)d, (intptr_t)v, (intptr_t *)r) #endif + +static inline u_int32_t +atomic_cmpset_32(volatile u_int32_t *p, u_int32_t cmpval, u_int32_t newval) +{ + kse_critical_t crit = _kse_critical_enter(); + int ret; + + if (*p == cmpval) { + *p = newval; + ret = 1; + } else + ret = 0; + _kse_critical_leave(crit); + return (ret); +} + ==== //depot/projects/hammer/lib/libpthread/arch/arm/include/pthread_md.h#5 (text+ko) ==== @@ -24,7 +24,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $FreeBSD: src/lib/libpthread/arch/arm/include/pthread_md.h,v 1.6 2004/09/24 13:02:30 cognet Exp $ + * $FreeBSD: src/lib/libpthread/arch/arm/include/pthread_md.h,v 1.7 2004/11/05 23:49:21 cognet Exp $ */ /* @@ -64,19 +64,15 @@ */ struct arm_tp { struct tdv *tp_tdv; /* dynamic TLS */ - uint32_t _reserved_; - long double tp_tls[0]; /* static TLS */ }; struct tcb { struct pthread *tcb_thread; - void *tcb_addr; /* allocated tcb address */ struct kcb *tcb_curkcb; uint32_t tcb_isfake; - uint32_t tcb_spare[4]; struct kse_thr_mailbox tcb_tmbx; /* needs 32-byte alignment */ struct arm_tp tcb_tp; -} __aligned(32); +}; struct kcb { struct kse_mailbox kcb_kmbx; @@ -85,7 +81,7 @@ struct kse *kcb_kse; }; -register struct arm_tp *_tp __asm("%r6"); +extern struct arm_tp *_tp; #define _tcb ((struct tcb*)((char*)(_tp) - offsetof(struct tcb, tcb_tp))) @@ -97,12 +93,21 @@ struct kcb *_kcb_ctor(struct kse *kse); void _kcb_dtor(struct kcb *); +static __inline uint32_t +__kcb_swp(uint32_t val, void *ptr) +{ + + __asm __volatile("swp %0, %1, [%2]" + : "=r" (val) : "r" (val) , "r" (ptr) : "memory"); + return (val); +} + /* Called from the KSE to set its private data. */ static __inline void _kcb_set(struct kcb *kcb) { /* There is no thread yet; use the fake tcb. */ - _tp = &kcb->kcb_faketcb.tcb_tp; + __kcb_swp((uint32_t)&kcb->kcb_faketcb.tcb_tp, &_tp); } /* @@ -126,30 +131,21 @@ _kcb_critical_enter(void) { struct kse_thr_mailbox *crit; - uint32_t flags; - if (_tcb->tcb_isfake != 0) { - /* - * We already are in a critical region since - * there is no current thread. - */ - crit = NULL; - } else { - flags = _tcb->tcb_tmbx.tm_flags; - _tcb->tcb_tmbx.tm_flags |= TMF_NOUPCALL; - crit = _tcb->tcb_curkcb->kcb_kmbx.km_curthread; - _tcb->tcb_curkcb->kcb_kmbx.km_curthread = NULL; - _tcb->tcb_tmbx.tm_flags = flags; - } + if (_tcb->tcb_isfake) + return (NULL); + crit = (struct kse_thr_mailbox *)__kcb_swp((uint32_t)NULL, + &_tcb->tcb_curkcb->kcb_kmbx.km_curthread); return (crit); } static __inline void _kcb_critical_leave(struct kse_thr_mailbox *crit) { - /* No need to do anything if this is a fake tcb. */ + if (_tcb->tcb_isfake == 0) - _tcb->tcb_curkcb->kcb_kmbx.km_curthread = crit; + __kcb_swp((uint32_t)crit, + &_tcb->tcb_curkcb->kcb_kmbx.km_curthread); } static __inline int @@ -158,6 +154,7 @@ uint32_t flags; int ret; + return (_tcb->tcb_curkcb->kcb_kmbx.km_curthread == NULL); if (_tcb->tcb_isfake != 0) { /* * We are in a critical region since there is no @@ -176,11 +173,11 @@ static __inline void _tcb_set(struct kcb *kcb, struct tcb *tcb) { - if (tcb == NULL) + if (tcb == NULL) tcb = &kcb->kcb_faketcb; + __kcb_swp((uint32_t)&tcb->tcb_tp, &_tp); kcb->kcb_curtcb = tcb; tcb->tcb_curkcb = kcb; - _tp = &tcb->tcb_tp; } static __inline struct tcb * @@ -206,22 +203,25 @@ return (_tcb->tcb_curkcb->kcb_kse); } -void _arm_enter_uts(kse_func_t uts, struct kse_mailbox *km, void *stack, +void _arm_enter_uts(struct kse_mailbox *km, kse_func_t uts, void *stack, size_t stacksz); static __inline int _thread_enter_uts(struct tcb *tcb, struct kcb *kcb) { - if (_thr_getcontext(&tcb->tcb_tmbx.tm_context.uc_mcontext) == 0) { - /* Make the fake tcb the current thread. */ + int ret; + + if ((ret = _thr_getcontext(&tcb->tcb_tmbx.tm_context.uc_mcontext)) + == 0) { kcb->kcb_curtcb = &kcb->kcb_faketcb; - _tp = &kcb->kcb_faketcb.tcb_tp; - _arm_enter_uts(kcb->kcb_kmbx.km_func, &kcb->kcb_kmbx, + __kcb_swp((int)&kcb->kcb_faketcb.tcb_tp, &_tp); + _arm_enter_uts(&kcb->kcb_kmbx, kcb->kcb_kmbx.km_func, kcb->kcb_kmbx.km_stack.ss_sp, kcb->kcb_kmbx.km_stack.ss_size); /* We should not reach here. */ return (-1); - } + } else if (ret < 0) + return (-1); return (0); } @@ -231,9 +231,11 @@ extern int _libkse_debug; mcontext_t *mc; + if (!tcb || !kcb) + return (-1); _tcb_set(kcb, tcb); mc = &tcb->tcb_tmbx.tm_context.uc_mcontext; - if (_libkse_debug == 0) { + if (0 && _libkse_debug == 0) { tcb->tcb_tmbx.tm_lwp = kcb->kcb_kmbx.km_lwp; if (setmbox) _thr_setcontext(mc, (intptr_t)&tcb->tcb_tmbx, ==== //depot/projects/hammer/lib/libpthread/arch/i386/i386/pthread_md.c#4 (text+ko) ==== @@ -26,7 +26,7 @@ */ #include -__FBSDID("$FreeBSD: src/lib/libpthread/arch/i386/i386/pthread_md.c,v 1.3 2004/08/15 16:28:05 dfr Exp $"); +__FBSDID("$FreeBSD: src/lib/libpthread/arch/i386/i386/pthread_md.c,v 1.4 2004/11/06 03:35:51 peter Exp $"); #include #include ==== //depot/projects/hammer/lib/libpthread/arch/i386/include/pthread_md.h#11 (text+ko) ==== @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/lib/libpthread/arch/i386/include/pthread_md.h,v 1.12 2004/08/26 02:41:01 davidxu Exp $ + * $FreeBSD: src/lib/libpthread/arch/i386/include/pthread_md.h,v 1.13 2004/11/06 03:35:51 peter Exp $ */ /* * Machine-dependent thread prototypes/definitions for the thread kernel. ==== //depot/projects/hammer/lib/libthr/arch/i386/i386/_setcurthread.c#15 (text+ko) ==== @@ -23,7 +23,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $FreeBSD: src/lib/libthr/arch/i386/i386/_setcurthread.c,v 1.15 2004/08/19 23:49:04 davidxu Exp $ + * $FreeBSD: src/lib/libthr/arch/i386/i386/_setcurthread.c,v 1.16 2004/11/06 03:30:53 peter Exp $ */ #include ==== //depot/projects/hammer/libexec/rtld-elf/i386/reloc.c#6 (text+ko) ==== @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $FreeBSD: src/libexec/rtld-elf/i386/reloc.c,v 1.13 2004/08/03 08:50:59 dfr Exp $ + * $FreeBSD: src/libexec/rtld-elf/i386/reloc.c,v 1.14 2004/11/06 03:32:07 peter Exp $ */ /* ==== //depot/projects/hammer/sbin/geom/class/mirror/gmirror.8#4 (text+ko) ==== @@ -22,7 +22,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD: src/sbin/geom/class/mirror/gmirror.8,v 1.6 2004/11/04 19:12:43 ceri Exp $ +.\" $FreeBSD: src/sbin/geom/class/mirror/gmirror.8,v 1.7 2004/11/05 22:38:14 pjd Exp $ .\" .Dd Jul 9, 2004 .Dt GMIRROR 8 @@ -293,3 +293,5 @@ There should be a way to change a component's priority inside a running mirror. .Pp There should be a section with an implementation description. +.Pp +Documentation for sysctls kern.geom.mirror.* is missing. ==== //depot/projects/hammer/sbin/geom/class/raid3/graid3.8#5 (text+ko) ==== @@ -22,7 +22,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD: src/sbin/geom/class/raid3/graid3.8,v 1.9 2004/11/04 19:12:43 ceri Exp $ +.\" $FreeBSD: src/sbin/geom/class/raid3/graid3.8,v 1.10 2004/11/05 22:38:14 pjd Exp $ .\" .Dd Aug 22, 2004 .Dt GRAID3 8 @@ -240,3 +240,5 @@ .An Pawel Jakub Dawidek Aq pjd@FreeBSD.org .Sh BUGS There should be a section with an implementation description. +.Pp +Documentation for sysctls kern.geom.raid3.* is missing. ==== //depot/projects/hammer/sys/alpha/alpha/machdep.c#26 (text+ko) ==== @@ -88,7 +88,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/alpha/alpha/machdep.c,v 1.223 2004/09/05 02:09:51 julian Exp $"); +__FBSDID("$FreeBSD: src/sys/alpha/alpha/machdep.c,v 1.224 2004/11/05 19:16:43 jhb Exp $"); #include "opt_compat.h" #include "opt_ddb.h" @@ -864,7 +864,8 @@ /* This is not a 'struct user' */ size_t sz = round_page(KSTACK_PAGES * PAGE_SIZE); pcpup = (struct pcpu *) pmap_steal_memory(sz); - pcpu_init(pcpup, alpha_pal_whami(), sz); + pcpu_init(pcpup, 0, sz); + pcpup->pc_pal_id = alpha_pal_whami(); alpha_pal_wrval((u_int64_t) pcpup); PCPU_GET(next_asn) = 1; /* 0 used for proc0 pmap */ PCPU_SET(curthread, &thread0); ==== //depot/projects/hammer/sys/alpha/alpha/mp_machdep.c#12 (text+ko) ==== @@ -25,7 +25,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/alpha/alpha/mp_machdep.c,v 1.52 2004/01/07 23:00:20 jhb Exp $"); +__FBSDID("$FreeBSD: src/sys/alpha/alpha/mp_machdep.c,v 1.53 2004/11/05 19:16:43 jhb Exp $"); #include "opt_kstack_pages.h" @@ -61,23 +61,23 @@ static struct mtx ap_boot_mtx; -u_int boot_cpu_id; +u_int64_t boot_cpu_id; static void release_aps(void *dummy); static int smp_cpu_enabled(struct pcs *pcsp); extern void smp_init_secondary_glue(void); -static int smp_send_secondary_command(const char *command, int cpuid); -static int smp_start_secondary(int cpuid); +static int smp_send_secondary_command(const char *command, int pal_id); +static int smp_start_secondary(int pal_id, int cpuid); /* * Communicate with a console running on a secondary processor. * Return 1 on failure. */ static int -smp_send_secondary_command(const char *command, int cpuid) +smp_send_secondary_command(const char *command, int pal_id) { - u_int64_t mask = 1L << cpuid; - struct pcs *cpu = LOCATE_PCS(hwrpb, cpuid); + u_int64_t mask = 1L << pal_id; + struct pcs *cpu = LOCATE_PCS(hwrpb, pal_id); int i, len; /* @@ -165,7 +165,7 @@ /* * Set flags in our per-CPU slot in the HWRPB. */ - cpu = LOCATE_PCS(hwrpb, PCPU_GET(cpuid)); + cpu = LOCATE_PCS(hwrpb, PCPU_GET(pal_id)); cpu->pcs_flags &= ~PCS_BIP; cpu->pcs_flags |= PCS_RC; alpha_mb(); @@ -216,9 +216,9 @@ } static int -smp_start_secondary(int cpuid) +smp_start_secondary(int pal_id, int cpuid) { - struct pcs *cpu = LOCATE_PCS(hwrpb, cpuid); + struct pcs *cpu = LOCATE_PCS(hwrpb, pal_id); struct pcs *bootcpu = LOCATE_PCS(hwrpb, boot_cpu_id); struct alpha_pcb *pcb = (struct alpha_pcb *) cpu->pcs_hwpcb; struct pcpu *pcpu; @@ -226,12 +226,12 @@ size_t sz; if ((cpu->pcs_flags & PCS_PV) == 0) { - printf("smp_start_secondary: cpu %d PALcode invalid\n", cpuid); + printf("smp_start_secondary: cpu %d PALcode invalid\n", pal_id); return 0; } if (bootverbose) - printf("smp_start_secondary: starting cpu %d\n", cpuid); + printf("smp_start_secondary: starting cpu %d\n", pal_id); sz = round_page((UAREA_PAGES + KSTACK_PAGES) * PAGE_SIZE); pcpu = malloc(sz, M_TEMP, M_NOWAIT); @@ -241,6 +241,7 @@ } pcpu_init(pcpu, cpuid, sz); + pcpu->pc_pal_id = pal_id; /* * Copy the idle pcb and setup the address to start executing. @@ -270,7 +271,7 @@ /* * Fire it up and hope for the best. */ - if (!smp_send_secondary_command("START\r\n", cpuid)) { + if (!smp_send_secondary_command("START\r\n", pal_id)) { printf("smp_start_secondary: can't send START command\n"); pcpu_destroy(pcpu); free(pcpu, M_TEMP); @@ -296,7 +297,7 @@ * It worked (I think). */ if (bootverbose) - printf("smp_start_secondary: cpu %d started\n", cpuid); + printf("smp_start_secondary: cpu %d started\n", pal_id); return 1; } @@ -329,16 +330,18 @@ void cpu_mp_setmaxid(void) { - int i; + u_int64_t i; mp_maxid = 0; - for (i = 0; i < hwrpb->rpb_pcs_cnt && i < MAXCPU; i++) { - if (i == PCPU_GET(cpuid)) + for (i = 0; i < hwrpb->rpb_pcs_cnt; i++) { + if (i == PCPU_GET(pal_id)) continue; if (!smp_cpu_enabled(LOCATE_PCS(hwrpb, i))) continue; - mp_maxid = i; + mp_maxid++; } + if (mp_maxid > MAXCPU) + mp_maxid = MAXCPU; } int @@ -348,7 +351,7 @@ /* XXX: Need to check for valid platforms here. */ - boot_cpu_id = PCPU_GET(cpuid); + boot_cpu_id = PCPU_GET(pal_id); KASSERT(boot_cpu_id == hwrpb->rpb_primary_cpu_id, ("cpu_mp_probe() called on non-primary CPU")); all_cpus = PCPU_GET(cpumask); @@ -358,12 +361,10 @@ /* Make sure we have at least one secondary CPU. */ cpus = 0; for (i = 0; i < hwrpb->rpb_pcs_cnt; i++) { - if (i == PCPU_GET(cpuid)) + if (i == PCPU_GET(pal_id)) continue; if (!smp_cpu_enabled(LOCATE_PCS(hwrpb, i))) continue; - if (i > MAXCPU) - continue; cpus++; } return (cpus); @@ -372,10 +373,11 @@ void cpu_mp_start(void) { - int i; + int i, cpuid; mtx_init(&ap_boot_mtx, "ap boot", NULL, MTX_SPIN); + cpuid = 1; for (i = 0; i < hwrpb->rpb_pcs_cnt; i++) { struct pcs *pcsp; @@ -410,22 +412,30 @@ printf("CPU %d disabled by loader.\n", i); continue; } - all_cpus |= (1 << i); - mp_ncpus++; + if (smp_start_secondary(i, cpuid)) { + all_cpus |= (1 << cpuid); + mp_ncpus++; + cpuid++; + } } PCPU_SET(other_cpus, all_cpus & ~PCPU_GET(cpumask)); - - for (i = 0; i < hwrpb->rpb_pcs_cnt; i++) { - if (i == boot_cpu_id) - continue; - if (!CPU_ABSENT(i)) - smp_start_secondary(i); - } } void cpu_mp_announce(void) { + struct pcpu *pc; + int i; + + /* List CPUs */ + printf(" cpu0 (BSP): PAL ID: %2lu\n", boot_cpu_id); + for (i = 1; i < MAXCPU; i++) { + if (CPU_ABSENT(i)) + continue; + pc = pcpu_find(i); + MPASS(pc != NULL); + printf(" cpu%d (AP): PAL ID: %2lu\n", i, pc->pc_pal_id); + } } /* @@ -446,8 +456,9 @@ if (pcpu) { atomic_set_64(&pcpu->pc_pending_ipis, ipi); alpha_mb(); - CTR1(KTR_SMP, "calling alpha_pal_wripir(%d)", cpuid); - alpha_pal_wripir(cpuid); + CTR1(KTR_SMP, "calling alpha_pal_wripir(%d)", + pcpu->pc_pal_id); + alpha_pal_wripir(pcpu->pc_pal_id); } } } @@ -529,8 +540,8 @@ * requests to provide PALcode to secondaries and to start up new * secondaries that are added to the system on the fly. */ - if (PCPU_GET(cpuid) == boot_cpu_id) { - u_int cpuid; + if (PCPU_GET(pal_id) == boot_cpu_id) { + u_int pal_id; u_int64_t txrdy; #ifdef DIAGNOSTIC struct pcs *cpu; @@ -539,18 +550,18 @@ alpha_mb(); while (hwrpb->rpb_txrdy != 0) { - cpuid = ffs(hwrpb->rpb_txrdy) - 1; + pal_id = ffs(hwrpb->rpb_txrdy) - 1; #ifdef DIAGNOSTIC - cpu = LOCATE_PCS(hwrpb, cpuid); + cpu = LOCATE_PCS(hwrpb, pal_id); bcopy(&cpu->pcs_buffer.txbuf, buf, cpu->pcs_buffer.txlen); buf[cpu->pcs_buffer.txlen] = '\0'; - printf("SMP From CPU%d: %s\n", cpuid, buf); + printf("SMP From CPU%d: %s\n", pal_id, buf); #endif do { txrdy = hwrpb->rpb_txrdy; } while (atomic_cmpset_64(&hwrpb->rpb_txrdy, txrdy, - txrdy & ~(1 << cpuid)) == 0); + txrdy & ~(1 << pal_id)) == 0); } } } ==== //depot/projects/hammer/sys/alpha/include/pcpu.h#2 (text+ko) ==== @@ -24,7 +24,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/alpha/include/pcpu.h,v 1.14 2001/12/11 23:33:39 jhb Exp $ + * $FreeBSD: src/sys/alpha/include/pcpu.h,v 1.15 2004/11/05 19:16:44 jhb Exp $ */ #ifndef _MACHINE_PCPU_H_ @@ -34,6 +34,7 @@ #define PCPU_MD_FIELDS \ struct alpha_pcb pc_idlepcb; /* pcb for idling */ \ + u_int64_t pc_pal_id; /* physical CPU ID */ \ u_int64_t pc_idlepcbphys; /* pa of pc_idlepcb */ \ u_int64_t pc_pending_ipis; /* pending IPI's */ \ u_int32_t pc_next_asn; /* next ASN to alloc */ \ ==== //depot/projects/hammer/sys/alpha/include/smp.h#2 (text+ko) ==== @@ -6,7 +6,7 @@ * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp * ---------------------------------------------------------------------------- * - * $FreeBSD: src/sys/alpha/include/smp.h,v 1.6 2001/08/13 22:41:15 jhb Exp $ + * $FreeBSD: src/sys/alpha/include/smp.h,v 1.7 2004/11/05 19:16:44 jhb Exp $ * */ @@ -26,7 +26,7 @@ #ifndef LOCORE -extern u_int boot_cpu_id; +extern u_int64_t boot_cpu_id; void ipi_selected(u_int cpus, u_int64_t ipi); void ipi_all(u_int64_t ipi); ==== //depot/projects/hammer/sys/amd64/amd64/busdma_machdep.c#20 (text+ko) ==== @@ -25,7 +25,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/amd64/amd64/busdma_machdep.c,v 1.58 2004/09/08 04:54:18 scottl Exp $"); +__FBSDID("$FreeBSD: src/sys/amd64/amd64/busdma_machdep.c,v 1.59 2004/11/05 18:24:01 peter Exp $"); #include #include ==== //depot/projects/hammer/sys/amd64/amd64/mp_machdep.c#76 (text+ko) ==== @@ -25,7 +25,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/amd64/amd64/mp_machdep.c,v 1.247 2004/09/29 01:59:10 peter Exp $"); +__FBSDID("$FreeBSD: src/sys/amd64/amd64/mp_machdep.c,v 1.248 2004/11/05 18:25:22 peter Exp $"); #include "opt_cpu.h" #include "opt_kstack_pages.h" >>> TRUNCATED FOR MAIL (1000 lines) <<<