forked from Minki/linux
5d4cae5fe2
Fix a real section mismatch issue; the test code is thrown away after initialisation, but if we do not detect the VFP hardware, it is left hooked into the exception handler. Any VFP instructions which are subsequently executed risk calling the discarded exception handler. Introduce a new "null" handler which returns to the "unrecognised fault" return address. Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
53 lines
1.2 KiB
ArmAsm
53 lines
1.2 KiB
ArmAsm
/*
|
|
* linux/arch/arm/vfp/entry.S
|
|
*
|
|
* Copyright (C) 2004 ARM Limited.
|
|
* Written by Deep Blue Solutions Limited.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*
|
|
* Basic entry code, called from the kernel's undefined instruction trap.
|
|
* r0 = faulted instruction
|
|
* r5 = faulted PC+4
|
|
* r9 = successful return
|
|
* r10 = thread_info structure
|
|
* lr = failure return
|
|
*/
|
|
#include <linux/linkage.h>
|
|
#include <linux/init.h>
|
|
#include <asm/asm-offsets.h>
|
|
#include <asm/assembler.h>
|
|
#include <asm/vfpmacros.h>
|
|
|
|
.globl do_vfp
|
|
do_vfp:
|
|
enable_irq
|
|
ldr r4, .LCvfp
|
|
ldr r11, [r10, #TI_CPU] @ CPU number
|
|
add r10, r10, #TI_VFPSTATE @ r10 = workspace
|
|
ldr pc, [r4] @ call VFP entry point
|
|
|
|
ENTRY(vfp_null_entry)
|
|
mov pc, lr
|
|
ENDPROC(vfp_null_entry)
|
|
|
|
.LCvfp:
|
|
.word vfp_vector
|
|
|
|
@ This code is called if the VFP does not exist. It needs to flag the
|
|
@ failure to the VFP initialisation code.
|
|
|
|
__INIT
|
|
.globl vfp_testing_entry
|
|
vfp_testing_entry:
|
|
ldr r0, VFP_arch_address
|
|
str r5, [r0] @ known non-zero value
|
|
mov pc, r9 @ we have handled the fault
|
|
|
|
VFP_arch_address:
|
|
.word VFP_arch
|
|
|
|
__FINIT
|