aboutsummaryrefslogtreecommitdiffstats
path: root/extras
diff options
context:
space:
mode:
authorXu Zhang <xzhang@cs.uic.edu>2013-04-10 23:46:59 -0500
committerIan Campbell <ian.campbell@citrix.com>2013-04-22 12:32:49 +0100
commit04823e2ad2a8902bf6d24dc1677c72ac9658b792 (patch)
treedab09bd8af0835412a9efc0251bcd605d0860feb /extras
parentae81a2fe4c70d3905fecb91112f0524c68e46902 (diff)
downloadxen-04823e2ad2a8902bf6d24dc1677c72ac9658b792.tar.gz
xen-04823e2ad2a8902bf6d24dc1677c72ac9658b792.tar.bz2
xen-04823e2ad2a8902bf6d24dc1677c72ac9658b792.zip
mini-os/x86-64 entry: defer RESTORE_REST until return
No need to do a RESTORE_REST at this point because if we saw pending events after we enabled event delivery, we have to do a SAVE_REST again. Instead, we do a "lazy" RESTORE_REST, deferring it until actual return. The offset of saved-on-stack rflags register is changed as well. Signed-off-by: Xu Zhang <xzhang@cs.uic.edu> Acked-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
Diffstat (limited to 'extras')
-rw-r--r--extras/mini-os/arch/x86/x86_64.S16
1 files changed, 8 insertions, 8 deletions
diff --git a/extras/mini-os/arch/x86/x86_64.S b/extras/mini-os/arch/x86/x86_64.S
index 909024d97e..20ab4779f3 100644
--- a/extras/mini-os/arch/x86/x86_64.S
+++ b/extras/mini-os/arch/x86/x86_64.S
@@ -60,7 +60,7 @@ NMI_MASK = 0x80000000
#define RDI 112
#define ORIG_RAX 120 /* + error_code */
-#define EFLAGS 144
+#define RFLAGS 144
/* Macros */
@@ -185,18 +185,17 @@ ENTRY(hypervisor_callback2)
decl %gs:0
error_exit:
- RESTORE_REST
-
retint_kernel:
-retint_restore_args:
- movl EFLAGS-6*8(%rsp), %eax
- shr $9, %eax # EAX[0] == IRET_EFLAGS.IF
+ movl RFLAGS(%rsp), %eax
+ shr $9, %eax # EAX[0] == IRET_RFLAGS.IF
XEN_GET_VCPU_INFO(%rsi)
andb evtchn_upcall_mask(%rsi),%al
- andb $1,%al # EAX[0] == IRET_EFLAGS.IF & event_mask
+ andb $1,%al # EAX[0] == IRET_RFLAGS.IF & event_mask
jnz restore_all_enable_events # != 0 => enable event delivery
XEN_PUT_VCPU_INFO(%rsi)
+retint_restore_args:
+ RESTORE_REST
RESTORE_ALL
HYPERVISOR_IRET 0
@@ -207,12 +206,13 @@ scrit: /**** START OF CRITICAL REGION ****/
XEN_TEST_PENDING(%rsi)
jnz 14f # process more events if necessary...
XEN_PUT_VCPU_INFO(%rsi)
+
+ RESTORE_REST
RESTORE_ALL
HYPERVISOR_IRET 0
14: XEN_LOCKED_BLOCK_EVENTS(%rsi)
XEN_PUT_VCPU_INFO(%rsi)
- SAVE_REST
movq %rsp,%rdi # set the argument again
jmp 11b
ecrit: /**** END OF CRITICAL REGION ****/