[MIPS] Enable support for the userlocal hardware register
Which will cut down the cost of RDHWR $29 which is used to obtain the TLS pointer and so far being emulated in software down to a single cycle operation. Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
This commit is contained in:
parent
d223a86154
commit
a36920200c
7 changed files with 24 additions and 5 deletions
|
@ -588,6 +588,8 @@ static inline unsigned int decode_config3(struct cpuinfo_mips *c)
|
||||||
c->options |= MIPS_CPU_VEIC;
|
c->options |= MIPS_CPU_VEIC;
|
||||||
if (config3 & MIPS_CONF3_MT)
|
if (config3 & MIPS_CONF3_MT)
|
||||||
c->ases |= MIPS_ASE_MIPSMT;
|
c->ases |= MIPS_ASE_MIPSMT;
|
||||||
|
if (config3 & MIPS_CONF3_ULRI)
|
||||||
|
c->options |= MIPS_CPU_ULRI;
|
||||||
|
|
||||||
return config3 & MIPS_CONF_M;
|
return config3 & MIPS_CONF_M;
|
||||||
}
|
}
|
||||||
|
|
|
@ -272,9 +272,8 @@ asmlinkage int sys_set_thread_area(unsigned long addr)
|
||||||
struct thread_info *ti = task_thread_info(current);
|
struct thread_info *ti = task_thread_info(current);
|
||||||
|
|
||||||
ti->tp_value = addr;
|
ti->tp_value = addr;
|
||||||
|
if (cpu_has_userlocal)
|
||||||
/* If some future MIPS implementation has this register in hardware,
|
write_c0_userlocal(addr);
|
||||||
* we will need to update it here (and in context switches). */
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1341,7 +1341,14 @@ void __init per_cpu_trap_init(void)
|
||||||
set_c0_status(ST0_MX);
|
set_c0_status(ST0_MX);
|
||||||
|
|
||||||
#ifdef CONFIG_CPU_MIPSR2
|
#ifdef CONFIG_CPU_MIPSR2
|
||||||
write_c0_hwrena (0x0000000f); /* Allow rdhwr to all registers */
|
if (cpu_has_mips_r2) {
|
||||||
|
unsigned int enable = 0x0000000f;
|
||||||
|
|
||||||
|
if (cpu_has_userlocal)
|
||||||
|
enable |= (1 << 29);
|
||||||
|
|
||||||
|
write_c0_hwrena(enable);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_MIPS_MT_SMTC
|
#ifdef CONFIG_MIPS_MT_SMTC
|
||||||
|
|
|
@ -150,6 +150,10 @@
|
||||||
#define cpu_has_mipsmt (cpu_data[0].ases & MIPS_ASE_MIPSMT)
|
#define cpu_has_mipsmt (cpu_data[0].ases & MIPS_ASE_MIPSMT)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef cpu_has_userlocal
|
||||||
|
#define cpu_has_userlocal (cpu_data[0].options & MIPS_CPU_ULRI)
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_32BIT
|
#ifdef CONFIG_32BIT
|
||||||
# ifndef cpu_has_nofpuex
|
# ifndef cpu_has_nofpuex
|
||||||
# define cpu_has_nofpuex (cpu_data[0].options & MIPS_CPU_NOFPUEX)
|
# define cpu_has_nofpuex (cpu_data[0].options & MIPS_CPU_NOFPUEX)
|
||||||
|
|
|
@ -257,6 +257,7 @@
|
||||||
#define MIPS_CPU_PREFETCH 0x00080000 /* CPU has usable prefetch */
|
#define MIPS_CPU_PREFETCH 0x00080000 /* CPU has usable prefetch */
|
||||||
#define MIPS_CPU_VINT 0x00100000 /* CPU supports MIPSR2 vectored interrupts */
|
#define MIPS_CPU_VINT 0x00100000 /* CPU supports MIPSR2 vectored interrupts */
|
||||||
#define MIPS_CPU_VEIC 0x00200000 /* CPU supports MIPSR2 external interrupt controller mode */
|
#define MIPS_CPU_VEIC 0x00200000 /* CPU supports MIPSR2 external interrupt controller mode */
|
||||||
|
#define MIPS_CPU_ULRI 0x00400000 /* CPU has ULRI feature */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* CPU ASE encodings
|
* CPU ASE encodings
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
* Copyright (C) 2000 Silicon Graphics, Inc.
|
* Copyright (C) 2000 Silicon Graphics, Inc.
|
||||||
* Modified for further R[236]000 support by Paul M. Antoine, 1996.
|
* Modified for further R[236]000 support by Paul M. Antoine, 1996.
|
||||||
* Kevin D. Kissell, kevink@mips.com and Carsten Langgaard, carstenl@mips.com
|
* Kevin D. Kissell, kevink@mips.com and Carsten Langgaard, carstenl@mips.com
|
||||||
* Copyright (C) 2000 MIPS Technologies, Inc. All rights reserved.
|
* Copyright (C) 2000, 07 MIPS Technologies, Inc.
|
||||||
* Copyright (C) 2003, 2004 Maciej W. Rozycki
|
* Copyright (C) 2003, 2004 Maciej W. Rozycki
|
||||||
*/
|
*/
|
||||||
#ifndef _ASM_MIPSREGS_H
|
#ifndef _ASM_MIPSREGS_H
|
||||||
|
@ -533,6 +533,7 @@
|
||||||
#define MIPS_CONF3_VEIC (_ULCAST_(1) << 6)
|
#define MIPS_CONF3_VEIC (_ULCAST_(1) << 6)
|
||||||
#define MIPS_CONF3_LPA (_ULCAST_(1) << 7)
|
#define MIPS_CONF3_LPA (_ULCAST_(1) << 7)
|
||||||
#define MIPS_CONF3_DSP (_ULCAST_(1) << 10)
|
#define MIPS_CONF3_DSP (_ULCAST_(1) << 10)
|
||||||
|
#define MIPS_CONF3_ULRI (_ULCAST_(1) << 13)
|
||||||
|
|
||||||
#define MIPS_CONF7_WII (_ULCAST_(1) << 31)
|
#define MIPS_CONF7_WII (_ULCAST_(1) << 31)
|
||||||
|
|
||||||
|
@ -772,6 +773,9 @@ do { \
|
||||||
#define read_c0_context() __read_ulong_c0_register($4, 0)
|
#define read_c0_context() __read_ulong_c0_register($4, 0)
|
||||||
#define write_c0_context(val) __write_ulong_c0_register($4, 0, val)
|
#define write_c0_context(val) __write_ulong_c0_register($4, 0, val)
|
||||||
|
|
||||||
|
#define read_c0_userlocal() __read_ulong_c0_register($4, 2)
|
||||||
|
#define write_c0_userlocal(val) __write_ulong_c0_register($4, 2, val)
|
||||||
|
|
||||||
#define read_c0_pagemask() __read_32bit_c0_register($5, 0)
|
#define read_c0_pagemask() __read_32bit_c0_register($5, 0)
|
||||||
#define write_c0_pagemask(val) __write_32bit_c0_register($5, 0, val)
|
#define write_c0_pagemask(val) __write_32bit_c0_register($5, 0, val)
|
||||||
|
|
||||||
|
|
|
@ -67,6 +67,8 @@ do { \
|
||||||
(last) = resume(prev, next, task_thread_info(next)); \
|
(last) = resume(prev, next, task_thread_info(next)); \
|
||||||
if (cpu_has_dsp) \
|
if (cpu_has_dsp) \
|
||||||
__restore_dsp(current); \
|
__restore_dsp(current); \
|
||||||
|
if (cpu_has_userlocal) \
|
||||||
|
write_c0_userlocal(task_thread_info(current)->tp_value);\
|
||||||
} while(0)
|
} while(0)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in a new issue