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