linux/arch/arm/vfp/entry.S
<<
>>
Prefs
   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