1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 #include <asm/asm-offsets.h>
  10 #include <asm/percpu.h>
  11 #include <asm/processor-flags.h>
  12 #include <asm/frame.h>
  13 #include <asm/asm.h>
  14 
  15 #include <linux/linkage.h>
  16 
  17 
  18 
  19 
  20 
  21 
  22 ENTRY(xen_irq_enable_direct)
  23         FRAME_BEGIN
  24         
  25         movb $0, PER_CPU_VAR(xen_vcpu_info) + XEN_vcpu_info_mask
  26 
  27         
  28 
  29 
  30 
  31 
  32 
  33         
  34         testb $0xff, PER_CPU_VAR(xen_vcpu_info) + XEN_vcpu_info_pending
  35         jz 1f
  36 
  37         call check_events
  38 1:
  39         FRAME_END
  40         ret
  41         ENDPROC(xen_irq_enable_direct)
  42 
  43 
  44 
  45 
  46 
  47 
  48 ENTRY(xen_irq_disable_direct)
  49         movb $1, PER_CPU_VAR(xen_vcpu_info) + XEN_vcpu_info_mask
  50         ret
  51 ENDPROC(xen_irq_disable_direct)
  52 
  53 
  54 
  55 
  56 
  57 
  58 
  59 
  60 
  61 
  62 ENTRY(xen_save_fl_direct)
  63         testb $0xff, PER_CPU_VAR(xen_vcpu_info) + XEN_vcpu_info_mask
  64         setz %ah
  65         addb %ah, %ah
  66         ret
  67         ENDPROC(xen_save_fl_direct)
  68 
  69 
  70 
  71 
  72 
  73 
  74 
  75 
  76 
  77 ENTRY(xen_restore_fl_direct)
  78         FRAME_BEGIN
  79 #ifdef CONFIG_X86_64
  80         testw $X86_EFLAGS_IF, %di
  81 #else
  82         testb $X86_EFLAGS_IF>>8, %ah
  83 #endif
  84         setz PER_CPU_VAR(xen_vcpu_info) + XEN_vcpu_info_mask
  85         
  86 
  87 
  88 
  89 
  90 
  91         
  92         cmpw $0x0001, PER_CPU_VAR(xen_vcpu_info) + XEN_vcpu_info_pending
  93         jnz 1f
  94         call check_events
  95 1:
  96         FRAME_END
  97         ret
  98         ENDPROC(xen_restore_fl_direct)
  99 
 100 
 101 
 102 
 103 
 104 
 105 ENTRY(check_events)
 106         FRAME_BEGIN
 107 #ifdef CONFIG_X86_32
 108         push %eax
 109         push %ecx
 110         push %edx
 111         call xen_force_evtchn_callback
 112         pop %edx
 113         pop %ecx
 114         pop %eax
 115 #else
 116         push %rax
 117         push %rcx
 118         push %rdx
 119         push %rsi
 120         push %rdi
 121         push %r8
 122         push %r9
 123         push %r10
 124         push %r11
 125         call xen_force_evtchn_callback
 126         pop %r11
 127         pop %r10
 128         pop %r9
 129         pop %r8
 130         pop %rdi
 131         pop %rsi
 132         pop %rdx
 133         pop %rcx
 134         pop %rax
 135 #endif
 136         FRAME_END
 137         ret
 138 ENDPROC(check_events)
 139 
 140 ENTRY(xen_read_cr2)
 141         FRAME_BEGIN
 142         _ASM_MOV PER_CPU_VAR(xen_vcpu), %_ASM_AX
 143         _ASM_MOV XEN_vcpu_info_arch_cr2(%_ASM_AX), %_ASM_AX
 144         FRAME_END
 145         ret
 146         ENDPROC(xen_read_cr2);
 147 
 148 ENTRY(xen_read_cr2_direct)
 149         FRAME_BEGIN
 150         _ASM_MOV PER_CPU_VAR(xen_vcpu_info) + XEN_vcpu_info_arch_cr2, %_ASM_AX
 151         FRAME_END
 152         ret
 153         ENDPROC(xen_read_cr2_direct);