aboutsummaryrefslogtreecommitdiffstats
path: root/arch/ia64
diff options
context:
space:
mode:
Diffstat (limited to 'arch/ia64')
-rw-r--r--arch/ia64/kernel/pal.S47
1 files changed, 24 insertions, 23 deletions
diff --git a/arch/ia64/kernel/pal.S b/arch/ia64/kernel/pal.S
index 5f50e6bbc686..0b533441c3c9 100644
--- a/arch/ia64/kernel/pal.S
+++ b/arch/ia64/kernel/pal.S
@@ -21,11 +21,12 @@ pal_entry_point:
21 .text 21 .text
22 22
23/* 23/*
24 * Set the PAL entry point address. This could be written in C code, but we do it here 24 * Set the PAL entry point address. This could be written in C code, but we
25 * to keep it all in one module (besides, it's so trivial that it's 25 * do it here to keep it all in one module (besides, it's so trivial that it's
26 * not a big deal). 26 * not a big deal).
27 * 27 *
28 * in0 Address of the PAL entry point (text address, NOT a function descriptor). 28 * in0 Address of the PAL entry point (text address, NOT a function
29 * descriptor).
29 */ 30 */
30GLOBAL_ENTRY(ia64_pal_handler_init) 31GLOBAL_ENTRY(ia64_pal_handler_init)
31 alloc r3=ar.pfs,1,0,0,0 32 alloc r3=ar.pfs,1,0,0,0
@@ -36,9 +37,9 @@ GLOBAL_ENTRY(ia64_pal_handler_init)
36END(ia64_pal_handler_init) 37END(ia64_pal_handler_init)
37 38
38/* 39/*
39 * Default PAL call handler. This needs to be coded in assembly because it uses 40 * Default PAL call handler. This needs to be coded in assembly because it
40 * the static calling convention, i.e., the RSE may not be used and calls are 41 * uses the static calling convention, i.e., the RSE may not be used and
41 * done via "br.cond" (not "br.call"). 42 * calls are done via "br.cond" (not "br.call").
42 */ 43 */
43GLOBAL_ENTRY(ia64_pal_default_handler) 44GLOBAL_ENTRY(ia64_pal_default_handler)
44 mov r8=-1 45 mov r8=-1
@@ -91,8 +92,8 @@ END(ia64_pal_call_static)
91 * Make a PAL call using the stacked registers calling convention. 92 * Make a PAL call using the stacked registers calling convention.
92 * 93 *
93 * Inputs: 94 * Inputs:
94 * in0 Index of PAL service 95 * in0 Index of PAL service
95 * in2 - in3 Remaning PAL arguments 96 * in2 - in3 Remaining PAL arguments
96 */ 97 */
97GLOBAL_ENTRY(ia64_pal_call_stacked) 98GLOBAL_ENTRY(ia64_pal_call_stacked)
98 .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(4) 99 .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(4)
@@ -126,18 +127,18 @@ END(ia64_pal_call_stacked)
126 * Make a physical mode PAL call using the static registers calling convention. 127 * Make a physical mode PAL call using the static registers calling convention.
127 * 128 *
128 * Inputs: 129 * Inputs:
129 * in0 Index of PAL service 130 * in0 Index of PAL service
130 * in2 - in3 Remaning PAL arguments 131 * in2 - in3 Remaining PAL arguments
131 * 132 *
132 * PSR_LP, PSR_TB, PSR_ID, PSR_DA are never set by the kernel. 133 * PSR_LP, PSR_TB, PSR_ID, PSR_DA are never set by the kernel.
133 * So we don't need to clear them. 134 * So we don't need to clear them.
134 */ 135 */
135#define PAL_PSR_BITS_TO_CLEAR \ 136#define PAL_PSR_BITS_TO_CLEAR \
136 (IA64_PSR_I | IA64_PSR_IT | IA64_PSR_DT | IA64_PSR_DB | IA64_PSR_RT | \ 137 (IA64_PSR_I | IA64_PSR_IT | IA64_PSR_DT | IA64_PSR_DB | IA64_PSR_RT |\
137 IA64_PSR_DD | IA64_PSR_SS | IA64_PSR_RI | IA64_PSR_ED | \ 138 IA64_PSR_DD | IA64_PSR_SS | IA64_PSR_RI | IA64_PSR_ED | \
138 IA64_PSR_DFL | IA64_PSR_DFH) 139 IA64_PSR_DFL | IA64_PSR_DFH)
139 140
140#define PAL_PSR_BITS_TO_SET \ 141#define PAL_PSR_BITS_TO_SET \
141 (IA64_PSR_BN) 142 (IA64_PSR_BN)
142 143
143 144
@@ -173,7 +174,7 @@ GLOBAL_ENTRY(ia64_pal_call_phys_static)
173 ;; 174 ;;
174 andcm r16=loc3,r16 // removes bits to clear from psr 175 andcm r16=loc3,r16 // removes bits to clear from psr
175 br.call.sptk.many rp=ia64_switch_mode_phys 176 br.call.sptk.many rp=ia64_switch_mode_phys
176.ret1: mov rp = r8 // install return address (physical) 177 mov rp = r8 // install return address (physical)
177 mov loc5 = r19 178 mov loc5 = r19
178 mov loc6 = r20 179 mov loc6 = r20
179 br.cond.sptk.many b7 180 br.cond.sptk.many b7
@@ -183,7 +184,6 @@ GLOBAL_ENTRY(ia64_pal_call_phys_static)
183 mov r19=loc5 184 mov r19=loc5
184 mov r20=loc6 185 mov r20=loc6
185 br.call.sptk.many rp=ia64_switch_mode_virt // return to virtual mode 186 br.call.sptk.many rp=ia64_switch_mode_virt // return to virtual mode
186.ret2:
187 mov psr.l = loc3 // restore init PSR 187 mov psr.l = loc3 // restore init PSR
188 188
189 mov ar.pfs = loc1 189 mov ar.pfs = loc1
@@ -198,8 +198,8 @@ END(ia64_pal_call_phys_static)
198 * Make a PAL call using the stacked registers in physical mode. 198 * Make a PAL call using the stacked registers in physical mode.
199 * 199 *
200 * Inputs: 200 * Inputs:
201 * in0 Index of PAL service 201 * in0 Index of PAL service
202 * in2 - in3 Remaning PAL arguments 202 * in2 - in3 Remaining PAL arguments
203 */ 203 */
204GLOBAL_ENTRY(ia64_pal_call_phys_stacked) 204GLOBAL_ENTRY(ia64_pal_call_phys_stacked)
205 .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(5) 205 .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(5)
@@ -207,7 +207,7 @@ GLOBAL_ENTRY(ia64_pal_call_phys_stacked)
207 movl loc2 = pal_entry_point 207 movl loc2 = pal_entry_point
2081: { 2081: {
209 mov r28 = in0 // copy procedure index 209 mov r28 = in0 // copy procedure index
210 mov loc0 = rp // save rp 210 mov loc0 = rp // save rp
211 } 211 }
212 .body 212 .body
213 ;; 213 ;;
@@ -240,7 +240,7 @@ GLOBAL_ENTRY(ia64_pal_call_phys_stacked)
240 mov r16=loc3 // r16= original psr 240 mov r16=loc3 // r16= original psr
241 mov r19=loc5 241 mov r19=loc5
242 mov r20=loc6 242 mov r20=loc6
243 br.call.sptk.many rp=ia64_switch_mode_virt // return to virtual mode 243 br.call.sptk.many rp=ia64_switch_mode_virt // return to virtual mode
244 244
245 mov psr.l = loc3 // restore init PSR 245 mov psr.l = loc3 // restore init PSR
246 mov ar.pfs = loc1 246 mov ar.pfs = loc1
@@ -252,10 +252,11 @@ GLOBAL_ENTRY(ia64_pal_call_phys_stacked)
252END(ia64_pal_call_phys_stacked) 252END(ia64_pal_call_phys_stacked)
253 253
254/* 254/*
255 * Save scratch fp scratch regs which aren't saved in pt_regs already (fp10-fp15). 255 * Save scratch fp scratch regs which aren't saved in pt_regs already
256 * (fp10-fp15).
256 * 257 *
257 * NOTE: We need to do this since firmware (SAL and PAL) may use any of the scratch 258 * NOTE: We need to do this since firmware (SAL and PAL) may use any of the
258 * regs fp-low partition. 259 * scratch regs fp-low partition.
259 * 260 *
260 * Inputs: 261 * Inputs:
261 * in0 Address of stack storage for fp regs 262 * in0 Address of stack storage for fp regs