diff options
Diffstat (limited to 'arch/ia64')
-rw-r--r-- | arch/ia64/kernel/pal.S | 47 |
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 | */ |
30 | GLOBAL_ENTRY(ia64_pal_handler_init) | 31 | GLOBAL_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) | |||
36 | END(ia64_pal_handler_init) | 37 | END(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 | */ |
43 | GLOBAL_ENTRY(ia64_pal_default_handler) | 44 | GLOBAL_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 | */ |
97 | GLOBAL_ENTRY(ia64_pal_call_stacked) | 98 | GLOBAL_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 | */ |
204 | GLOBAL_ENTRY(ia64_pal_call_phys_stacked) | 204 | GLOBAL_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 |
208 | 1: { | 208 | 1: { |
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) | |||
252 | END(ia64_pal_call_phys_stacked) | 252 | END(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 |