Commit f55761a0c46583f4faf1d7595f4f41b35b15508b
1 parent
eca1bdf4
x86: Issue reset on triple faults (Jan Kiszka)
As discussed a few times on this list: A triple fault causes a system reset on x86, and some guests make use of this (e.g. 386BSD). To keep the chance of tracing unexpected resets, log them if CPU_LOG_RESET is set. Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6453 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
15 additions
and
2 deletions
target-i386/op_helper.c
@@ -1251,6 +1251,9 @@ void do_interrupt(int intno, int is_int, int error_code, | @@ -1251,6 +1251,9 @@ void do_interrupt(int intno, int is_int, int error_code, | ||
1251 | } | 1251 | } |
1252 | } | 1252 | } |
1253 | 1253 | ||
1254 | +/* This should come from sysemu.h - if we could include it here... */ | ||
1255 | +void qemu_system_reset_request(void); | ||
1256 | + | ||
1254 | /* | 1257 | /* |
1255 | * Check nested exceptions and change to double or triple fault if | 1258 | * Check nested exceptions and change to double or triple fault if |
1256 | * needed. It should only be called, if this is not an interrupt. | 1259 | * needed. It should only be called, if this is not an interrupt. |
@@ -1267,8 +1270,18 @@ static int check_exception(int intno, int *error_code) | @@ -1267,8 +1270,18 @@ static int check_exception(int intno, int *error_code) | ||
1267 | qemu_log_mask(CPU_LOG_INT, "check_exception old: 0x%x new 0x%x\n", | 1270 | qemu_log_mask(CPU_LOG_INT, "check_exception old: 0x%x new 0x%x\n", |
1268 | env->old_exception, intno); | 1271 | env->old_exception, intno); |
1269 | 1272 | ||
1270 | - if (env->old_exception == EXCP08_DBLE) | ||
1271 | - cpu_abort(env, "triple fault"); | 1273 | +#if !defined(CONFIG_USER_ONLY) |
1274 | + if (env->old_exception == EXCP08_DBLE) { | ||
1275 | + if (env->hflags & HF_SVMI_MASK) | ||
1276 | + helper_vmexit(SVM_EXIT_SHUTDOWN, 0); /* does not return */ | ||
1277 | + | ||
1278 | + if (loglevel & CPU_LOG_RESET) | ||
1279 | + fprintf(logfile, "Triple fault\n"); | ||
1280 | + | ||
1281 | + qemu_system_reset_request(); | ||
1282 | + return EXCP_HLT; | ||
1283 | + } | ||
1284 | +#endif | ||
1272 | 1285 | ||
1273 | if ((first_contributory && second_contributory) | 1286 | if ((first_contributory && second_contributory) |
1274 | || (env->old_exception == EXCP0E_PAGE && | 1287 | || (env->old_exception == EXCP0E_PAGE && |