WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] When creating exception/interrupt stack frames for a gue

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] When creating exception/interrupt stack frames for a guest,
From: Xen patchbot -unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Thu, 10 Nov 2005 17:06:17 +0000
Delivery-date: Thu, 10 Nov 2005 17:08:04 +0000
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxx
# Node ID d916497135acf19d48c39e08eedefff621210996
# Parent  c405c0d1b49b755585b615241389fd5350623dbf
When creating exception/interrupt stack frames for a guest,
set saved eflags.IF to !saved_upcall_mask. This allows the
guest to test interrupts-enabled in the interrupted context
in the same way as when running natively.

Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>

diff -r c405c0d1b49b -r d916497135ac 
linux-2.6-xen-sparse/arch/xen/i386/kernel/traps.c
--- a/linux-2.6-xen-sparse/arch/xen/i386/kernel/traps.c Thu Nov 10 11:12:00 2005
+++ b/linux-2.6-xen-sparse/arch/xen/i386/kernel/traps.c Thu Nov 10 14:03:33 2005
@@ -650,7 +650,7 @@
 
 static inline void conditional_sti(struct pt_regs *regs)
 {
-       if ((uint8_t)(regs->xcs >> 16) == 0)
+       if (regs->eflags & (X86_EFLAGS_IF|VM_MASK))
                local_irq_enable();
 }
 
diff -r c405c0d1b49b -r d916497135ac 
linux-2.6-xen-sparse/arch/xen/i386/mm/fault.c
--- a/linux-2.6-xen-sparse/arch/xen/i386/mm/fault.c     Thu Nov 10 11:12:00 2005
+++ b/linux-2.6-xen-sparse/arch/xen/i386/mm/fault.c     Thu Nov 10 14:03:33 2005
@@ -300,9 +300,8 @@
        if (notify_die(DIE_PAGE_FAULT, "page fault", regs, error_code, 14,
                                        SIGSEGV) == NOTIFY_STOP)
                return;
-
        /* It's safe to allow irq's after cr2 has been saved */
-       if ((uint8_t)(regs->xcs >> 16) == 0)
+       if (regs->eflags & (X86_EFLAGS_IF|VM_MASK))
                local_irq_enable();
 
        tsk = current;
diff -r c405c0d1b49b -r d916497135ac 
linux-2.6-xen-sparse/arch/xen/x86_64/kernel/traps.c
--- a/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/traps.c       Thu Nov 10 
11:12:00 2005
+++ b/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/traps.c       Thu Nov 10 
14:03:33 2005
@@ -89,7 +89,7 @@
 
 static inline void conditional_sti(struct pt_regs *regs)
 {
-       if ((uint8_t)(regs->cs >> 32) == 0)
+       if (regs->eflags & X86_EFLAGS_IF)
                local_irq_enable();
 }
 
diff -r c405c0d1b49b -r d916497135ac 
linux-2.6-xen-sparse/arch/xen/x86_64/mm/fault.c
--- a/linux-2.6-xen-sparse/arch/xen/x86_64/mm/fault.c   Thu Nov 10 11:12:00 2005
+++ b/linux-2.6-xen-sparse/arch/xen/x86_64/mm/fault.c   Thu Nov 10 14:03:33 2005
@@ -351,7 +351,7 @@
                                        SIGSEGV) == NOTIFY_STOP)
                return;
 
-       if (likely((uint8_t)(regs->cs >> 32) == 0))
+       if (likely(regs->eflags & X86_EFLAGS_IF))
                local_irq_enable();
 
        if (unlikely(page_fault_trace))
diff -r c405c0d1b49b -r d916497135ac xen/arch/x86/domain.c
--- a/xen/arch/x86/domain.c     Thu Nov 10 11:12:00 2005
+++ b/xen/arch/x86/domain.c     Thu Nov 10 14:03:33 2005
@@ -647,7 +647,7 @@
 
     regs->rip    = stu.rip;
     regs->cs     = stu.cs | 3; /* force guest privilege */
-    regs->rflags = stu.rflags;
+    regs->rflags = (stu.rflags & ~(EF_IOPL|EF_VM)) | EF_IE;
     regs->rsp    = stu.rsp;
     regs->ss     = stu.ss | 3; /* force guest privilege */
 
diff -r c405c0d1b49b -r d916497135ac xen/arch/x86/x86_32/entry.S
--- a/xen/arch/x86/x86_32/entry.S       Thu Nov 10 11:12:00 2005
+++ b/xen/arch/x86/x86_32/entry.S       Thu Nov 10 14:03:33 2005
@@ -156,7 +156,7 @@
          * By this time, all the setups in the VMCS must be complete.
          */
         .if \launch
