| .. | .. |
|---|
| 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 |
|---|