Commit | Line | Data |
---|---|---|
4df8d22b IY |
1 | /****************************************************************************** |
2 | * linux/arch/ia64/xen/paravirtentry.S | |
3 | * | |
4 | * Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp> | |
5 | * VA Linux Systems Japan K.K. | |
6 | * | |
7 | * This program is free software; you can redistribute it and/or modify | |
8 | * it under the terms of the GNU General Public License as published by | |
9 | * the Free Software Foundation; either version 2 of the License, or | |
10 | * (at your option) any later version. | |
11 | * | |
12 | * This program is distributed in the hope that it will be useful, | |
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 | * GNU General Public License for more details. | |
16 | * | |
17 | * You should have received a copy of the GNU General Public License | |
18 | * along with this program; if not, write to the Free Software | |
19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
20 | * | |
21 | */ | |
22 | ||
03f511dd | 23 | #include <linux/init.h> |
4df8d22b IY |
24 | #include <asm/asmmacro.h> |
25 | #include <asm/asm-offsets.h> | |
03f511dd IY |
26 | #include <asm/paravirt_privop.h> |
27 | #include <asm/paravirt_patch.h> | |
4df8d22b IY |
28 | #include "entry.h" |
29 | ||
30 | #define DATA8(sym, init_value) \ | |
54cb27a7 | 31 | .pushsection .data..read_mostly ; \ |
4df8d22b IY |
32 | .align 8 ; \ |
33 | .global sym ; \ | |
34 | sym: ; \ | |
35 | data8 init_value ; \ | |
36 | .popsection | |
37 | ||
03f511dd IY |
38 | #define BRANCH(targ, reg, breg, type) \ |
39 | PARAVIRT_PATCH_SITE_BR(PARAVIRT_PATCH_TYPE_BR_ ## type) ; \ | |
40 | ;; \ | |
41 | movl reg=targ ; \ | |
42 | ;; \ | |
43 | ld8 reg=[reg] ; \ | |
44 | ;; \ | |
45 | mov breg=reg ; \ | |
4df8d22b IY |
46 | br.cond.sptk.many breg |
47 | ||
03f511dd IY |
48 | #define BRANCH_PROC(sym, reg, breg, type) \ |
49 | DATA8(paravirt_ ## sym ## _targ, ia64_native_ ## sym) ; \ | |
50 | GLOBAL_ENTRY(paravirt_ ## sym) ; \ | |
51 | BRANCH(paravirt_ ## sym ## _targ, reg, breg, type) ; \ | |
4df8d22b IY |
52 | END(paravirt_ ## sym) |
53 | ||
03f511dd IY |
54 | #define BRANCH_PROC_UNWINFO(sym, reg, breg, type) \ |
55 | DATA8(paravirt_ ## sym ## _targ, ia64_native_ ## sym) ; \ | |
56 | GLOBAL_ENTRY(paravirt_ ## sym) ; \ | |
57 | PT_REGS_UNWIND_INFO(0) ; \ | |
58 | BRANCH(paravirt_ ## sym ## _targ, reg, breg, type) ; \ | |
4df8d22b IY |
59 | END(paravirt_ ## sym) |
60 | ||
61 | ||
03f511dd IY |
62 | BRANCH_PROC(switch_to, r22, b7, SWITCH_TO) |
63 | BRANCH_PROC_UNWINFO(leave_syscall, r22, b7, LEAVE_SYSCALL) | |
64 | BRANCH_PROC(work_processed_syscall, r2, b7, WORK_PROCESSED_SYSCALL) | |
65 | BRANCH_PROC_UNWINFO(leave_kernel, r22, b7, LEAVE_KERNEL) | |
bf7ab02f IY |
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 |