diff options
Diffstat (limited to 'include/asm-x86/paravirt.h')
-rw-r--r-- | include/asm-x86/paravirt.h | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/include/asm-x86/paravirt.h b/include/asm-x86/paravirt.h index 56389954d100..854c19364da3 100644 --- a/include/asm-x86/paravirt.h +++ b/include/asm-x86/paravirt.h | |||
@@ -1159,8 +1159,6 @@ static inline unsigned long __raw_local_irq_save(void) | |||
1159 | 1159 | ||
1160 | #else /* __ASSEMBLY__ */ | 1160 | #else /* __ASSEMBLY__ */ |
1161 | 1161 | ||
1162 | #define PARA_PATCH(struct, off) ((PARAVIRT_PATCH_##struct + (off)) / 4) | ||
1163 | |||
1164 | #define _PVSITE(ptype, clobbers, ops, word, algn) \ | 1162 | #define _PVSITE(ptype, clobbers, ops, word, algn) \ |
1165 | 771:; \ | 1163 | 771:; \ |
1166 | ops; \ | 1164 | ops; \ |
@@ -1175,8 +1173,14 @@ static inline unsigned long __raw_local_irq_save(void) | |||
1175 | 1173 | ||
1176 | 1174 | ||
1177 | #ifdef CONFIG_X86_64 | 1175 | #ifdef CONFIG_X86_64 |
1176 | #define PV_SAVE_REGS pushq %rax; pushq %rdi; pushq %rcx; pushq %rdx | ||
1177 | #define PV_RESTORE_REGS popq %rdx; popq %rcx; popq %rdi; popq %rax | ||
1178 | #define PARA_PATCH(struct, off) ((PARAVIRT_PATCH_##struct + (off)) / 8) | ||
1178 | #define PARA_SITE(ptype, clobbers, ops) _PVSITE(ptype, clobbers, ops, .quad, 8) | 1179 | #define PARA_SITE(ptype, clobbers, ops) _PVSITE(ptype, clobbers, ops, .quad, 8) |
1179 | #else | 1180 | #else |
1181 | #define PV_SAVE_REGS pushl %eax; pushl %edi; pushl %ecx; pushl %edx | ||
1182 | #define PV_RESTORE_REGS popl %edx; popl %ecx; popl %edi; popl %eax | ||
1183 | #define PARA_PATCH(struct, off) ((PARAVIRT_PATCH_##struct + (off)) / 4) | ||
1180 | #define PARA_SITE(ptype, clobbers, ops) _PVSITE(ptype, clobbers, ops, .long, 4) | 1184 | #define PARA_SITE(ptype, clobbers, ops) _PVSITE(ptype, clobbers, ops, .long, 4) |
1181 | #endif | 1185 | #endif |
1182 | 1186 | ||
@@ -1186,25 +1190,27 @@ static inline unsigned long __raw_local_irq_save(void) | |||
1186 | 1190 | ||
1187 | #define DISABLE_INTERRUPTS(clobbers) \ | 1191 | #define DISABLE_INTERRUPTS(clobbers) \ |
1188 | PARA_SITE(PARA_PATCH(pv_irq_ops, PV_IRQ_irq_disable), clobbers, \ | 1192 | PARA_SITE(PARA_PATCH(pv_irq_ops, PV_IRQ_irq_disable), clobbers, \ |
1189 | pushl %eax; pushl %ecx; pushl %edx; \ | 1193 | PV_SAVE_REGS; \ |
1190 | call *%cs:pv_irq_ops+PV_IRQ_irq_disable; \ | 1194 | call *%cs:pv_irq_ops+PV_IRQ_irq_disable; \ |
1191 | popl %edx; popl %ecx; popl %eax) \ | 1195 | PV_RESTORE_REGS;) \ |
1192 | 1196 | ||
1193 | #define ENABLE_INTERRUPTS(clobbers) \ | 1197 | #define ENABLE_INTERRUPTS(clobbers) \ |
1194 | PARA_SITE(PARA_PATCH(pv_irq_ops, PV_IRQ_irq_enable), clobbers, \ | 1198 | PARA_SITE(PARA_PATCH(pv_irq_ops, PV_IRQ_irq_enable), clobbers, \ |
1195 | pushl %eax; pushl %ecx; pushl %edx; \ | 1199 | PV_SAVE_REGS; \ |
1196 | call *%cs:pv_irq_ops+PV_IRQ_irq_enable; \ | 1200 | call *%cs:pv_irq_ops+PV_IRQ_irq_enable; \ |
1197 | popl %edx; popl %ecx; popl %eax) | 1201 | PV_RESTORE_REGS;) |
1198 | 1202 | ||
1199 | #define ENABLE_INTERRUPTS_SYSCALL_RET \ | 1203 | #define ENABLE_INTERRUPTS_SYSCALL_RET \ |
1200 | PARA_SITE(PARA_PATCH(pv_cpu_ops, PV_CPU_irq_enable_syscall_ret),\ | 1204 | PARA_SITE(PARA_PATCH(pv_cpu_ops, PV_CPU_irq_enable_syscall_ret),\ |
1201 | CLBR_NONE, \ | 1205 | CLBR_NONE, \ |
1202 | jmp *%cs:pv_cpu_ops+PV_CPU_irq_enable_syscall_ret) | 1206 | jmp *%cs:pv_cpu_ops+PV_CPU_irq_enable_syscall_ret) |
1203 | 1207 | ||
1208 | #ifdef CONFIG_X86_32 | ||
1204 | #define GET_CR0_INTO_EAX \ | 1209 | #define GET_CR0_INTO_EAX \ |
1205 | push %ecx; push %edx; \ | 1210 | push %ecx; push %edx; \ |
1206 | call *pv_cpu_ops+PV_CPU_read_cr0; \ | 1211 | call *pv_cpu_ops+PV_CPU_read_cr0; \ |
1207 | pop %edx; pop %ecx | 1212 | pop %edx; pop %ecx |
1213 | #endif | ||
1208 | 1214 | ||
1209 | #endif /* __ASSEMBLY__ */ | 1215 | #endif /* __ASSEMBLY__ */ |
1210 | #endif /* CONFIG_PARAVIRT */ | 1216 | #endif /* CONFIG_PARAVIRT */ |