xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
* x86_64: Fix double fault stack setup
@ 2012-05-24 14:59 Andrew Cooper
  2012-05-24 15:14 ` Jan Beulich
  0 siblings, 1 reply; 9+ messages in thread
From: Andrew Cooper @ 2012-05-24 14:59 UTC (permalink / raw)
  To: xen-devel@lists.xen.org, Jan Beulich, Keir Fraser

[-- Attachment #1: Type: text/plain, Size: 1392 bytes --]

x86_64: Fix double fault stack setup.

Dont forget to push error_code and entry_vector onto the stack for a double
fault.  If it is missed, the register information printed looks like

(XEN) CPU:    0
(XEN) RIP:    0246:[<000000000000e008>] ???
(XEN) RFLAGS: ffff82c480287eb8
(XEN) rax: 0000000000000282   rbx: ffff82c480242dd0   rcx: 0000000000000282
(XEN) rdx: 0000000000000000   rsi: 0000000000000282   rdi: 0000000000000031
(XEN) rbp: 0000000000000031   rsp: 0000000000000000   r8:  ffff83007ee52488
(XEN) r9:  ffff83007ee61088   r10: 0000000000000007   r11: ffff82c480116460
(XEN) r12: 0000000000000000   r13: ffff82c4802c37e0   r14: 00026501a9ced0b8
(XEN) r15: ffff82c4802c37c0    cs: 0000000000000246    ss: 0000000000000000

which incorrectly displays cs, rip, rflags and rsp; the useful pieces of
information when trying to identify the cause of a double fault.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>

diff -r 69c3ae25bb1d xen/arch/x86/x86_64/entry.S
--- a/xen/arch/x86/x86_64/entry.S
+++ b/xen/arch/x86/x86_64/entry.S
@@ -595,6 +595,8 @@ ENTRY(spurious_interrupt_bug)
         jmp   handle_exception
 
 ENTRY(double_fault)
+        pushq $0
+        movl $TRAP_double_fault,4(%rsp)
         SAVE_ALL
         movq  %rsp,%rdi
         call  do_double_fault

-- 
Andrew Cooper - Dom0 Kernel Engineer, Citrix XenServer
T: +44 (0)1223 225 900, http://www.citrix.com


[-- Attachment #2: x86_64-double-fault-stack.patch --]
[-- Type: text/x-patch, Size: 1356 bytes --]

# HG changeset patch
# Parent 69c3ae25bb1ddcb0ea44b7566d36d34e9d6a70aa
x86_64: Fix double fault stack setup.

Dont forget to push error_code and entry_vector onto the stack for a double
fault.  If it is missed, the register information printed looks like

(XEN) CPU:    0
(XEN) RIP:    0246:[<000000000000e008>] ???
(XEN) RFLAGS: ffff82c480287eb8
(XEN) rax: 0000000000000282   rbx: ffff82c480242dd0   rcx: 0000000000000282
(XEN) rdx: 0000000000000000   rsi: 0000000000000282   rdi: 0000000000000031
(XEN) rbp: 0000000000000031   rsp: 0000000000000000   r8:  ffff83007ee52488
(XEN) r9:  ffff83007ee61088   r10: 0000000000000007   r11: ffff82c480116460
(XEN) r12: 0000000000000000   r13: ffff82c4802c37e0   r14: 00026501a9ced0b8
(XEN) r15: ffff82c4802c37c0    cs: 0000000000000246    ss: 0000000000000000

which incorrectly displays cs, rip, rflags and rsp; the useful pieces of
information when trying to identify the cause of a double fault.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>

diff -r 69c3ae25bb1d xen/arch/x86/x86_64/entry.S
--- a/xen/arch/x86/x86_64/entry.S
+++ b/xen/arch/x86/x86_64/entry.S
@@ -595,6 +595,8 @@ ENTRY(spurious_interrupt_bug)
         jmp   handle_exception
 
 ENTRY(double_fault)
+        pushq $0
+        movl $TRAP_double_fault,4(%rsp)
         SAVE_ALL
         movq  %rsp,%rdi
         call  do_double_fault

[-- Attachment #3: Type: text/plain, Size: 126 bytes --]

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: x86_64: Fix double fault stack setup
  2012-05-24 14:59 x86_64: Fix double fault stack setup Andrew Cooper
@ 2012-05-24 15:14 ` Jan Beulich
  2012-05-24 15:28   ` Andrew Cooper
  0 siblings, 1 reply; 9+ messages in thread
From: Jan Beulich @ 2012-05-24 15:14 UTC (permalink / raw)
  To: Andrew Cooper; +Cc: Keir Fraser, xen-devel@lists.xen.org

>>> On 24.05.12 at 16:59, Andrew Cooper <andrew.cooper3@citrix.com> wrote:
> x86_64: Fix double fault stack setup.
> 
> Dont forget to push error_code and entry_vector onto the stack for a double
> fault.  If it is missed, the register information printed looks like
> 
> (XEN) CPU:    0
> (XEN) RIP:    0246:[<000000000000e008>] ???
> (XEN) RFLAGS: ffff82c480287eb8
> (XEN) rax: 0000000000000282   rbx: ffff82c480242dd0   rcx: 0000000000000282
> (XEN) rdx: 0000000000000000   rsi: 0000000000000282   rdi: 0000000000000031
> (XEN) rbp: 0000000000000031   rsp: 0000000000000000   r8:  ffff83007ee52488
> (XEN) r9:  ffff83007ee61088   r10: 0000000000000007   r11: ffff82c480116460
> (XEN) r12: 0000000000000000   r13: ffff82c4802c37e0   r14: 00026501a9ced0b8
> (XEN) r15: ffff82c4802c37c0    cs: 0000000000000246    ss: 0000000000000000
> 
> which incorrectly displays cs, rip, rflags and rsp; the useful pieces of
> information when trying to identify the cause of a double fault.

Is this from an actual double fault, or from one of your INT 08
attempts to simulate one? An actual exception pushes an error
code, so I'm afraid the change below is wrong.

Jan

> Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
> 
> diff -r 69c3ae25bb1d xen/arch/x86/x86_64/entry.S
> --- a/xen/arch/x86/x86_64/entry.S
> +++ b/xen/arch/x86/x86_64/entry.S
> @@ -595,6 +595,8 @@ ENTRY(spurious_interrupt_bug)
>          jmp   handle_exception
>  
>  ENTRY(double_fault)
> +        pushq $0
> +        movl $TRAP_double_fault,4(%rsp)
>          SAVE_ALL
>          movq  %rsp,%rdi
>          call  do_double_fault
> 
> -- 
> Andrew Cooper - Dom0 Kernel Engineer, Citrix XenServer
> T: +44 (0)1223 225 900, http://www.citrix.com 

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: x86_64: Fix double fault stack setup
  2012-05-24 15:14 ` Jan Beulich
