Module Name: src
Committed By: matt
Date: Sat May 15 20:27:48 UTC 2010
Modified Files:
src/sys/arch/mips/include [matt-nb5-mips64]: mips_opcode.h proc.h
sysarch.h
src/sys/arch/mips/mips [matt-nb5-mips64]: mips_emul.c sys_machdep.c
Log Message:
Add kernel support for MIPS TLS. Use rdhwr rt, $29 as defined by the MIPS
TLS spec so that Linux MIPS binaries will work. Use sysarch(MIPS_TINFOSET, v)
to set the pointer.
To generate a diff of this commit:
cvs rdiff -u -r1.12 -r1.12.96.1 src/sys/arch/mips/include/mips_opcode.h
cvs rdiff -u -r1.21.36.7 -r1.21.36.8 src/sys/arch/mips/include/proc.h
cvs rdiff -u -r1.8 -r1.8.96.1 src/sys/arch/mips/include/sysarch.h
cvs rdiff -u -r1.14.78.9 -r1.14.78.10 src/sys/arch/mips/mips/mips_emul.c
cvs rdiff -u -r1.33 -r1.33.28.1 src/sys/arch/mips/mips/sys_machdep.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/mips/include/mips_opcode.h
diff -u src/sys/arch/mips/include/mips_opcode.h:1.12 src/sys/arch/mips/include/mips_opcode.h:1.12.96.1
--- src/sys/arch/mips/include/mips_opcode.h:1.12 Sun Dec 11 12:18:09 2005
+++ src/sys/arch/mips/include/mips_opcode.h Sat May 15 20:27:48 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: mips_opcode.h,v 1.12 2005/12/11 12:18:09 christos Exp $ */
+/* $NetBSD: mips_opcode.h,v 1.12.96.1 2010/05/15 20:27:48 matt Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -117,7 +117,7 @@
#define OP_SPECIAL 000
#define OP_BCOND 001
#define OP_J 002
-#define OP_JAL 003
+#define OP_JAL 003
#define OP_BEQ 004
#define OP_BNE 005
#define OP_BLEZ 006
@@ -147,6 +147,7 @@
#define OP_LDR 033 /* MIPS-II, for r4000 port */
#define OP_SPECIAL2 034 /* QED opcodes */
+#define OP_SPECIAL3 037 /* QED opcodes */
#define OP_LB 040
#define OP_LH 041
@@ -255,6 +256,18 @@
#define OP_MAD 000 /* QED */
#define OP_MADU 001 /* QED */
#define OP_MUL 002 /* QED */
+#define OP_MSUB 004 /* MIPS32/64 */
+#define OP_MSUBU 005 /* MIPS32/64 */
+#define OP_CLZ 040 /* MIPS32/64 */
+#define OP_CLO 041 /* MIPS32/64 */
+#define OP_DCLZ 044 /* MIPS32/64 */
+#define OP_DCLO 045 /* MIPS32/64 */
+
+/*
+ * Values for the 'func' field when 'op' == OP_SPECIAL3.
+ */
+#define OP_RDHWR 073 /* MIPS32/64 r2 */
+
/*
* Values for the 'func' field when 'op' == OP_BCOND.
Index: src/sys/arch/mips/include/proc.h
diff -u src/sys/arch/mips/include/proc.h:1.21.36.7 src/sys/arch/mips/include/proc.h:1.21.36.8
--- src/sys/arch/mips/include/proc.h:1.21.36.7 Thu Mar 11 08:12:37 2010
+++ src/sys/arch/mips/include/proc.h Sat May 15 20:27:48 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: proc.h,v 1.21.36.7 2010/03/11 08:12:37 matt Exp $ */
+/* $NetBSD: proc.h,v 1.21.36.8 2010/05/15 20:27:48 matt Exp $ */
/*
* Copyright (c) 1992, 1993
@@ -57,6 +57,7 @@
vaddr_t md_ss_addr; /* single step address for ptrace */
int md_ss_instr; /* single step instruction for ptrace */
volatile u_int md_astpending; /* AST pending on return to userland */
+ register_t md_tinfo; /* thread info (TLS) */
};
struct mdproc {
Index: src/sys/arch/mips/include/sysarch.h
diff -u src/sys/arch/mips/include/sysarch.h:1.8 src/sys/arch/mips/include/sysarch.h:1.8.96.1
--- src/sys/arch/mips/include/sysarch.h:1.8 Sun Dec 11 12:18:09 2005
+++ src/sys/arch/mips/include/sysarch.h Sat May 15 20:27:48 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: sysarch.h,v 1.8 2005/12/11 12:18:09 christos Exp $ */
+/* $NetBSD: sysarch.h,v 1.8.96.1 2010/05/15 20:27:48 matt Exp $ */
#ifndef _MIPS_SYSARCH_H_
#define _MIPS_SYSARCH_H_
@@ -8,6 +8,7 @@
*/
#define MIPS_CACHEFLUSH 0
#define MIPS_CACHECTL 1
+#define MIPS_TINFOSET 2
struct mips_cacheflush_args {
vaddr_t va;
Index: src/sys/arch/mips/mips/mips_emul.c
diff -u src/sys/arch/mips/mips/mips_emul.c:1.14.78.9 src/sys/arch/mips/mips/mips_emul.c:1.14.78.10
--- src/sys/arch/mips/mips/mips_emul.c:1.14.78.9 Mon Feb 1 04:16:19 2010
+++ src/sys/arch/mips/mips/mips_emul.c Sat May 15 20:27:48 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: mips_emul.c,v 1.14.78.9 2010/02/01 04:16:19 matt Exp $ */
+/* $NetBSD: mips_emul.c,v 1.14.78.10 2010/05/15 20:27:48 matt Exp $ */
/*
* Copyright (c) 1999 Shuichiro URATA. All rights reserved.
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mips_emul.c,v 1.14.78.9 2010/02/01 04:16:19 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mips_emul.c,v 1.14.78.10 2010/05/15 20:27:48 matt Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -57,6 +57,7 @@
void MachEmulateLWC0(uint32_t, struct trapframe *, uint32_t);
void MachEmulateSWC0(uint32_t, struct trapframe *, uint32_t);
void MachEmulateSpecial(uint32_t, struct trapframe *, uint32_t);
+void MachEmulateSpecial3(uint32_t, struct trapframe *, uint32_t);
void MachEmulateLWC1(uint32_t, struct trapframe *, uint32_t);
void MachEmulateLDC1(uint32_t, struct trapframe *, uint32_t);
void MachEmulateSWC1(uint32_t, struct trapframe *, uint32_t);
@@ -243,6 +244,9 @@
case OP_SPECIAL:
MachEmulateSpecial(inst, tf, cause);
break;
+ case OP_SPECIAL3:
+ MachEmulateSpecial3(inst, tf, cause);
+ break;
case OP_COP1:
#if defined(FPEMUL)
MachEmulateFP(inst, &tf->tf_registers, cause);
@@ -414,9 +418,37 @@
tf->tf_regs[_R_CAUSE] = cause;
tf->tf_regs[_R_BADVADDR] = tf->tf_regs[_R_PC];
KSI_INIT_TRAP(&ksi);
- ksi.ksi_signo = SIGSEGV;
+ ksi.ksi_signo = SIGILL;
+ ksi.ksi_trap = cause;
+ ksi.ksi_code = ILL_ILLOPC;
+ ksi.ksi_addr = (void *)(intptr_t)tf->tf_regs[_R_PC];
+ (*curproc->p_emul->e_trapsignal)(curlwp, &ksi);
+ break;
+ }
+
+ update_pc(tf, cause);
+}
+
+void
+MachEmulateSpecial3(uint32_t inst, struct trapframe *tf, uint32_t cause)
+{
+ ksiginfo_t ksi;
+ switch (((InstFmt)inst).RType.func) {
+ case OP_RDHWR:
+ switch (((InstFmt)inst).RType.rd) {
+ case 29:
+ tf->tf_regs[((InstFmt)inst).RType.rt] =
+ curlwp->l_md.md_tinfo;
+ break;
+ }
+ /* FALLTHROUGH */
+ default:
+ tf->tf_regs[_R_CAUSE] = cause;
+ tf->tf_regs[_R_BADVADDR] = tf->tf_regs[_R_PC];
+ KSI_INIT_TRAP(&ksi);
+ ksi.ksi_signo = SIGILL;
ksi.ksi_trap = cause;
- ksi.ksi_code = SEGV_MAPERR;
+ ksi.ksi_code = ILL_ILLOPC;
ksi.ksi_addr = (void *)(intptr_t)tf->tf_regs[_R_PC];
(*curproc->p_emul->e_trapsignal)(curlwp, &ksi);
break;
Index: src/sys/arch/mips/mips/sys_machdep.c
diff -u src/sys/arch/mips/mips/sys_machdep.c:1.33 src/sys/arch/mips/mips/sys_machdep.c:1.33.28.1
--- src/sys/arch/mips/mips/sys_machdep.c:1.33 Thu Dec 20 23:02:41 2007
+++ src/sys/arch/mips/mips/sys_machdep.c Sat May 15 20:27:48 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: sys_machdep.c,v 1.33 2007/12/20 23:02:41 dsl Exp $ */
+/* $NetBSD: sys_machdep.c,v 1.33.28.1 2010/05/15 20:27:48 matt Exp $ */
/*
* Copyright (c) 1992, 1993
@@ -35,7 +35,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sys_machdep.c,v 1.33 2007/12/20 23:02:41 dsl Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sys_machdep.c,v 1.33.28.1 2010/05/15 20:27:48 matt Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -86,6 +86,10 @@
error = mips_user_cachectl(p, ccua.va, ccua.nbytes, ccua.ctl);
break;
}
+ case MIPS_TINFOSET: {
+ curlwp->l_md.md_tinfo = (intptr_t)SCARG(uap, parms);
+ break;
+ }
default:
error = ENOSYS;
break;