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 | 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 | 1258 | * Check nested exceptions and change to double or triple fault if |
1256 | 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 | 1270 | qemu_log_mask(CPU_LOG_INT, "check_exception old: 0x%x new 0x%x\n", |
1268 | 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 | 1286 | if ((first_contributory && second_contributory) |
1274 | 1287 | || (env->old_exception == EXCP0E_PAGE && | ... | ... |