@ 2012-05-24 15:28   ` Andrew Cooper
  2012-05-24 15:46     ` Jan Beulich
  2012-05-24 18:04     ` Keir Fraser
  0 siblings, 2 replies; 9+ messages in thread
From: Andrew Cooper @ 2012-05-24 15:28 UTC (permalink / raw)
  To: xen-devel

On 24/05/12 16:14, Jan Beulich wrote:
>>>> On 24.05.12 at 16:59, Andrew Cooper <andrew.cooper3@citrix.com> wrote:
>> x86_64: Fix double fault stack setup.
>>
>> Dont forget to push error_code and entry_vector onto the stack for a double
>> fault.  If it is missed, the register information printed looks like
>>
>> (XEN) CPU:    0
>> (XEN) RIP:    0246:[<000000000000e008>] ???
>> (XEN) RFLAGS: ffff82c480287eb8
>> (XEN) rax: 0000000000000282   rbx: ffff82c480242dd0   rcx: 0000000000000282
>> (XEN) rdx: 0000000000000000   rsi: 0000000000000282   rdi: 0000000000000031
>> (XEN) rbp: 0000000000000031   rsp: 0000000000000000   r8:  ffff83007ee52488
>> (XEN) r9:  ffff83007ee61088   r10: 0000000000000007   r11: ffff82c480116460
>> (XEN) r12: 0000000000000000   r13: ffff82c4802c37e0   r14: 00026501a9ced0b8
>> (XEN) r15: ffff82c4802c37c0    cs: 0000000000000246    ss: 0000000000000000
>>
>> which incorrectly displays cs, rip, rflags and rsp; the useful pieces of
>> information when trying to identify the cause of a double fault.
> Is this from an actual double fault, or from one of your INT 08
> attempts to simulate one? An actual exception pushes an error
> code, so I'm afraid the change below is wrong.
>
> Jan

Ah yes - how silly of me.  I misread the manual when checking that fact,
but this was an INT 08 experiment.  I really should have checked with a
ud2 as well.

That is a bit awkward.

Do we actually care about this error from an INT 08?  I suppose we could
check under rip for 0xcd 0x08, but then the same argument would apply to
all other exceptions which may push an error onto the stack.

Do we care however that entry_vector is not being set correctly?  I cant
see anything on the current codepath which uses it, but it doesn't
preclude someone adding code in the future.

~Andrew

>
>> Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
>>
>> diff -r 69c3ae25bb1d xen/arch/x86/x86_64/entry.S
>> --- a/xen/arch/x86/x86_64/entry.S
>> +++ b/xen/arch/x86/x86_64/entry.S
>> @@ -595,6 +595,8 @@ ENTRY(spurious_interrupt_bug)
>>          jmp   handle_exception
>>  
>>  ENTRY(double_fault)
>> +        pushq $0
>> +        movl $TRAP_double_fault,4(%rsp)
>>          SAVE_ALL
>>          movq  %rsp,%rdi
>>          call  do_double_fault
>>
>> -- 
>> Andrew Cooper - Dom0 Kernel Engineer, Citrix XenServer
>> T: +44 (0)1223 225 900, http://www.citrix.com 
>
>
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xen.org
> http://lists.xen.org/xen-devel

-- 
Andrew Cooper - Dom0 Kernel Engineer, Citrix XenServer
T: +44 (0)1223 225 900, http://www.citrix.com

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: x86_64: Fix double fault stack setup
  2012-05-24 15:28   ` Andrew Cooper
