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 | 5912 | ((CPUMIPSState *) cpu_env)->tls_value = arg1; |
| 5913 | 5913 | ret = 0; |
| 5914 | 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 | 5923 | #elif defined(TARGET_I386) && defined(TARGET_ABI32) |
| 5916 | 5924 | ret = do_set_thread_area(cpu_env, arg1); |
| 5917 | 5925 | break; | ... | ... |
target-cris/cpu.h
| ... | ... | @@ -225,6 +225,11 @@ static inline void cpu_clone_regs(CPUState *env, target_ulong newsp) |
| 225 | 225 | } |
| 226 | 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 | 233 | /* Support function regs. */ |
| 229 | 234 | #define SFR_RW_GC_CFG 0][0 |
| 230 | 235 | #define SFR_RW_MM_CFG env->pregs[PR_SRS]][0 | ... | ... |
tests/cris/Makefile
| ... | ... | @@ -117,7 +117,7 @@ TESTCASES += check_mmap3.ctst |
| 117 | 117 | TESTCASES += check_sigalrm.ctst |
| 118 | 118 | TESTCASES += check_time1.ctst |
| 119 | 119 | TESTCASES += check_time2.ctst |
| 120 | - | |
| 120 | +TESTCASES += check_settls1.ctst | |
| 121 | 121 | |
| 122 | 122 | TESTCASES += check_gcctorture_pr28634-1.ctst |
| 123 | 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 | +} | ... | ... |