On 12.01.2009, at 17:05, Jan Kiszka <address@hidden> wrote:
Alexander Graf wrote:On 12.01.2009, at 13:14, Jan Kiszka <address@hidden> wrote:address@hidden wrote:This is a (slightly adjusted for 2009-01-04 SVN) resend of Jan Kiszka'sReboot CPU on triple fault patch (see patch file for the exact reference) It seems like a consensus was reached on how to deal with tripple faults, but noone commited the last version (8) of the patch anyways. Just for the record -- 386BSD relies on this behavior to reset the CPU --it unmaps the whole address space in order to trigger a tripple fault.Good that you picked this up! It is still on my to-do list to get thisGood that you picked this up! It is still on my to-do list to get thisin, but with medium prio. However, let's try to push it a bit.This is a slightly adjusted (for 2009-01-04 SVN) "reset on tripple fault patch" Originally from: Subject: [Qemu-devel] Re: [PATCH] x86: Reboot CPU on triple fault - Version 8 Message-ID: <address@hidden> Date: Tue, 27 May 2008 18:17:18 +0200 From: Jan Kiszka <address@hidden>Note that I posted an enhanced version on 2008-09-02, also covering reset logging for non-x86 archs. Please use that one. ...Index: target-i386/op_helper.c =================================================================== --- target-i386/op_helper.c (revision 6159) +++ target-i386/op_helper.c (working copy) @@ -1244,6 +1244,9 @@ } }+/* This should come from sysemu.h - if we could include it here... */+void qemu_system_reset_request(void); + /* * Check nested exceptions and change to double or triple fault if * needed. It should only be called, if this is not an interrupt. @@ -1261,9 +1264,19 @@ fprintf(logfile, "check_exception old: 0x%x new 0x%x\n", env->old_exception, intno); - if (env->old_exception == EXCP08_DBLE) - cpu_abort(env, "triple fault"); +#if !defined(CONFIG_USER_ONLY) + if (env->old_exception == EXCP08_DBLE) { + if (env->intercept) + helper_vmexit(SVM_EXIT_SHUTDOWN, 0); + if (loglevel & CPU_LOG_RESET) + fprintf(logfile, "Triple fault\n"); + + qemu_system_reset_request(); + return EXCP_HLT; + } +#endif + if ((first_contributory && second_contributory) || (env->old_exception == EXCP0E_PAGE && (second_contributory || (intno == EXCP0E_PAGE)))) {I meanwhile think that SVM hook should rather look like this helper_svm_check_intercept_param(SVM_EXIT_SHUTDOWN, 0);in order to properly check if shutdown events are actually intercepted.Alexander, am I right?Yes, sounds right. Any reason not to put the intercept in reset_request?Yes, sounds right. Any reason not to put the intercept in reset_request?(asking blindly, I don't have access to the qemu source right now)You mean qemu_system_reset_request? That's generic code while the hook is x86-specific.
Sounds like the right place then. :-) Alex
Jan -- Siemens AG, Corporate Technology, CT SE 26 Corporate Competence Center Embedded Linux