@ 2012-05-24 15:46     ` Jan Beulich
  2012-05-24 16:12       ` Andrew Cooper
  2012-05-24 18:04     ` Keir Fraser
  1 sibling, 1 reply; 9+ messages in thread
From: Jan Beulich @ 2012-05-24 15:46 UTC (permalink / raw)
  To: Andrew Cooper; +Cc: xen-devel

>>> On 24.05.12 at 17:28, Andrew Cooper <andrew.cooper3@citrix.com> wrote:
> Do we actually care about this error from an INT 08?

Definitely not - the hypervisor doesn't (except in your debugging)
ever use INT nn, and nothing else can access those gates.

> I suppose we could check under rip for 0xcd 0x08,

That's (from my pov) an absolute no-go for the double fault
handler, even if the above didn't hold.

Jan

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: x86_64: Fix double fault stack setup
  2012-05-24 15:46     ` Jan Beulich
@ 2012-05-24 16:12       ` Andrew Cooper
  2012-05-25 10:35         ` Jan Beulich
  0 siblings, 1 reply; 9+ messages in thread
From: Andrew Cooper @ 2012-05-24 16:12 UTC (permalink / raw)
  To: Jan Beulich; +Cc: xen-devel@lists.xen.org

On 24/05/12 16:46, Jan Beulich wrote:
>>>> On 24.05.12 at 17:28, Andrew Cooper <andrew.cooper3@citrix.com> wrote:
>> Do we actually care about this error from an INT 08?
> Definitely not - the hypervisor doesn't (except in your debugging)
> ever use INT nn, and nothing else can access those gates.

Ok - I will avoid debugging in this fashion in the future.

>
>> I suppose we could check under rip for 0xcd 0x08,
> That's (from my pov) an absolute no-go for the double fault
> handler, even if the above didn't hold.
>
> Jan

Yes.  After further considering, this adds an extra fault in that the
#DF handler would not successfully return, which was being hidden in my
tests by the crash kernel.

What about the entry vector?  It would be safe to do in the case of a
real #DF, and wont really break the int08 case much more than it already is.

-- 
Andrew Cooper - Dom0 Kernel Engineer, Citrix XenServer
T: +44 (0)1223 225 900, http://www.citrix.com

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: x86_64: Fix double fault stack setup
  2012-05-24 15:28   ` Andrew Cooper
  2012-05-24 15:46     ` Jan Beulich
@ 2012-05-24 18:04     ` Keir Fraser
  2012-05-24 18:15       ` Andrew Cooper
  1 sibling, 1 reply; 9+ messages in thread
From: Keir Fraser @ 2012-05-24 18:04 UTC (permalink / raw)
  To: Andrew Cooper, xen-devel; +Cc: Jan Beulich

On 24/05/2012 16:28, "Andrew Cooper" <andrew.cooper3@citrix.com> wrote:

> Ah yes - how silly of me.  I misread the manual when checking that fact,
> but this was an INT 08 experiment.  I really should have checked with a
> ud2 as well.
> 
> That is a bit awkward.
> 
> Do we actually care about this error from an INT 08?  I suppose we could
> check under rip for 0xcd 0x08, but then the same argument would apply to
> all other exceptions which may push an error onto the stack.
> 
> Do we care however that entry_vector is not being set correctly?  I cant
> see anything on the current codepath which uses it, but it doesn't
> preclude someone adding code in the future.

It would be a simple one-line patch and make that entry point consistent
with all other exception-handling entry points. So I'm in favour of it.

 -- Keir

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: x86_64: Fix double fault stack setup
  2012-05-24 18:04     ` Keir Fraser
@ 2012-05-24 18:15       ` Andrew Cooper
  0 siblings, 0 replies; 9+ messages in thread
