.. | .. |
---|
| 1 | +/* SPDX-License-Identifier: GPL-2.0-only */ |
---|
1 | 2 | /* |
---|
2 | 3 | * linux/arch/arm/vfp/vfphw.S |
---|
3 | 4 | * |
---|
4 | 5 | * Copyright (C) 2004 ARM Limited. |
---|
5 | 6 | * Written by Deep Blue Solutions Limited. |
---|
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 version 2 as |
---|
9 | | - * published by the Free Software Foundation. |
---|
10 | 7 | * |
---|
11 | 8 | * This code is called from the kernel's undefined instruction trap. |
---|
12 | 9 | * r9 holds the return address for successful handling. |
---|
.. | .. |
---|
81 | 78 | ENTRY(vfp_support_entry) |
---|
82 | 79 | DBGSTR3 "instr %08x pc %08x state %p", r0, r2, r10 |
---|
83 | 80 | |
---|
84 | | - ldr r3, [sp, #S_PSR] @ Neither lazy restore nor FP exceptions |
---|
85 | | - and r3, r3, #MODE_MASK @ are supported in kernel mode |
---|
86 | | - teq r3, #USR_MODE |
---|
87 | | - bne vfp_kmode_exception @ Returns through lr |
---|
88 | | - |
---|
| 81 | + .fpu vfpv2 |
---|
89 | 82 | VFPFMRX r1, FPEXC @ Is the VFP enabled? |
---|
90 | 83 | DBGSTR1 "fpexc %08x", r1 |
---|
91 | 84 | tst r1, #FPEXC_EN |
---|
.. | .. |
---|
261 | 254 | |
---|
262 | 255 | ENTRY(vfp_get_float) |
---|
263 | 256 | tbl_branch r0, r3, #3 |
---|
| 257 | + .fpu vfpv2 |
---|
264 | 258 | .irp dr,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 |
---|
265 | | -1: mrc p10, 0, r0, c\dr, c0, 0 @ fmrs r0, s0 |
---|
| 259 | +1: vmov r0, s\dr |
---|
266 | 260 | ret lr |
---|
267 | 261 | .org 1b + 8 |
---|
268 | | -1: mrc p10, 0, r0, c\dr, c0, 4 @ fmrs r0, s1 |
---|
| 262 | + .endr |
---|
| 263 | + .irp dr,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 |
---|
| 264 | +1: vmov r0, s\dr |
---|
269 | 265 | ret lr |
---|
270 | 266 | .org 1b + 8 |
---|
271 | 267 | .endr |
---|
.. | .. |
---|
273 | 269 | |
---|
274 | 270 | ENTRY(vfp_put_float) |
---|
275 | 271 | tbl_branch r1, r3, #3 |
---|
| 272 | + .fpu vfpv2 |
---|
276 | 273 | .irp dr,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 |
---|
277 | | -1: mcr p10, 0, r0, c\dr, c0, 0 @ fmsr r0, s0 |
---|
| 274 | +1: vmov s\dr, r0 |
---|
278 | 275 | ret lr |
---|
279 | 276 | .org 1b + 8 |
---|
280 | | -1: mcr p10, 0, r0, c\dr, c0, 4 @ fmsr r0, s1 |
---|
| 277 | + .endr |
---|
| 278 | + .irp dr,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 |
---|
| 279 | +1: vmov s\dr, r0 |
---|
281 | 280 | ret lr |
---|
282 | 281 | .org 1b + 8 |
---|
283 | 282 | .endr |
---|
.. | .. |
---|
285 | 284 | |
---|
286 | 285 | ENTRY(vfp_get_double) |
---|
287 | 286 | tbl_branch r0, r3, #3 |
---|
| 287 | + .fpu vfpv2 |
---|
288 | 288 | .irp dr,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 |
---|
289 | | -1: fmrrd r0, r1, d\dr |
---|
| 289 | +1: vmov r0, r1, d\dr |
---|
290 | 290 | ret lr |
---|
291 | 291 | .org 1b + 8 |
---|
292 | 292 | .endr |
---|
293 | 293 | #ifdef CONFIG_VFPv3 |
---|
294 | 294 | @ d16 - d31 registers |
---|
295 | | - .irp dr,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 |
---|
296 | | -1: mrrc p11, 3, r0, r1, c\dr @ fmrrd r0, r1, d\dr |
---|
| 295 | + .fpu vfpv3 |
---|
| 296 | + .irp dr,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 |
---|
| 297 | +1: vmov r0, r1, d\dr |
---|
297 | 298 | ret lr |
---|
298 | 299 | .org 1b + 8 |
---|
299 | 300 | .endr |
---|
.. | .. |
---|
307 | 308 | |
---|
308 | 309 | ENTRY(vfp_put_double) |
---|
309 | 310 | tbl_branch r2, r3, #3 |
---|
| 311 | + .fpu vfpv2 |
---|
310 | 312 | .irp dr,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 |
---|
311 | | -1: fmdrr d\dr, r0, r1 |
---|
| 313 | +1: vmov d\dr, r0, r1 |
---|
312 | 314 | ret lr |
---|
313 | 315 | .org 1b + 8 |
---|
314 | 316 | .endr |
---|
315 | 317 | #ifdef CONFIG_VFPv3 |
---|
| 318 | + .fpu vfpv3 |
---|
316 | 319 | @ d16 - d31 registers |
---|
317 | | - .irp dr,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 |
---|
318 | | -1: mcrr p11, 3, r0, r1, c\dr @ fmdrr r0, r1, d\dr |
---|
| 320 | + .irp dr,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 |
---|
| 321 | +1: vmov d\dr, r0, r1 |
---|
319 | 322 | ret lr |
---|
320 | 323 | .org 1b + 8 |
---|
321 | 324 | .endr |
---|