Date: Mon, 16 Nov 2009 04:14:22 +0000 (UTC) From: Nathan Whitehorn <nwhitehorn@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r199309 - in projects/ppc64/sys/powerpc: aim powerpc Message-ID: <200911160414.nAG4EM3U057253@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: nwhitehorn Date: Mon Nov 16 04:14:22 2009 New Revision: 199309 URL: http://svn.freebsd.org/changeset/base/199309 Log: Some missing bits from the compat layer, in particular an implementation of fuword32 for 64-bit systems. With this change, sysinstall will now ask me what kind of terminal I wish to use in the Cell system simulator. Modified: projects/ppc64/sys/powerpc/aim/copyinout.c projects/ppc64/sys/powerpc/aim/trap.c projects/ppc64/sys/powerpc/powerpc/elf32_machdep.c projects/ppc64/sys/powerpc/powerpc/exec_machdep.c Modified: projects/ppc64/sys/powerpc/aim/copyinout.c ============================================================================== --- projects/ppc64/sys/powerpc/aim/copyinout.c Mon Nov 16 04:09:11 2009 (r199308) +++ projects/ppc64/sys/powerpc/aim/copyinout.c Mon Nov 16 04:14:22 2009 (r199309) @@ -353,6 +353,33 @@ fubyte(const void *addr) return (val); } +#ifdef __powerpc64__ +int32_t +fuword32(const void *addr) +{ + struct thread *td; + pmap_t pm; + faultbuf env; + int32_t *p, val; + + td = PCPU_GET(curthread); + pm = &td->td_proc->p_vmspace->vm_pmap; + p = (int32_t *)((uintptr_t)USER_ADDR + ((uintptr_t)addr & ~SEGMENT_MASK)); + + if (setfault(env)) { + td->td_pcb->pcb_onfault = NULL; + return (-1); + } + + set_user_sr(pm,addr); + + val = *p; + + td->td_pcb->pcb_onfault = NULL; + return (val); +} +#endif + long fuword(const void *addr) { @@ -378,11 +405,13 @@ fuword(const void *addr) return (val); } +#ifndef __powerpc64__ int32_t fuword32(const void *addr) { return ((int32_t)fuword(addr)); } +#endif uint32_t casuword32(volatile uint32_t *addr, uint32_t old, uint32_t new) Modified: projects/ppc64/sys/powerpc/aim/trap.c ============================================================================== --- projects/ppc64/sys/powerpc/aim/trap.c Mon Nov 16 04:09:11 2009 (r199308) +++ projects/ppc64/sys/powerpc/aim/trap.c Mon Nov 16 04:14:22 2009 (r199309) @@ -93,6 +93,9 @@ int badaddr(void *, size_t); int badaddr_read(void *, size_t, int *); extern char *syscallnames[]; +#ifdef COMPAT_FREEBSD32 +extern char *freebsd32_syscallnames[]; +#endif struct powerpc_exception { u_int vector; @@ -361,6 +364,7 @@ syscall(struct trapframe *frame) size_t narg, argsz; u_register_t args[10]; u_int code; + char **scall_names; td = PCPU_GET(curthread); p = td->td_proc; @@ -371,11 +375,6 @@ syscall(struct trapframe *frame) params = (caddr_t)(frame->fixreg + FIRSTARG); n = NARGREG; - if (p->p_sysent->sv_flags & SV_ILP32) - argsz = sizeof(uint32_t); - else - argsz = sizeof(uint64_t); - if (p->p_sysent->sv_prepsyscall) { /* * The prep code is MP aware. @@ -419,9 +418,19 @@ syscall(struct trapframe *frame) narg = callp->sy_narg; if (p->p_sysent->sv_flags & SV_ILP32) { + argsz = sizeof(uint32_t); + #ifdef COMPAT_FREEBSD32 + scall_names = freebsd32_syscallnames; + #else + scall_names = syscallnames; + #endif + for (i = 0; i < n; i++) args[i] = ((u_register_t *)(params))[i] & 0xffffffff; } else { + argsz = sizeof(uint64_t); + scall_names = syscallnames; + for (i = 0; i < n; i++) args[i] = ((u_register_t *)(params))[i]; } @@ -433,7 +442,7 @@ syscall(struct trapframe *frame) error = 0; CTR5(KTR_SYSC, "syscall: p=%s %s(%x %x %x)", td->td_name, - syscallnames[code], + scall_names[code], args[0], args[1], args[2]); #ifdef KTRACE @@ -456,7 +465,7 @@ syscall(struct trapframe *frame) AUDIT_SYSCALL_EXIT(error, td); CTR3(KTR_SYSC, "syscall: p=%s %s ret=%x", td->td_name, - syscallnames[code], td->td_retval[0]); + scall_names[code], td->td_retval[0]); } switch (error) { case 0: @@ -500,13 +509,13 @@ syscall(struct trapframe *frame) * Check for misbehavior. */ WITNESS_WARN(WARN_PANIC, NULL, "System call %s returning", - (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???"); + (code >= 0 && code < SYS_MAXSYSCALL) ? scall_names[code] : "???"); KASSERT(td->td_critnest == 0, ("System call %s returning in a critical section", - (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???")); + (code >= 0 && code < SYS_MAXSYSCALL) ? scall_names[code] : "???")); KASSERT(td->td_locks == 0, ("System call %s returning with %d locks held", - (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???", + (code >= 0 && code < SYS_MAXSYSCALL) ? scall_names[code] : "???", td->td_locks)); #ifdef KTRACE Modified: projects/ppc64/sys/powerpc/powerpc/elf32_machdep.c ============================================================================== --- projects/ppc64/sys/powerpc/powerpc/elf32_machdep.c Mon Nov 16 04:09:11 2009 (r199308) +++ projects/ppc64/sys/powerpc/powerpc/elf32_machdep.c Mon Nov 16 04:14:22 2009 (r199309) @@ -81,14 +81,17 @@ struct sysentvec elf32_freebsd_sysvec = .sv_minsigstksz = MINSIGSTKSZ, .sv_pagesize = PAGE_SIZE, .sv_minuser = VM_MIN_ADDRESS, - .sv_maxuser = VM_MAXUSER_ADDRESS, - .sv_usrstack = USRSTACK, - .sv_psstrings = PS_STRINGS, .sv_stackprot = VM_PROT_ALL, #ifdef __powerpc64__ + .sv_maxuser = VM_MAXUSER_ADDRESS, + .sv_usrstack = FREEBSD32_USRSTACK, + .sv_psstrings = FREEBSD32_PS_STRINGS, .sv_copyout_strings = freebsd32_copyout_strings, .sv_setregs = ppc32_setregs, #else + .sv_maxuser = VM_MAXUSER_ADDRESS, + .sv_usrstack = USRSTACK, + .sv_psstrings = PS_STRINGS, .sv_copyout_strings = exec_copyout_strings, .sv_setregs = exec_setregs, #endif Modified: projects/ppc64/sys/powerpc/powerpc/exec_machdep.c ============================================================================== --- projects/ppc64/sys/powerpc/powerpc/exec_machdep.c Mon Nov 16 04:09:11 2009 (r199308) +++ projects/ppc64/sys/powerpc/powerpc/exec_machdep.c Mon Nov 16 04:14:22 2009 (r199309) @@ -490,7 +490,7 @@ ppc32_setregs(struct thread *td, u_long tf->fixreg[5] = (register_t)arginfo.ps_envstr; tf->fixreg[6] = 0; /* auxillary vector */ tf->fixreg[7] = 0; /* termination vector */ - tf->fixreg[8] = (register_t)PS_STRINGS; /* NetBSD extension */ + tf->fixreg[8] = (register_t)FREEBSD32_PS_STRINGS; /* NetBSD extension */ tf->srr0 = entry; tf->srr1 = PSL_MBO | PSL_USERSET | PSL_FE_DFLT;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200911160414.nAG4EM3U057253>