From: Andrew Cooper @ 2012-05-24 18:15 UTC (permalink / raw)
  To: Keir Fraser; +Cc: Jan Beulich, xen-devel@lists.xen.org

[-- Attachment #1: Type: text/plain, Size: 1010 bytes --]

On 24/05/12 19:04, Keir Fraser wrote:
> On 24/05/2012 16:28, "Andrew Cooper" <andrew.cooper3@citrix.com> wrote:
>
>> Ah yes - how silly of me.  I misread the manual when checking that fact,
>> but this was an INT 08 experiment.  I really should have checked with a
>> ud2 as well.
>>
>> That is a bit awkward.
>>
>> Do we actually care about this error from an INT 08?  I suppose we could
>> check under rip for 0xcd 0x08, but then the same argument would apply to
>> all other exceptions which may push an error onto the stack.
>>
>> Do we care however that entry_vector is not being set correctly?  I cant
>> see anything on the current codepath which uses it, but it doesn't
>> preclude someone adding code in the future.
> It would be a simple one-line patch and make that entry point consistent
> with all other exception-handling entry points. So I'm in favour of it.
>
>  -- Keir

Ok - attached.

-- 
Andrew Cooper - Dom0 Kernel Engineer, Citrix XenServer
T: +44 (0)1223 225 900, http://www.citrix.com


[-- Attachment #2: x86_64-double-fault-entry-vector.patch --]
[-- Type: text/x-patch, Size: 514 bytes --]

# HG changeset patch
# Parent 69c3ae25bb1ddcb0ea44b7566d36d34e9d6a70aa
x86_64: Record entry vector for double faults.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>

diff -r 69c3ae25bb1d xen/arch/x86/x86_64/entry.S
--- a/xen/arch/x86/x86_64/entry.S
+++ b/xen/arch/x86/x86_64/entry.S
@@ -595,6 +595,7 @@ ENTRY(spurious_interrupt_bug)
         jmp   handle_exception
 
 ENTRY(double_fault)
+        movl $TRAP_double_fault,4(%rsp)
         SAVE_ALL
         movq  %rsp,%rdi
         call  do_double_fault

[-- Attachment #3: Type: text/plain, Size: 126 bytes --]

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: x86_64: Fix double fault stack setup
  2012-05-24 16:12       ` Andrew Cooper
@ 2012-05-25 10:35         ` Jan Beulich
  2012-05-25 11:04           ` Keir Fraser
  0 siblings, 1 reply; 9+ messages in thread
From: Jan Beulich @ 2012-05-25 10:35 UTC (permalink / raw)
  To: Andrew Cooper; +Cc: xen-devel@lists.xen.org

>>> On 24.05.12 at 18:12, Andrew Cooper <andrew.cooper3@citrix.com> wrote:
> What about the entry vector?  It would be safe to do in the case of a
> real #DF, and wont really break the int08 case much more than it already is.

That could be done for completeness, perhaps also in
early_page_fault.

Jan

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: x86_64: Fix double fault stack setup
  2012-05-25 10:35         ` Jan Beulich
@ 2012-05-25 11:04           ` Keir Fraser
  0 siblings, 0 replies; 9+ messages in thread
From: Keir Fraser @ 2012-05-25 11:04 UTC (permalink / raw)
  To: Jan Beulich, Andrew Cooper; +Cc: xen-devel@lists.xen.org

On 25/05/2012 11:35, "Jan Beulich" <JBeulich@suse.com> wrote:

>>>> On 24.05.12 at 18:12, Andrew Cooper <andrew.cooper3@citrix.com> wrote:
>> What about the entry vector?  It would be safe to do in the case of a
>> real #DF, and wont really break the int08 case much more than it already is.
> 
> That could be done for completeness, perhaps also in
> early_page_fault.

Because it's obviously a special-case boot-time handler, I'm not so
bothered. But I'm happy for you to make the change, if you like.

 -- Keir

> Jan
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xen.org
> http://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2012-05-25 11:04 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-05-24 14:59 x86_64: Fix double fault stack setup Andrew Cooper
2012-05-24 15:14 ` Jan Beulich
2012-05-24 15:28   ` Andrew Cooper
2012-05-24 15:46     ` Jan Beulich
2012-05-24 16:12       ` Andrew Cooper
2012-05-25 10:35         ` Jan Beulich
2012-05-25 11:04           ` Keir Fraser
2012-05-24 18:04     ` Keir Fraser
2012-05-24 18:15       ` Andrew Cooper

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).