Date: Sat, 27 Jun 2009 23:27:41 +0000 (UTC) From: Oleksandr Tymoshenko <gonzo@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r195128 - in projects/mips/sys/mips: include mips Message-ID: <200906272327.n5RNRfOe091416@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: gonzo Date: Sat Jun 27 23:27:41 2009 New Revision: 195128 URL: http://svn.freebsd.org/changeset/base/195128 Log: - Add support for handling TLS area address in kernel space. From the userland point of view get/set operations are performed using sysarch(2) call. Added: projects/mips/sys/mips/mips/sys_machdep.c Modified: projects/mips/sys/mips/include/proc.h projects/mips/sys/mips/include/sysarch.h projects/mips/sys/mips/include/ucontext.h projects/mips/sys/mips/mips/genassym.c projects/mips/sys/mips/mips/machdep.c projects/mips/sys/mips/mips/pm_machdep.c projects/mips/sys/mips/mips/vm_machdep.c Modified: projects/mips/sys/mips/include/proc.h ============================================================================== --- projects/mips/sys/mips/include/proc.h Sat Jun 27 23:01:35 2009 (r195127) +++ projects/mips/sys/mips/include/proc.h Sat Jun 27 23:27:41 2009 (r195128) @@ -54,6 +54,7 @@ struct mdthread { int md_pc_count; /* performance counter */ int md_pc_spill; /* performance counter spill */ vm_offset_t md_realstack; + void *md_tls; }; /* md_flags */ Modified: projects/mips/sys/mips/include/sysarch.h ============================================================================== --- projects/mips/sys/mips/include/sysarch.h Sat Jun 27 23:01:35 2009 (r195127) +++ projects/mips/sys/mips/include/sysarch.h Sat Jun 27 23:27:41 2009 (r195128) @@ -35,16 +35,12 @@ #ifndef _MACHINE_SYSARCH_H_ #define _MACHINE_SYSARCH_H_ +#define MIPS_SET_TLS 1 +#define MIPS_GET_TLS 2 + #ifndef _KERNEL #include <sys/cdefs.h> -#if 0 -/* Something useful for each MIPS platform. */ -#else -#define mips_tcb_set(tcb) do {} while (0) -#define mips_tcb_get() NULL -#endif /* _MIPS_ARCH_XLR */ - __BEGIN_DECLS int sysarch(int, void *); __END_DECLS Modified: projects/mips/sys/mips/include/ucontext.h ============================================================================== --- projects/mips/sys/mips/include/ucontext.h Sat Jun 27 23:01:35 2009 (r195127) +++ projects/mips/sys/mips/include/ucontext.h Sat Jun 27 23:27:41 2009 (r195128) @@ -53,6 +53,7 @@ typedef struct __mcontext { int mc_fpused; /* fp has been used */ f_register_t mc_fpregs[33]; /* fp regs 0 to 31 and csr */ register_t mc_fpc_eir; /* fp exception instruction reg */ + void *mc_tls; /* pointer to TLS area */ int __spare__[8]; /* XXX reserved */ } mcontext_t; #endif Modified: projects/mips/sys/mips/mips/genassym.c ============================================================================== --- projects/mips/sys/mips/mips/genassym.c Sat Jun 27 23:01:35 2009 (r195127) +++ projects/mips/sys/mips/mips/genassym.c Sat Jun 27 23:27:41 2009 (r195128) @@ -69,6 +69,7 @@ ASSYM(TD_REALKSTACK, offsetof(struct thr ASSYM(TD_FLAGS, offsetof(struct thread, td_flags)); ASSYM(TD_LOCK, offsetof(struct thread, td_lock)); ASSYM(TD_FRAME, offsetof(struct thread, td_frame)); +ASSYM(TD_TLS, offsetof(struct thread, td_md.md_tls)); ASSYM(TF_REG_SR, offsetof(struct trapframe, sr)); Modified: projects/mips/sys/mips/mips/machdep.c ============================================================================== --- projects/mips/sys/mips/mips/machdep.c Sat Jun 27 23:01:35 2009 (r195127) +++ projects/mips/sys/mips/mips/machdep.c Sat Jun 27 23:27:41 2009 (r195128) @@ -350,12 +350,6 @@ cpu_pcpu_init(struct pcpu *pcpu, int cpu } int -sysarch(struct thread *td, register struct sysarch_args *uap) -{ - return (ENOSYS); -} - -int fill_dbregs(struct thread *td, struct dbreg *dbregs) { Modified: projects/mips/sys/mips/mips/pm_machdep.c ============================================================================== --- projects/mips/sys/mips/mips/pm_machdep.c Sat Jun 27 23:01:35 2009 (r195127) +++ projects/mips/sys/mips/mips/pm_machdep.c Sat Jun 27 23:27:41 2009 (r195128) @@ -413,9 +413,16 @@ get_mcontext(struct thread *td, mcontext bcopy((void *)&td->td_frame->f0, (void *)&mcp->mc_fpregs, sizeof(mcp->mc_fpregs)); } + if (flags & GET_MC_CLEAR_RET) { + mcp->mc_regs[V0] = 0; + mcp->mc_regs[V1] = 0; + mcp->mc_regs[A3] = 0; + } + mcp->mc_pc = td->td_frame->pc; mcp->mullo = td->td_frame->mullo; mcp->mulhi = td->td_frame->mulhi; + mcp->mc_tls = td->td_md.md_tls; return (0); } @@ -436,6 +443,7 @@ set_mcontext(struct thread *td, const mc td->td_frame->pc = mcp->mc_pc; td->td_frame->mullo = mcp->mullo; td->td_frame->mulhi = mcp->mulhi; + td->td_md.md_tls = mcp->mc_tls; /* Dont let user to set any bits in Status and casue registers */ return (0); Added: projects/mips/sys/mips/mips/sys_machdep.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/mips/sys/mips/mips/sys_machdep.c Sat Jun 27 23:27:41 2009 (r195128) @@ -0,0 +1,77 @@ +/*- + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * from: @(#)sys_machdep.c 5.5 (Berkeley) 1/19/91 + */ + +#include <sys/cdefs.h> +__FBSDID("$FreeBSD$"); + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/proc.h> +#include <sys/sysproto.h> +#include <sys/syscall.h> +#include <sys/sysent.h> + +#include <machine/sysarch.h> + +#ifndef _SYS_SYSPROTO_H_ +struct sysarch_args { + int op; + char *parms; +}; +#endif + +int +sysarch(td, uap) + struct thread *td; + register struct sysarch_args *uap; +{ + int error; + void *tlsbase; + + switch (uap->op) { + case MIPS_SET_TLS : + td->td_md.md_tls = (void*)uap->parms; + error = 0; + break; + + case MIPS_GET_TLS : + tlsbase = td->td_md.md_tls; + error = copyout(&tlsbase, uap->parms, sizeof(tlsbase)); + break; + default: + error = EINVAL; + } + return (error); +} Modified: projects/mips/sys/mips/mips/vm_machdep.c ============================================================================== --- projects/mips/sys/mips/mips/vm_machdep.c Sat Jun 27 23:01:35 2009 (r195127) +++ projects/mips/sys/mips/mips/vm_machdep.c Sat Jun 27 23:27:41 2009 (r195128) @@ -156,6 +156,7 @@ cpu_fork(register struct thread *td1,reg * that are needed. */ + td2->td_md.md_tls = td1->td_md.md_tls; td2->td_md.md_saved_intr = MIPS_SR_INT_IE; td2->td_md.md_spinlock_count = 1; #ifdef TARGET_OCTEON @@ -535,7 +536,7 @@ int cpu_set_user_tls(struct thread *td, void *tls_base) { - /* TBD */ + td->td_md.md_tls = tls_base; return (0); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200906272327.n5RNRfOe091416>