svn commit: r231312 - in head/sys/mips: include mips

Bjoern A. Zeeb bzeeb-lists at lists.zabbadoz.net
Thu Feb 9 22:33:31 UTC 2012


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 <rmh at 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!



More information about the svn-src-all mailing list