diff options
Diffstat (limited to 'meta/packages/qemu/qemu-0.9.1/qemu-0.9.0-nptl-update.patch')
-rw-r--r-- | meta/packages/qemu/qemu-0.9.1/qemu-0.9.0-nptl-update.patch | 219 |
1 files changed, 0 insertions, 219 deletions
diff --git a/meta/packages/qemu/qemu-0.9.1/qemu-0.9.0-nptl-update.patch b/meta/packages/qemu/qemu-0.9.1/qemu-0.9.0-nptl-update.patch deleted file mode 100644 index ebc996e873..0000000000 --- a/meta/packages/qemu/qemu-0.9.1/qemu-0.9.0-nptl-update.patch +++ /dev/null | |||
@@ -1,219 +0,0 @@ | |||
1 | --- | ||
2 | linux-user/main.c | 7 ++- | ||
3 | linux-user/syscall.c | 114 ++++++++++++++++++++++++++++++++++++++++++++++----- | ||
4 | 2 files changed, 111 insertions(+), 10 deletions(-) | ||
5 | |||
6 | Index: qemu/linux-user/main.c | ||
7 | =================================================================== | ||
8 | --- qemu.orig/linux-user/main.c 2007-12-03 19:34:09.000000000 +0000 | ||
9 | +++ qemu/linux-user/main.c 2007-12-03 23:44:45.000000000 +0000 | ||
10 | @@ -391,7 +391,7 @@ do_kernel_trap(CPUARMState *env) | ||
11 | cpu_unlock(); | ||
12 | break; | ||
13 | case 0xffff0fe0: /* __kernel_get_tls */ | ||
14 | - env->regs[0] = env->cp15.c13_tls; | ||
15 | + env->regs[0] = env->cp15.c13_tls2; | ||
16 | break; | ||
17 | default: | ||
18 | return 1; | ||
19 | @@ -2037,6 +2037,11 @@ int main(int argc, char **argv) | ||
20 | int drop_ld_preload = 0, environ_count = 0; | ||
21 | char **target_environ, **wrk, **dst; | ||
22 | |||
23 | + char *assume_kernel = getenv("QEMU_ASSUME_KERNEL"); | ||
24 | + | ||
25 | + if (assume_kernel) | ||
26 | + setenv("LD_ASSUME_KERNEL", assume_kernel, 1); | ||
27 | + | ||
28 | if (argc <= 1) | ||
29 | usage(); | ||
30 | |||
31 | Index: qemu/linux-user/syscall.c | ||
32 | =================================================================== | ||
33 | --- qemu.orig/linux-user/syscall.c 2007-12-03 19:34:09.000000000 +0000 | ||
34 | +++ qemu/linux-user/syscall.c 2007-12-03 23:46:54.000000000 +0000 | ||
35 | @@ -61,6 +61,7 @@ | ||
36 | #define tchars host_tchars /* same as target */ | ||
37 | #define ltchars host_ltchars /* same as target */ | ||
38 | |||
39 | +#include <linux/futex.h> | ||
40 | #include <linux/termios.h> | ||
41 | #include <linux/unistd.h> | ||
42 | #include <linux/utsname.h> | ||
43 | @@ -2694,7 +2695,6 @@ abi_long do_arch_prctl(CPUX86State *env, | ||
44 | return 0; | ||
45 | } | ||
46 | #endif | ||
47 | - | ||
48 | #endif /* defined(TARGET_I386) */ | ||
49 | |||
50 | /* this stack is the equivalent of the kernel stack associated with a | ||
51 | @@ -2729,16 +2729,19 @@ int do_fork(CPUState *env, unsigned int | ||
52 | TaskState *ts; | ||
53 | uint8_t *new_stack; | ||
54 | CPUState *new_env; | ||
55 | - | ||
56 | +#if defined(TARGET_I386) | ||
57 | + uint64_t *new_gdt_table; | ||
58 | +#endif | ||
59 | #ifdef USE_NPTL | ||
60 | unsigned int nptl_flags; | ||
61 | |||
62 | if (flags & CLONE_PARENT_SETTID) | ||
63 | *parent_tidptr = gettid(); | ||
64 | #endif | ||
65 | - | ||
66 | if (flags & CLONE_VM) { | ||
67 | ts = malloc(sizeof(TaskState) + NEW_STACK_SIZE); | ||
68 | + if (!ts) | ||
69 | + return -ENOMEM; | ||
70 | memset(ts, 0, sizeof(TaskState)); | ||
71 | new_stack = ts->stack; | ||
72 | ts->used = 1; | ||
73 | @@ -2750,6 +2753,29 @@ int do_fork(CPUState *env, unsigned int | ||
74 | #if defined(TARGET_I386) | ||
75 | if (!newsp) | ||
76 | newsp = env->regs[R_ESP]; | ||
77 | + new_gdt_table = malloc(9 * 8); | ||
78 | + if (!new_gdt_table) { | ||
79 | + free(new_env); | ||
80 | + return -ENOMEM; | ||
81 | + } | ||
82 | + /* Copy main GDT table from parent, but clear TLS entries */ | ||
83 | + memcpy(new_gdt_table, g2h(env->gdt.base), 6 * 8); | ||
84 | + memset(&new_gdt_table[6], 0, 3 * 8); | ||
85 | + new_env->gdt.base = h2g(new_gdt_table); | ||
86 | + if (flags & 0x00080000 /* CLONE_SETTLS */) { | ||
87 | + ret = do_set_thread_area(new_env, new_env->regs[R_ESI]); | ||
88 | + if (ret) { | ||
89 | + free(new_gdt_table); | ||
90 | + free(new_env); | ||
91 | + return ret; | ||
92 | + } | ||
93 | + } | ||
94 | + cpu_x86_load_seg(env, R_CS, new_env->regs[R_CS]); | ||
95 | + cpu_x86_load_seg(env, R_DS, new_env->regs[R_DS]); | ||
96 | + cpu_x86_load_seg(env, R_ES, new_env->regs[R_ES]); | ||
97 | + cpu_x86_load_seg(env, R_SS, new_env->regs[R_SS]); | ||
98 | + cpu_x86_load_seg(env, R_FS, new_env->regs[R_FS]); | ||
99 | + cpu_x86_load_seg(env, R_GS, new_env->regs[R_GS]); | ||
100 | new_env->regs[R_ESP] = newsp; | ||
101 | new_env->regs[R_EAX] = 0; | ||
102 | #elif defined(TARGET_ARM) | ||
103 | @@ -3121,6 +3147,68 @@ static inline abi_long host_to_target_ti | ||
104 | unlock_user_struct(target_ts, target_addr, 1); | ||
105 | } | ||
106 | |||
107 | +static long do_futex(target_ulong uaddr, int op, uint32_t val, | ||
108 | + target_ulong utime, target_ulong uaddr2, | ||
109 | + uint32_t val3) | ||
110 | +{ | ||
111 | + struct timespec host_utime; | ||
112 | + unsigned long val2 = utime; | ||
113 | + | ||
114 | + if (utime && (op == FUTEX_WAIT || op == FUTEX_LOCK_PI)) { | ||
115 | + target_to_host_timespec(&host_utime, utime); | ||
116 | + val2 = (unsigned long)&host_utime; | ||
117 | + } | ||
118 | + | ||
119 | +#ifdef BSWAP_NEEDED | ||
120 | + switch(op) { | ||
121 | + case FUTEX_CMP_REQUEUE: | ||
122 | + val3 = tswap32(val3); | ||
123 | + case FUTEX_REQUEUE: | ||
124 | + val2 = tswap32(val2); | ||
125 | + case FUTEX_WAIT: | ||
126 | + case FUTEX_WAKE: | ||
127 | + val = tswap32(val); | ||
128 | + case FUTEX_LOCK_PI: /* This one's icky, but comes out OK */ | ||
129 | + case FUTEX_UNLOCK_PI: | ||
130 | + break; | ||
131 | + default: | ||
132 | + gemu_log("qemu: Unsupported futex op %d\n", op); | ||
133 | + return -ENOSYS; | ||
134 | + } | ||
135 | +#if 0 /* No, it's worse than this */ | ||
136 | + if (op == FUTEX_WAKE_OP) { | ||
137 | + /* Need to munge the secondary operation (val3) */ | ||
138 | + val3 = tswap32(val3); | ||
139 | + int op2 = (val3 >> 28) & 7; | ||
140 | + int cmp = (val3 >> 24) & 15; | ||
141 | + int oparg = (val3 << 8) >> 20; | ||
142 | + int cmparg = (val3 << 20) >> 20; | ||
143 | + int shift = val3 & (FUTEX_OP_OPARG_SHIFT << 28); | ||
144 | + | ||
145 | + if (shift) | ||
146 | + oparg = (oparg & 7) + 24 - (oparg & 24); | ||
147 | + else oparg = | ||
148 | + if (op2 == FUTEX_OP_ADD) { | ||
149 | + gemu_log("qemu: Unsupported wrong-endian FUTEX_OP_ADD\n"); | ||
150 | + return -ENOSYS; | ||
151 | + } | ||
152 | + if (cmparg == FUTEX_OP_CMP_LT || cmparg == FUTEX_OP_CMP_GE || | ||
153 | + cmparg == FUTEX_OP_CMP_LE || cmparg == FUTEX_OP_CMP_GT) { | ||
154 | + gemu_log("qemu: Unsupported wrong-endian futex cmparg %d\n", cmparg); | ||
155 | + return -ENOSYS; | ||
156 | + } | ||
157 | + val3 = shift | (op2<<28) | (cmp<<24) | (oparg<<12) | cmparg; | ||
158 | + } | ||
159 | +#endif | ||
160 | +#endif | ||
161 | + return syscall(__NR_futex, g2h(uaddr), op, val, val2, g2h(uaddr2), val3); | ||
162 | +} | ||
163 | + | ||
164 | +int do_set_tid_address(target_ulong tidptr) | ||
165 | +{ | ||
166 | + return syscall(__NR_set_tid_address, g2h(tidptr)); | ||
167 | +} | ||
168 | + | ||
169 | /* do_syscall() should always have a single exit point at the end so | ||
170 | that actions, such as logging of syscall results, can be performed. | ||
171 | All errnos that do_syscall() returns must be -TARGET_<errcode>. */ | ||
172 | @@ -3145,7 +3233,7 @@ abi_long do_syscall(void *cpu_env, int n | ||
173 | _mcleanup(); | ||
174 | #endif | ||
175 | gdb_exit(cpu_env, arg1); | ||
176 | - /* XXX: should free thread stack and CPU env */ | ||
177 | + /* XXX: should free thread stack, GDT and CPU env */ | ||
178 | _exit(arg1); | ||
179 | ret = 0; /* avoid warning */ | ||
180 | break; | ||
181 | @@ -5569,6 +5657,9 @@ abi_long do_syscall(void *cpu_env, int n | ||
182 | #elif defined(TARGET_I386) && defined(TARGET_ABI32) | ||
183 | ret = do_set_thread_area(cpu_env, arg1); | ||
184 | break; | ||
185 | +#elif TARGET_i386 | ||
186 | + ret = get_errno(do_set_thread_area(cpu_env, arg1)); | ||
187 | + break; | ||
188 | #else | ||
189 | goto unimplemented_nowarn; | ||
190 | #endif | ||
191 | @@ -5586,6 +5677,16 @@ abi_long do_syscall(void *cpu_env, int n | ||
192 | goto unimplemented_nowarn; | ||
193 | #endif | ||
194 | |||
195 | +#ifdef TARGET_NR_futex | ||
196 | + case TARGET_NR_futex: | ||
197 | + ret = get_errno(do_futex(arg1, arg2, arg3, arg4, arg5, arg6)); | ||
198 | + break; | ||
199 | +#endif | ||
200 | +#ifdef TARGET_NR_set_robust_list | ||
201 | + case TARGET_NR_set_robust_list: | ||
202 | + goto unimplemented_nowarn; | ||
203 | +#endif | ||
204 | + | ||
205 | #ifdef TARGET_NR_clock_gettime | ||
206 | case TARGET_NR_clock_gettime: | ||
207 | { | ||
208 | @@ -5627,11 +5728,6 @@ abi_long do_syscall(void *cpu_env, int n | ||
209 | break; | ||
210 | #endif | ||
211 | |||
212 | -#ifdef TARGET_NR_set_robust_list | ||
213 | - case TARGET_NR_set_robust_list: | ||
214 | - goto unimplemented_nowarn; | ||
215 | -#endif | ||
216 | - | ||
217 | #if defined(TARGET_NR_utimensat) && defined(__NR_utimensat) | ||
218 | case TARGET_NR_utimensat: | ||
219 | { | ||