On 06/01/2018 02:30 AM, Richard Henderson wrote:
There was supposed to be a single point of return for do_syscall
so that tracing works properly. However, there are a few bugs
in that area. It is significantly simpler to simply split out
an inner function to enforce this.
Signed-off-by: Richard Henderson <richard.hender...@linaro.org>
---
linux-user/syscall.c | 89 +++++++++++++++++++++++++++-----------------
1 file changed, 54 insertions(+), 35 deletions(-)
@@ -7977,28 +7979,6 @@ abi_long do_syscall(void *cpu_env, int num, abi_long
arg1,
void *p;
char *fn;
-#if defined(DEBUG_ERESTARTSYS)
+abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
+ abi_long arg2, abi_long arg3, abi_long arg4,
+ abi_long arg5, abi_long arg6, abi_long arg7,
+ abi_long arg8)
+{
+ CPUState *cpu = ENV_GET_CPU(cpu_env);
+ abi_long ret;
+
+#if defined(DEBUG_ERESTARTSYS)
Code motion, but...
+ /* Debug-only code for exercising the syscall-restart code paths
+ * in the per-architecture cpu main loops: restart every syscall
+ * the guest makes once before letting it through.
+ */
+ {
+ static bool flag;
+ flag = !flag;
+ if (flag) {
+ return -TARGET_ERESTARTSYS;
+ }
+ }
+#endif
+#ifdef DEBUG
...it looks inconsistent to mix '#if defined()' with '#ifdef' in the
same function. Worth cleaning up while you do this refactoring?
--
Eric Blake, Principal Software Engineer
Red Hat, Inc. +1-919-301-3266
Virtualization: qemu.org | libvirt.org