-        /* VMLUANCH */
+        /* VMLAUNCH */
         .byte 0x0f,0x01,0xc2
         pushf
         call vm_launch_fail
@@ -394,7 +394,12 @@
         shll $16,%eax                    # Bits 16-23: saved_upcall_mask
         movw UREGS_cs+4(%esp),%ax        # Bits  0-15: CS
 FLT15:  movl %eax,%gs:4(%esi) 
+        test $0x00FF0000,%eax            # Bits 16-23: saved_upcall_mask
+        setz %ch                         # %ch == !saved_upcall_mask
         movl UREGS_eflags+4(%esp),%eax
+        andl $~X86_EFLAGS_IF,%eax
+        shlb $1,%ch                      # Bit 9 (EFLAGS.IF)
+        orb  %ch,%ah                     # Fold EFLAGS.IF into %eax
 FLT16:  movl %eax,%gs:8(%esi)
         test $TBF_EXCEPTION_ERRCODE,%cl
         jz   1f
diff -r c405c0d1b49b -r d916497135ac xen/arch/x86/x86_64/entry.S
--- a/xen/arch/x86/x86_64/entry.S       Thu Nov 10 11:12:00 2005
+++ b/xen/arch/x86/x86_64/entry.S       Thu Nov 10 14:03:33 2005
@@ -352,8 +352,6 @@
 FLT2:   movq  %rax,32(%rsi)             # SS
         movq  UREGS_rsp+8(%rsp),%rax
 FLT3:   movq  %rax,24(%rsi)             # RSP
-        movq  UREGS_eflags+8(%rsp),%rax
-FLT4:   movq  %rax,16(%rsi)             # RFLAGS
         movq  VCPU_vcpu_info(%rbx),%rax
         pushq VCPUINFO_upcall_mask(%rax)
         testb $TBF_INTERRUPT,%cl
@@ -362,7 +360,15 @@
         popq  %rax
         shlq  $32,%rax                  # Bits 32-39: saved_upcall_mask
         movw  UREGS_cs+8(%rsp),%ax      # Bits  0-15: CS
-FLT5:   movq  %rax,8(%rsi)              # CS/saved_upcall_mask
+FLT4:   movq  %rax,8(%rsi)              # CS / saved_upcall_mask
+        shrq  $32,%rax
+        testb $0xFF,%al                 # Bits 0-7: saved_upcall_mask
+        setz  %ch                       # %ch == !saved_upcall_mask
+        movq  UREGS_eflags+8(%rsp),%rax
+        andq  $~X86_EFLAGS_IF,%rax
+        shlb  $1,%ch                    # Bit 9 (EFLAGS.IF)
+        orb   %ch,%ah                   # Fold EFLAGS.IF into %eax
+FLT5:   movq  %rax,16(%rsi)             # RFLAGS
         movq  UREGS_rip+8(%rsp),%rax
 FLT6:   movq  %rax,(%rsi)               # RIP
         testb $TBF_EXCEPTION_ERRCODE,%cl
diff -r c405c0d1b49b -r d916497135ac xen/include/public/arch-x86_32.h
--- a/xen/include/public/arch-x86_32.h  Thu Nov 10 11:12:00 2005
+++ b/xen/include/public/arch-x86_32.h  Thu Nov 10 14:03:33 2005
@@ -90,7 +90,7 @@
     uint16_t cs;
     uint8_t  saved_upcall_mask;
     uint8_t  _pad0;
-    uint32_t eflags;
+    uint32_t eflags;        /* eflags.IF == !saved_upcall_mask */
     uint32_t esp;
     uint16_t ss, _pad1;
     uint16_t es, _pad2;
diff -r c405c0d1b49b -r d916497135ac xen/include/public/arch-x86_64.h
--- a/xen/include/public/arch-x86_64.h  Thu Nov 10 11:12:00 2005
+++ b/xen/include/public/arch-x86_64.h  Thu Nov 10 14:03:33 2005
@@ -154,7 +154,7 @@
     uint16_t cs, _pad0[1];
     uint8_t  saved_upcall_mask;
     uint8_t  _pad1[3];
-    __DECL_REG(flags);
+    __DECL_REG(flags);      /* rflags.IF == !saved_upcall_mask */
     __DECL_REG(sp);
     uint16_t ss, _pad2[3];
     uint16_t es, _pad3[3];

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] When creating exception/interrupt stack frames for a guest,, Xen patchbot -unstable <=