81 lines
2.9 KiB
Diff
81 lines
2.9 KiB
Diff
|
# HG changeset 15416 patch
|
||
|
# User kfraser@localhost.localdomain
|
||
|
# Date 1182445370 -3600
|
||
|
# Node ID b35b8053012e6b1720a392964bc7114ba30de420
|
||
|
# Parent 04d4b7b6f5b752a4375cbb58f6ce3efc207f708a
|
||
|
Fix x86/64 failsafe callback handling.
|
||
|
Signed-off-by: Keir Fraser <keir@xensource.com>
|
||
|
|
||
|
Index: 2007-05-14/xen/arch/x86/x86_64/compat/entry.S
|
||
|
===================================================================
|
||
|
--- 2007-05-14.orig/xen/arch/x86/x86_64/compat/entry.S 2007-07-02 10:37:50.000000000 +0200
|
||
|
+++ 2007-05-14/xen/arch/x86/x86_64/compat/entry.S 2007-07-02 10:48:18.000000000 +0200
|
||
|
@@ -143,12 +143,12 @@ compat_restore_all_guest:
|
||
|
.Lft0: iretq
|
||
|
|
||
|
.section .fixup,"ax"
|
||
|
-.Lfx0: popq -15*8-8(%rsp) # error_code/entry_vector
|
||
|
- SAVE_ALL # 15*8 bytes pushed
|
||
|
- movq -8(%rsp),%rsi # error_code/entry_vector
|
||
|
- sti # after stack abuse (-1024(%rsp))
|
||
|
+.Lfx0: sti
|
||
|
+ SAVE_ALL
|
||
|
+ movq UREGS_error_code(%rsp),%rsi
|
||
|
+ movq %rsp,%rax
|
||
|
+ andq $~0xf,%rsp
|
||
|
pushq $__HYPERVISOR_DS # SS
|
||
|
- leaq 8(%rsp),%rax
|
||
|
pushq %rax # RSP
|
||
|
pushfq # RFLAGS
|
||
|
pushq $__HYPERVISOR_CS # CS
|
||
|
Index: 2007-05-14/xen/arch/x86/x86_64/entry.S
|
||
|
===================================================================
|
||
|
--- 2007-05-14.orig/xen/arch/x86/x86_64/entry.S 2007-07-02 10:37:49.000000000 +0200
|
||
|
+++ 2007-05-14/xen/arch/x86/x86_64/entry.S 2007-07-02 10:48:18.000000000 +0200
|
||
|
@@ -57,23 +57,23 @@ restore_all_guest:
|
||
|
/* No special register assumptions. */
|
||
|
iret_exit_to_guest:
|
||
|
addq $8,%rsp
|
||
|
-.Lft1: iretq
|
||
|
+.Lft0: iretq
|
||
|
|
||
|
.section .fixup,"ax"
|
||
|
-.Lfx1: popq -15*8-8(%rsp) # error_code/entry_vector
|
||
|
- SAVE_ALL # 15*8 bytes pushed
|
||
|
- movq -8(%rsp),%rsi # error_code/entry_vector
|
||
|
- sti # after stack abuse (-1024(%rsp))
|
||
|
+.Lfx0: sti
|
||
|
+ SAVE_ALL
|
||
|
+ movq UREGS_error_code(%rsp),%rsi
|
||
|
+ movq %rsp,%rax
|
||
|
+ andq $~0xf,%rsp
|
||
|
pushq $__HYPERVISOR_DS # SS
|
||
|
- leaq 8(%rsp),%rax
|
||
|
pushq %rax # RSP
|
||
|
- pushf # RFLAGS
|
||
|
+ pushfq # RFLAGS
|
||
|
pushq $__HYPERVISOR_CS # CS
|
||
|
- leaq .Ldf1(%rip),%rax
|
||
|
+ leaq .Ldf0(%rip),%rax
|
||
|
pushq %rax # RIP
|
||
|
pushq %rsi # error_code/entry_vector
|
||
|
jmp handle_exception
|
||
|
-.Ldf1: GET_CURRENT(%rbx)
|
||
|
+.Ldf0: GET_CURRENT(%rbx)
|
||
|
jmp test_all_events
|
||
|
failsafe_callback:
|
||
|
GET_CURRENT(%rbx)
|
||
|
@@ -88,10 +88,10 @@ failsafe_callback:
|
||
|
jmp test_all_events
|
||
|
.previous
|
||
|
.section __pre_ex_table,"a"
|
||
|
- .quad .Lft1,.Lfx1
|
||
|
+ .quad .Lft0,.Lfx0
|
||
|
.previous
|
||
|
.section __ex_table,"a"
|
||
|
- .quad .Ldf1,failsafe_callback
|
||
|
+ .quad .Ldf0,failsafe_callback
|
||
|
.previous
|
||
|
|
||
|
ALIGN
|