* [Qemu-devel] [PATCH] Resend: x86: Reboot CPU on triple fault
@ 2009-01-04 15:45 lkundrak
2009-01-12 12:14 ` [Qemu-devel] " Jan Kiszka
0 siblings, 1 reply; 5+ messages in thread
From: lkundrak @ 2009-01-04 15:45 UTC (permalink / raw)
To: qemu-devel; +Cc: Jan Kiszka
[-- Attachment #1: Type: text/plain, Size: 435 bytes --]
This is a (slightly adjusted for 2009-01-04 SVN) resend of Jan Kiszka's
Reboot 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.
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: qemu-0.9.2-triplefault.patch --]
[-- Type: text/x-patch; name="qemu-0.9.2-triplefault.patch", Size: 2838 bytes --]
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: <483C340E.1030207@siemens.com>
Date: Tue, 27 May 2008 18:17:18 +0200
From: Jan Kiszka <jan.kiszka@siemens.com>
Index: exec.c
===================================================================
--- exec.c (revision 6159)
+++ exec.c (working copy)
@@ -1571,6 +1571,8 @@
#ifdef TARGET_I386
{ CPU_LOG_PCALL, "pcall",
"show protected mode far calls/returns/exceptions" },
+ { CPU_LOG_RESET, "cpu_reset",
+ "show CPU state before CPU resets" },
#endif
#ifdef DEBUG_IOPORT
{ CPU_LOG_IOPORT, "ioport",
Index: target-i386/helper.c
===================================================================
--- target-i386/helper.c (revision 6159)
+++ target-i386/helper.c (working copy)
@@ -418,6 +418,11 @@
{
int i;
+ if (loglevel & CPU_LOG_RESET) {
+ fprintf(logfile, "CPU Reset (CPU %d)\n", env->cpu_index);
+ cpu_dump_state(env, logfile, fprintf, X86_DUMP_FPU | X86_DUMP_CCOP);
+ }
+
memset(env, 0, offsetof(CPUX86State, breakpoints));
tlb_flush(env, 1);
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)))) {
Index: cpu-all.h
===================================================================
--- cpu-all.h (revision 6159)
+++ cpu-all.h (working copy)
@@ -815,6 +815,7 @@
#define CPU_LOG_PCALL (1 << 6)
#define CPU_LOG_IOPORT (1 << 7)
#define CPU_LOG_TB_CPU (1 << 8)
+#define CPU_LOG_RESET (1 << 9)
/* define log items */
typedef struct CPULogItem {
^ permalink raw reply [flat|nested] 5+ messages in thread
* [Qemu-devel] Re: [PATCH] Resend: x86: Reboot CPU on triple fault
2009-01-04 15:45 [Qemu-devel] [PATCH] Resend: x86: Reboot CPU on triple fault lkundrak
@ 2009-01-12 12:14 ` Jan Kiszka
2009-01-12 15:58 ` Alexander Graf
0 siblings, 1 reply; 5+ messages in thread
From: Jan Kiszka @ 2009-01-12 12:14 UTC (permalink / raw)
To: lkundrak; +Cc: qemu-devel, Alexander Graf
lkundrak@v3.sk wrote:
> This is a (slightly adjusted for 2009-01-04 SVN) resend of Jan Kiszka's
> Reboot 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 this
in, 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: <483C340E.1030207@siemens.com>
> Date: Tue, 27 May 2008 18:17:18 +0200
> From: Jan Kiszka <jan.kiszka@siemens.com>
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?
Jan
--
Siemens AG, Corporate Technology, CT SE 26
Corporate Competence Center Embedded Linux
^ permalink raw reply [flat|nested] 5+ messages in thread
* [Qemu-devel] Re: [PATCH] Resend: x86: Reboot CPU on triple fault
2009-01-12 12:14 ` [Qemu-devel] " Jan Kiszka
@ 2009-01-12 15:58 ` Alexander Graf
2009-01-12 16:05 ` Jan Kiszka
0 siblings, 1 reply; 5+ messages in thread
From: Alexander Graf @ 2009-01-12 15:58 UTC (permalink / raw)
To: Jan Kiszka; +Cc: lkundrak@v3.sk, qemu-devel@nongnu.org
On 12.01.2009, at 13:14, Jan Kiszka <jan.kiszka@siemens.com> wrote:
> lkundrak@v3.sk wrote:
>> This is a (slightly adjusted for 2009-01-04 SVN) resend of Jan
>> Kiszka's
>> Reboot 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 this
> in, 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: <483C340E.1030207@siemens.com>
>> Date: Tue, 27 May 2008 18:17:18 +0200
>> From: Jan Kiszka <jan.kiszka@siemens.com>
>
> 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? (asking blindly, I don't have access to the qemu source
right now)
Alex
>
>
> Jan
>
> --
> Siemens AG, Corporate Technology, CT SE 26
> Corporate Competence Center Embedded Linux
^ permalink raw reply [flat|nested] 5+ messages in thread
* [Qemu-devel] Re: [PATCH] Resend: x86: Reboot CPU on triple fault
2009-01-12 15:58 ` Alexander Graf
@ 2009-01-12 16:05 ` Jan Kiszka
2009-01-12 16:41 ` Alexander Graf
0 siblings, 1 reply; 5+ messages in thread
From: Jan Kiszka @ 2009-01-12 16:05 UTC (permalink / raw)
To: Alexander Graf; +Cc: lkundrak@v3.sk, qemu-devel@nongnu.org
Alexander Graf wrote:
>
>
>
>
> On 12.01.2009, at 13:14, Jan Kiszka <jan.kiszka@siemens.com> wrote:
>
>> lkundrak@v3.sk wrote:
>>> This is a (slightly adjusted for 2009-01-04 SVN) resend of Jan Kiszka's
>>> Reboot 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 this
>> in, 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: <483C340E.1030207@siemens.com>
>>> Date: Tue, 27 May 2008 18:17:18 +0200
>>> From: Jan Kiszka <jan.kiszka@siemens.com>
>>
>> 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?
> (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.
Jan
--
Siemens AG, Corporate Technology, CT SE 26
Corporate Competence Center Embedded Linux
^ permalink raw reply [flat|nested] 5+ messages in thread
* [Qemu-devel] Re: [PATCH] Resend: x86: Reboot CPU on triple fault
2009-01-12 16:05 ` Jan Kiszka
@ 2009-01-12 16:41 ` Alexander Graf
0 siblings, 0 replies; 5+ messages in thread
From: Alexander Graf @ 2009-01-12 16:41 UTC (permalink / raw)
To: Jan Kiszka; +Cc: lkundrak@v3.sk, qemu-devel@nongnu.org
On 12.01.2009, at 17:05, Jan Kiszka <jan.kiszka@siemens.com> wrote:
> Alexander Graf wrote:
>>
>>
>>
>>
>> On 12.01.2009, at 13:14, Jan Kiszka <jan.kiszka@siemens.com> wrote:
>>
>>> lkundrak@v3.sk wrote:
>>>> This is a (slightly adjusted for 2009-01-04 SVN) resend of Jan
>>>> Kiszka's
>>>> Reboot 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
>>> this
>>> in, 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: <483C340E.1030207@siemens.com>
>>>> Date: Tue, 27 May 2008 18:17:18 +0200
>>>> From: Jan Kiszka <jan.kiszka@siemens.com>
>>>
>>> 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?
>> (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
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2009-01-12 16:41 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-01-04 15:45 [Qemu-devel] [PATCH] Resend: x86: Reboot CPU on triple fault lkundrak
2009-01-12 12:14 ` [Qemu-devel] " Jan Kiszka
2009-01-12 15:58 ` Alexander Graf
2009-01-12 16:05 ` Jan Kiszka
2009-01-12 16:41 ` Alexander Graf
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).