diff options
author | Marc Zyngier <marc.zyngier@arm.com> | 2018-08-24 10:08:29 -0400 |
---|---|---|
committer | Will Deacon <will.deacon@arm.com> | 2018-08-29 06:42:20 -0400 |
commit | 1d8f574708a3fb6f18c85486d0c5217df893c0cf (patch) | |
tree | ed4ddd0ac3cfb2f14206a832d3ddf265b2f0bcbe | |
parent | afce0cc9ad8aa510650e781a51e43c26e2a34cf6 (diff) |
arm/arm64: smccc-1.1: Make return values unsigned long
An unfortunate consequence of having a strong typing for the input
values to the SMC call is that it also affects the type of the
return values, limiting r0 to 32 bits and r{1,2,3} to whatever
was passed as an input.
Let's turn everything into "unsigned long", which satisfies the
requirements of both architectures, and allows for the full
range of return values.
Reported-by: Julien Grall <julien.grall@arm.com>
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
-rw-r--r-- | include/linux/arm-smccc.h | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/include/linux/arm-smccc.h b/include/linux/arm-smccc.h index ca1d2cc2cdfa..5a91ff33720b 100644 --- a/include/linux/arm-smccc.h +++ b/include/linux/arm-smccc.h | |||
@@ -199,31 +199,31 @@ asmlinkage void __arm_smccc_hvc(unsigned long a0, unsigned long a1, | |||
199 | 199 | ||
200 | #define __declare_arg_0(a0, res) \ | 200 | #define __declare_arg_0(a0, res) \ |
201 | struct arm_smccc_res *___res = res; \ | 201 | struct arm_smccc_res *___res = res; \ |
202 | register u32 r0 asm("r0") = a0; \ | 202 | register unsigned long r0 asm("r0") = (u32)a0; \ |
203 | register unsigned long r1 asm("r1"); \ | 203 | register unsigned long r1 asm("r1"); \ |
204 | register unsigned long r2 asm("r2"); \ | 204 | register unsigned long r2 asm("r2"); \ |
205 | register unsigned long r3 asm("r3") | 205 | register unsigned long r3 asm("r3") |
206 | 206 | ||
207 | #define __declare_arg_1(a0, a1, res) \ | 207 | #define __declare_arg_1(a0, a1, res) \ |
208 | struct arm_smccc_res *___res = res; \ | 208 | struct arm_smccc_res *___res = res; \ |
209 | register u32 r0 asm("r0") = a0; \ | 209 | register unsigned long r0 asm("r0") = (u32)a0; \ |
210 | register typeof(a1) r1 asm("r1") = a1; \ | 210 | register unsigned long r1 asm("r1") = a1; \ |
211 | register unsigned long r2 asm("r2"); \ | 211 | register unsigned long r2 asm("r2"); \ |
212 | register unsigned long r3 asm("r3") | 212 | register unsigned long r3 asm("r3") |
213 | 213 | ||
214 | #define __declare_arg_2(a0, a1, a2, res) \ | 214 | #define __declare_arg_2(a0, a1, a2, res) \ |
215 | struct arm_smccc_res *___res = res; \ | 215 | struct arm_smccc_res *___res = res; \ |
216 | register u32 r0 asm("r0") = a0; \ | 216 | register unsigned long r0 asm("r0") = (u32)a0; \ |
217 | register typeof(a1) r1 asm("r1") = a1; \ | 217 | register unsigned long r1 asm("r1") = a1; \ |
218 | register typeof(a2) r2 asm("r2") = a2; \ | 218 | register unsigned long r2 asm("r2") = a2; \ |
219 | register unsigned long r3 asm("r3") | 219 | register unsigned long r3 asm("r3") |
220 | 220 | ||
221 | #define __declare_arg_3(a0, a1, a2, a3, res) \ | 221 | #define __declare_arg_3(a0, a1, a2, a3, res) \ |
222 | struct arm_smccc_res *___res = res; \ | 222 | struct arm_smccc_res *___res = res; \ |
223 | register u32 r0 asm("r0") = a0; \ | 223 | register unsigned long r0 asm("r0") = (u32)a0; \ |
224 | register typeof(a1) r1 asm("r1") = a1; \ | 224 | register unsigned long r1 asm("r1") = a1; \ |
225 | register typeof(a2) r2 asm("r2") = a2; \ | 225 | register unsigned long r2 asm("r2") = a2; \ |
226 | register typeof(a3) r3 asm("r3") = a3 | 226 | register unsigned long r3 asm("r3") = a3 |
227 | 227 | ||
228 | #define __declare_arg_4(a0, a1, a2, a3, a4, res) \ | 228 | #define __declare_arg_4(a0, a1, a2, a3, a4, res) \ |
229 | __declare_arg_3(a0, a1, a2, a3, res); \ | 229 | __declare_arg_3(a0, a1, a2, a3, res); \ |