From mboxrd@z Thu Jan 1 00:00:00 1970 From: Xu Zhang Subject: [PATCH 5/6] mini-os/x86-64 entry: defer RESTORE_REST until return Date: Fri, 8 Mar 2013 15:30:18 -0600 Message-ID: <1362778219-8576-6-git-send-email-xzhang@cs.uic.edu> References: <1362778219-8576-1-git-send-email-xzhang@cs.uic.edu> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1362778219-8576-1-git-send-email-xzhang@cs.uic.edu> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: xen-devel@lists.xen.org Cc: samuel.thibault@ens-lyon.org, jeremy@goop.org, Xu Zhang , gm281@cam.ac.uk, stefano.stabellini@eu.citrix.com List-Id: xen-devel@lists.xenproject.org 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 immediate before actual return. The offset of saved-on-stack rflags register is changed as well. Signed-off-by: Xu Zhang --- extras/mini-os/arch/x86/x86_64.S | 16 ++++++++-------- 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 5e0021b..25add86 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 */ @@ -184,18 +184,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 @@ -206,12 +205,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 ****/ -- 1.7.7.6