Commit ef96779bc3df7f4fe228fb9a5c7ecb81a04b2644
1 parent
35ef81d6
CRIS: Implement set_thread_area for CRIS.
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@gmail.com> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6210 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
4 changed files
with
53 additions
and
1 deletions
linux-user/syscall.c
@@ -5912,6 +5912,14 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, | @@ -5912,6 +5912,14 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, | ||
5912 | ((CPUMIPSState *) cpu_env)->tls_value = arg1; | 5912 | ((CPUMIPSState *) cpu_env)->tls_value = arg1; |
5913 | ret = 0; | 5913 | ret = 0; |
5914 | break; | 5914 | break; |
5915 | +#elif defined(TARGET_CRIS) | ||
5916 | + if (arg1 & 0xff) | ||
5917 | + ret = -TARGET_EINVAL; | ||
5918 | + else { | ||
5919 | + ((CPUCRISState *) cpu_env)->pregs[PR_PID] = arg1; | ||
5920 | + ret = 0; | ||
5921 | + } | ||
5922 | + break; | ||
5915 | #elif defined(TARGET_I386) && defined(TARGET_ABI32) | 5923 | #elif defined(TARGET_I386) && defined(TARGET_ABI32) |
5916 | ret = do_set_thread_area(cpu_env, arg1); | 5924 | ret = do_set_thread_area(cpu_env, arg1); |
5917 | break; | 5925 | break; |
target-cris/cpu.h
@@ -225,6 +225,11 @@ static inline void cpu_clone_regs(CPUState *env, target_ulong newsp) | @@ -225,6 +225,11 @@ static inline void cpu_clone_regs(CPUState *env, target_ulong newsp) | ||
225 | } | 225 | } |
226 | #endif | 226 | #endif |
227 | 227 | ||
228 | +static inline void cpu_set_tls(CPUCRISState *env, target_ulong newtls) | ||
229 | +{ | ||
230 | + env->pregs[PR_PID] = (env->pregs[PR_PID] & 0xff) | newtls; | ||
231 | +} | ||
232 | + | ||
228 | /* Support function regs. */ | 233 | /* Support function regs. */ |
229 | #define SFR_RW_GC_CFG 0][0 | 234 | #define SFR_RW_GC_CFG 0][0 |
230 | #define SFR_RW_MM_CFG env->pregs[PR_SRS]][0 | 235 | #define SFR_RW_MM_CFG env->pregs[PR_SRS]][0 |
tests/cris/Makefile
@@ -117,7 +117,7 @@ TESTCASES += check_mmap3.ctst | @@ -117,7 +117,7 @@ TESTCASES += check_mmap3.ctst | ||
117 | TESTCASES += check_sigalrm.ctst | 117 | TESTCASES += check_sigalrm.ctst |
118 | TESTCASES += check_time1.ctst | 118 | TESTCASES += check_time1.ctst |
119 | TESTCASES += check_time2.ctst | 119 | TESTCASES += check_time2.ctst |
120 | - | 120 | +TESTCASES += check_settls1.ctst |
121 | 121 | ||
122 | TESTCASES += check_gcctorture_pr28634-1.ctst | 122 | TESTCASES += check_gcctorture_pr28634-1.ctst |
123 | #TESTCASES += check_gcctorture_pr28634.ctst | 123 | #TESTCASES += check_gcctorture_pr28634.ctst |
tests/cris/check_settls1.c
0 → 100644
1 | +#include <stdio.h> | ||
2 | +#include <stdlib.h> | ||
3 | +#include <errno.h> | ||
4 | +#include <unistd.h> | ||
5 | + | ||
6 | +#include <sys/syscall.h> | ||
7 | + | ||
8 | +#ifndef SYS_set_thread_area | ||
9 | +#define SYS_set_thread_area 243 | ||
10 | +#endif | ||
11 | + | ||
12 | +int main (void) | ||
13 | +{ | ||
14 | + unsigned long tp; | ||
15 | + int ret; | ||
16 | + | ||
17 | + ret = syscall (SYS_set_thread_area, 0xf0); | ||
18 | + if (ret != -1 || errno != EINVAL) { | ||
19 | + perror ("Invalid thread area accepted:"); | ||
20 | + abort(); | ||
21 | + } | ||
22 | + | ||
23 | + ret = syscall (SYS_set_thread_area, 0xeddeed00); | ||
24 | + if (ret != 0) { | ||
25 | + perror ("Valid thread area not accepted: "); | ||
26 | + abort (); | ||
27 | + } | ||
28 | + | ||
29 | + asm ("move $pid,%0" : "=r" (tp)); | ||
30 | + tp &= ~0xff; | ||
31 | + | ||
32 | + if (tp != 0xeddeed00) { | ||
33 | + perror ("tls2"); | ||
34 | + abort (); | ||
35 | + } | ||
36 | + | ||
37 | + printf ("pass\n"); | ||
38 | + return EXIT_SUCCESS; | ||
39 | +} |