On 9. Feb 2012, at 22:17 , Oleksandr Tymoshenko wrote: > Author: gonzo > Date: Thu Feb 9 22:17:13 2012 > New Revision: 231312 > URL: http://svn.freebsd.org/changeset/base/231312 > > Log: > - Emulate RDHWR instruction for TLS support > > Reading register $29 with RDHWR is becoming the de-facto standard to > implement TLS. According to linux-mips wiki, MIPS Technologies has > reserved hardware register $29 for ABI use. Furthermore current GCC > makes the following assumptions: > - RDHWR is natively available or otherwise emulated by the kernel > - Register $29 holds the TLS pointer > > Submitted by: Robert Millan <r...@debian.org>
mips XLPN32 kernel failed, check _.mips.XLPN32 for details mips XLRN32 kernel failed, check _.mips.XLRN32 for details /scratch/tmp/bz/head.svn/sys/mips/mips/trap.c: In function 'trap': /scratch/tmp/bz/head.svn/sys/mips/mips/trap.c:768: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] /scratch/tmp/bz/head.svn/sys/mips/mips/trap.c:776: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] > > Modified: > head/sys/mips/include/mips_opcode.h > head/sys/mips/mips/trap.c > > Modified: head/sys/mips/include/mips_opcode.h > ============================================================================== > --- head/sys/mips/include/mips_opcode.h Thu Feb 9 22:13:20 2012 > (r231311) > +++ head/sys/mips/include/mips_opcode.h Thu Feb 9 22:17:13 2012 > (r231312) > @@ -176,6 +176,11 @@ typedef union { > #define OP_LDL 032 > #define OP_LDR 033 > > +#define OP_SPECIAL2 034 > +#define OP_JALX 035 > + > +#define OP_SPECIAL3 037 > + > #define OP_LB 040 > #define OP_LH 041 > #define OP_LWL 042 > @@ -389,6 +394,11 @@ typedef union { > #define OP_R_BGEZALL OP_BGEZALL > > /* > + * Values for the 'func' field when 'op' == OP_SPECIAL3. > + */ > +#define OP_RDHWR 073 > + > +/* > * Values for the 'rs' field when 'op' == OP_COPz. > */ > #define OP_MF 000 > > Modified: head/sys/mips/mips/trap.c > ============================================================================== > --- head/sys/mips/mips/trap.c Thu Feb 9 22:13:20 2012 (r231311) > +++ head/sys/mips/mips/trap.c Thu Feb 9 22:17:13 2012 (r231312) > @@ -414,6 +414,7 @@ trap(struct trapframe *trapframe) > intptr_t addr = 0; > register_t pc; > int cop; > + register_t *frame_regs; > > trapdebug_enter(trapframe, 0); > > @@ -762,9 +763,29 @@ dofault: > } > > case T_RES_INST + T_USER: > - log_illegal_instruction("RES_INST", trapframe); > - i = SIGILL; > - addr = trapframe->pc; > + { > + InstFmt inst; > + inst = *(InstFmt *)trapframe->pc; > + switch (inst.RType.op) { > + case OP_SPECIAL3: > + switch (inst.RType.func) { > + case OP_RDHWR: > + /* Register 29 used for TLS */ > + if (inst.RType.rd == 29) { > + frame_regs = &(trapframe->zero); > + frame_regs[inst.RType.rt] = > (register_t)td->td_md.md_tls; > + trapframe->pc += sizeof(int); > + goto out; > + } > + break; > + } > + break; > + } > + > + log_illegal_instruction("RES_INST", trapframe); > + i = SIGILL; > + addr = trapframe->pc; > + } > break; > case T_C2E: > case T_C2E + T_USER: -- Bjoern A. Zeeb You have to have visions! It does not matter how good you are. It matters what good you do! _______________________________________________ svn-src-all@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/svn-src-all To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"