aboutsummaryrefslogtreecommitdiff
path: root/linux-user
diff options
context:
space:
mode:
authorAlex Bennée <alex.bennee@linaro.org>2019-12-17 15:08:57 +0000
committerAlex Bennée <alex.bennee@linaro.org>2020-01-09 11:41:29 +0000
commit4ff5ef9e911c670ca10cdd36dd27c5395ec2c753 (patch)
tree5abc54db219c91ed383e48bbfaad767b8628b1e9 /linux-user
parentb906acbb3aceed5b1eca30d9d365d5bd7431400b (diff)
downloadqemu-4ff5ef9e911c670ca10cdd36dd27c5395ec2c753.zip
qemu-4ff5ef9e911c670ca10cdd36dd27c5395ec2c753.tar.gz
qemu-4ff5ef9e911c670ca10cdd36dd27c5395ec2c753.tar.bz2
target/arm: only update pc after semihosting completes
Before we introduce blocking semihosting calls we need to ensure we can restart the system on semi hosting exception. To be able to do this the EXCP_SEMIHOST operation should be idempotent until it finally completes. Practically this means ensureing we only update the pc after the semihosting call has completed. Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Keith Packard <keithp@keithp.com> Tested-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'linux-user')
-rw-r--r--linux-user/aarch64/cpu_loop.c1
-rw-r--r--linux-user/arm/cpu_loop.c1
2 files changed, 2 insertions, 0 deletions
diff --git a/linux-user/aarch64/cpu_loop.c b/linux-user/aarch64/cpu_loop.c
index 31c845a..bbe9fef 100644
--- a/linux-user/aarch64/cpu_loop.c
+++ b/linux-user/aarch64/cpu_loop.c
@@ -130,6 +130,7 @@ void cpu_loop(CPUARMState *env)
break;
case EXCP_SEMIHOST:
env->xregs[0] = do_arm_semihosting(env);
+ env->pc += 4;
break;
case EXCP_YIELD:
/* nothing to do here for user-mode, just resume guest code */
diff --git a/linux-user/arm/cpu_loop.c b/linux-user/arm/cpu_loop.c
index 7be4071..1fae90c 100644
--- a/linux-user/arm/cpu_loop.c
+++ b/linux-user/arm/cpu_loop.c
@@ -377,6 +377,7 @@ void cpu_loop(CPUARMState *env)
break;
case EXCP_SEMIHOST:
env->regs[0] = do_arm_semihosting(env);
+ env->regs[15] += env->thumb ? 2 : 4;
break;
case EXCP_INTERRUPT:
/* just indicate that signals should be handled asap */