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);