aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoraurel32 <aurel32@c046a42c-6fe2-441c-8c8c-71466251a162>2008-09-15 07:43:43 +0000
committeraurel32 <aurel32@c046a42c-6fe2-441c-8c8c-71466251a162>2008-09-15 07:43:43 +0000
commit0b6d3ae0723ba226cf07c549a948d4680fb7923b (patch)
treedb0aa91f8a589bbd69aaecdd951a357daaf591cd
parent7478757e1f6745803edb9aedb6571ad9b4197a38 (diff)
qemu sh4 nptl support
(Michael Trimarchi) git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5223 c046a42c-6fe2-441c-8c8c-71466251a162
-rwxr-xr-xconfigure1
-rw-r--r--linux-user/main.c2
-rw-r--r--linux-user/syscall.c5
-rw-r--r--target-sh4/cpu.h5
4 files changed, 12 insertions, 1 deletions
diff --git a/configure b/configure
index d77f9b8f60..df756dbf13 100755
--- a/configure
+++ b/configure
@@ -1437,6 +1437,7 @@ case "$target_cpu" in
echo "#define TARGET_ARCH \"sh4\"" >> $config_h
echo "#define TARGET_SH4 1" >> $config_h
bflt="yes"
+ target_nptl="yes"
;;
sparc)
echo "TARGET_ARCH=sparc" >> $config_mak
diff --git a/linux-user/main.c b/linux-user/main.c
index 4bf739e4eb..c32cd75e77 100644
--- a/linux-user/main.c
+++ b/linux-user/main.c
@@ -1887,6 +1887,7 @@ void cpu_loop (CPUState *env)
switch (trapnr) {
case 0x160:
+ env->pc += 2;
ret = do_syscall(env,
env->gregs[3],
env->gregs[4],
@@ -1896,7 +1897,6 @@ void cpu_loop (CPUState *env)
env->gregs[0],
env->gregs[1]);
env->gregs[0] = ret;
- env->pc += 2;
break;
case EXCP_INTERRUPT:
/* just indicate that signals should be handled asap */
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index eba2c02ad7..56b413857e 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -53,6 +53,7 @@
//#include <sys/user.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>
+#include <qemu-common.h>
#define termios host_termios
#define winsize host_winsize
@@ -4662,7 +4663,11 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
ret = get_errno(fsync(arg1));
break;
case TARGET_NR_clone:
+#if defined(TARGET_SH4)
+ ret = get_errno(do_fork(cpu_env, arg1, arg2, arg3, arg5, arg4));
+#else
ret = get_errno(do_fork(cpu_env, arg1, arg2, arg3, arg4, arg5));
+#endif
break;
#ifdef __NR_exit_group
/* new thread calls */
diff --git a/target-sh4/cpu.h b/target-sh4/cpu.h
index 686b6684d2..2f42e6015d 100644
--- a/target-sh4/cpu.h
+++ b/target-sh4/cpu.h
@@ -141,6 +141,11 @@ void sh4_cpu_list(FILE *f, int (*cpu_fprintf)(FILE *f, const char *fmt, ...));
void cpu_sh4_write_mmaped_utlb_addr(CPUSH4State *s, target_phys_addr_t addr,
uint32_t mem_value);
+static inline void cpu_set_tls(CPUSH4State *env, target_ulong newtls)
+{
+ env->gbr = newtls;
+}
+
#include "softfloat.h"
#define CPUState CPUSH4State