1/* SPDX-License-Identifier: GPL-2.0-only */ 2/* 3 * linux/arch/arm/vfp/entry.S 4 * 5 * Copyright (C) 2004 ARM Limited. 6 * Written by Deep Blue Solutions Limited. 7 */ 8#include <linux/init.h> 9#include <linux/linkage.h> 10#include <asm/thread_info.h> 11#include <asm/vfpmacros.h> 12#include <asm/assembler.h> 13#include <asm/asm-offsets.h> 14 15@ VFP entry point. 16@ 17@ r0 = instruction opcode (32-bit ARM or two 16-bit Thumb) 18@ r2 = PC value to resume execution after successful emulation 19@ r9 = normal "successful" return address 20@ r10 = this threads thread_info structure 21@ lr = unrecognised instruction return address 22@ IRQs enabled. 23@ 24ENTRY(do_vfp) 25 inc_preempt_count r10, r4 26 ldr r4, .LCvfp 27 ldr r11, [r10, #TI_CPU] @ CPU number 28 add r10, r10, #TI_VFPSTATE @ r10 = workspace 29 ldr pc, [r4] @ call VFP entry point 30ENDPROC(do_vfp) 31 32ENTRY(vfp_null_entry) 33 dec_preempt_count_ti r10, r4 34 ret lr 35ENDPROC(vfp_null_entry) 36 37 .align 2 38.LCvfp: 39 .word vfp_vector 40 41@ This code is called if the VFP does not exist. It needs to flag the 42@ failure to the VFP initialisation code. 43 44 __INIT 45ENTRY(vfp_testing_entry) 46 dec_preempt_count_ti r10, r4 47 ldr r0, VFP_arch_address 48 str r0, [r0] @ set to non-zero value 49 ret r9 @ we have handled the fault 50ENDPROC(vfp_testing_entry) 51 52 .align 2 53VFP_arch_address: 54 .word VFP_arch 55 56 __FINIT 57