diff options
Diffstat (limited to 'arch/ia64/kernel/paravirtentry.S')
-rw-r--r-- | arch/ia64/kernel/paravirtentry.S | 99 |
1 files changed, 80 insertions, 19 deletions
diff --git a/arch/ia64/kernel/paravirtentry.S b/arch/ia64/kernel/paravirtentry.S index 2f42fcb9776a..6158560d7f17 100644 --- a/arch/ia64/kernel/paravirtentry.S +++ b/arch/ia64/kernel/paravirtentry.S | |||
@@ -20,8 +20,11 @@ | |||
20 | * | 20 | * |
21 | */ | 21 | */ |
22 | 22 | ||
23 | #include <linux/init.h> | ||
23 | #include <asm/asmmacro.h> | 24 | #include <asm/asmmacro.h> |
24 | #include <asm/asm-offsets.h> | 25 | #include <asm/asm-offsets.h> |
26 | #include <asm/paravirt_privop.h> | ||
27 | #include <asm/paravirt_patch.h> | ||
25 | #include "entry.h" | 28 | #include "entry.h" |
26 | 29 | ||
27 | #define DATA8(sym, init_value) \ | 30 | #define DATA8(sym, init_value) \ |
@@ -32,29 +35,87 @@ | |||
32 | data8 init_value ; \ | 35 | data8 init_value ; \ |
33 | .popsection | 36 | .popsection |
34 | 37 | ||
35 | #define BRANCH(targ, reg, breg) \ | 38 | #define BRANCH(targ, reg, breg, type) \ |
36 | movl reg=targ ; \ | 39 | PARAVIRT_PATCH_SITE_BR(PARAVIRT_PATCH_TYPE_BR_ ## type) ; \ |
37 | ;; \ | 40 | ;; \ |
38 | ld8 reg=[reg] ; \ | 41 | movl reg=targ ; \ |
39 | ;; \ | 42 | ;; \ |
40 | mov breg=reg ; \ | 43 | ld8 reg=[reg] ; \ |
44 | ;; \ | ||
45 | mov breg=reg ; \ | ||
41 | br.cond.sptk.many breg | 46 | br.cond.sptk.many breg |
42 | 47 | ||
43 | #define BRANCH_PROC(sym, reg, breg) \ | 48 | #define BRANCH_PROC(sym, reg, breg, type) \ |
44 | DATA8(paravirt_ ## sym ## _targ, ia64_native_ ## sym) ; \ | 49 | DATA8(paravirt_ ## sym ## _targ, ia64_native_ ## sym) ; \ |
45 | GLOBAL_ENTRY(paravirt_ ## sym) ; \ | 50 | GLOBAL_ENTRY(paravirt_ ## sym) ; \ |
46 | BRANCH(paravirt_ ## sym ## _targ, reg, breg) ; \ | 51 | BRANCH(paravirt_ ## sym ## _targ, reg, breg, type) ; \ |
47 | END(paravirt_ ## sym) | 52 | END(paravirt_ ## sym) |
48 | 53 | ||
49 | #define BRANCH_PROC_UNWINFO(sym, reg, breg) \ | 54 | #define BRANCH_PROC_UNWINFO(sym, reg, breg, type) \ |
50 | DATA8(paravirt_ ## sym ## _targ, ia64_native_ ## sym) ; \ | 55 | DATA8(paravirt_ ## sym ## _targ, ia64_native_ ## sym) ; \ |
51 | GLOBAL_ENTRY(paravirt_ ## sym) ; \ | 56 | GLOBAL_ENTRY(paravirt_ ## sym) ; \ |
52 | PT_REGS_UNWIND_INFO(0) ; \ | 57 | PT_REGS_UNWIND_INFO(0) ; \ |
53 | BRANCH(paravirt_ ## sym ## _targ, reg, breg) ; \ | 58 | BRANCH(paravirt_ ## sym ## _targ, reg, breg, type) ; \ |
54 | END(paravirt_ ## sym) | 59 | END(paravirt_ ## sym) |
55 | 60 | ||
56 | 61 | ||
57 | BRANCH_PROC(switch_to, r22, b7) | 62 | BRANCH_PROC(switch_to, r22, b7, SWITCH_TO) |
58 | BRANCH_PROC_UNWINFO(leave_syscall, r22, b7) | 63 | BRANCH_PROC_UNWINFO(leave_syscall, r22, b7, LEAVE_SYSCALL) |
59 | BRANCH_PROC(work_processed_syscall, r2, b7) | 64 | BRANCH_PROC(work_processed_syscall, r2, b7, WORK_PROCESSED_SYSCALL) |
60 | BRANCH_PROC_UNWINFO(leave_kernel, r22, b7) | 65 | BRANCH_PROC_UNWINFO(leave_kernel, r22, b7, LEAVE_KERNEL) |
66 | |||
67 | |||
68 | #ifdef CONFIG_MODULES | ||
69 | #define __INIT_OR_MODULE .text | ||
70 | #define __INITDATA_OR_MODULE .data | ||
71 | #else | ||
72 | #define __INIT_OR_MODULE __INIT | ||
73 | #define __INITDATA_OR_MODULE __INITDATA | ||
74 | #endif /* CONFIG_MODULES */ | ||
75 | |||
76 | __INIT_OR_MODULE | ||
77 | GLOBAL_ENTRY(paravirt_fc_i) | ||
78 | fc.i r32 | ||
79 | br.ret.sptk.many rp | ||
80 | END(paravirt_fc_i) | ||
81 | __FINIT | ||
82 | |||
83 | __INIT_OR_MODULE | ||
84 | .align 32 | ||
85 | GLOBAL_ENTRY(paravirt_nop_b_inst_bundle) | ||
86 | { | ||
87 | nop.b 0 | ||
88 | nop.b 0 | ||
89 | nop.b 0 | ||
90 | } | ||
91 | END(paravirt_nop_b_inst_bundle) | ||
92 | __FINIT | ||
93 | |||
94 | /* NOTE: nop.[mfi] has same format */ | ||
95 | __INIT_OR_MODULE | ||
96 | GLOBAL_ENTRY(paravirt_nop_mfi_inst_bundle) | ||
97 | { | ||
98 | nop.m 0 | ||
99 | nop.f 0 | ||
100 | nop.i 0 | ||
101 | } | ||
102 | END(paravirt_nop_mfi_inst_bundle) | ||
103 | __FINIT | ||
104 | |||
105 | __INIT_OR_MODULE | ||
106 | GLOBAL_ENTRY(paravirt_nop_bundle) | ||
107 | paravirt_nop_bundle_start: | ||
108 | { | ||
109 | nop 0 | ||
110 | nop 0 | ||
111 | nop 0 | ||
112 | } | ||
113 | paravirt_nop_bundle_end: | ||
114 | END(paravirt_nop_bundle) | ||
115 | __FINIT | ||
116 | |||
117 | __INITDATA_OR_MODULE | ||
118 | .align 8 | ||
119 | .global paravirt_nop_bundle_size | ||
120 | paravirt_nop_bundle_size: | ||
121 | data8 paravirt_nop_bundle_end - paravirt_nop_bundle_start | ||