mirror of
https://github.com/torvalds/linux.git
synced 2024-11-15 08:31:55 +00:00
4fb2847437
Instruction fault status register, IFSR, was introduced on ARMv6 to provide status information about the last insturction fault. It needed for proper prefetch abort handling. Now we have three prefetch abort model: * legacy - for CPUs before ARMv6. They doesn't provide neither IFSR nor IFAR. We simulate IFSR with section translation fault status for them to generalize code; * ARMv6 - provides IFSR, but not IFAR; * ARMv7 - provides both IFSR and IFAR. Signed-off-by: Kirill A. Shutemov <kirill@shutemov.name> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
164 lines
3.4 KiB
C
164 lines
3.4 KiB
C
/*
|
|
* arch/arm/include/asm/glue.h
|
|
*
|
|
* Copyright (C) 1997-1999 Russell King
|
|
* Copyright (C) 2000-2002 Deep Blue Solutions Ltd.
|
|
*
|
|
* 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.
|
|
*
|
|
* This file provides the glue to stick the processor-specific bits
|
|
* into the kernel in an efficient manner. The idea is to use branches
|
|
* when we're only targetting one class of TLB, or indirect calls
|
|
* when we're targetting multiple classes of TLBs.
|
|
*/
|
|
#ifdef __KERNEL__
|
|
|
|
|
|
#ifdef __STDC__
|
|
#define ____glue(name,fn) name##fn
|
|
#else
|
|
#define ____glue(name,fn) name/**/fn
|
|
#endif
|
|
#define __glue(name,fn) ____glue(name,fn)
|
|
|
|
|
|
|
|
/*
|
|
* Data Abort Model
|
|
* ================
|
|
*
|
|
* We have the following to choose from:
|
|
* arm6 - ARM6 style
|
|
* arm7 - ARM7 style
|
|
* v4_early - ARMv4 without Thumb early abort handler
|
|
* v4t_late - ARMv4 with Thumb late abort handler
|
|
* v4t_early - ARMv4 with Thumb early abort handler
|
|
* v5tej_early - ARMv5 with Thumb and Java early abort handler
|
|
* xscale - ARMv5 with Thumb with Xscale extensions
|
|
* v6_early - ARMv6 generic early abort handler
|
|
* v7_early - ARMv7 generic early abort handler
|
|
*/
|
|
#undef CPU_DABORT_HANDLER
|
|
#undef MULTI_DABORT
|
|
|
|
#if defined(CONFIG_CPU_ARM610)
|
|
# ifdef CPU_DABORT_HANDLER
|
|
# define MULTI_DABORT 1
|
|
# else
|
|
# define CPU_DABORT_HANDLER cpu_arm6_data_abort
|
|
# endif
|
|
#endif
|
|
|
|
#if defined(CONFIG_CPU_ARM710)
|
|
# ifdef CPU_DABORT_HANDLER
|
|
# define MULTI_DABORT 1
|
|
# else
|
|
# define CPU_DABORT_HANDLER cpu_arm7_data_abort
|
|
# endif
|
|
#endif
|
|
|
|
#ifdef CONFIG_CPU_ABRT_LV4T
|
|
# ifdef CPU_DABORT_HANDLER
|
|
# define MULTI_DABORT 1
|
|
# else
|
|
# define CPU_DABORT_HANDLER v4t_late_abort
|
|
# endif
|
|
#endif
|
|
|
|
#ifdef CONFIG_CPU_ABRT_EV4
|
|
# ifdef CPU_DABORT_HANDLER
|
|
# define MULTI_DABORT 1
|
|
# else
|
|
# define CPU_DABORT_HANDLER v4_early_abort
|
|
# endif
|
|
#endif
|
|
|
|
#ifdef CONFIG_CPU_ABRT_EV4T
|
|
# ifdef CPU_DABORT_HANDLER
|
|
# define MULTI_DABORT 1
|
|
# else
|
|
# define CPU_DABORT_HANDLER v4t_early_abort
|
|
# endif
|
|
#endif
|
|
|
|
#ifdef CONFIG_CPU_ABRT_EV5TJ
|
|
# ifdef CPU_DABORT_HANDLER
|
|
# define MULTI_DABORT 1
|
|
# else
|
|
# define CPU_DABORT_HANDLER v5tj_early_abort
|
|
# endif
|
|
#endif
|
|
|
|
#ifdef CONFIG_CPU_ABRT_EV5T
|
|
# ifdef CPU_DABORT_HANDLER
|
|
# define MULTI_DABORT 1
|
|
# else
|
|
# define CPU_DABORT_HANDLER v5t_early_abort
|
|
# endif
|
|
#endif
|
|
|
|
#ifdef CONFIG_CPU_ABRT_EV6
|
|
# ifdef CPU_DABORT_HANDLER
|
|
# define MULTI_DABORT 1
|
|
# else
|
|
# define CPU_DABORT_HANDLER v6_early_abort
|
|
# endif
|
|
#endif
|
|
|
|
#ifdef CONFIG_CPU_ABRT_EV7
|
|
# ifdef CPU_DABORT_HANDLER
|
|
# define MULTI_DABORT 1
|
|
# else
|
|
# define CPU_DABORT_HANDLER v7_early_abort
|
|
# endif
|
|
#endif
|
|
|
|
#ifndef CPU_DABORT_HANDLER
|
|
#error Unknown data abort handler type
|
|
#endif
|
|
|
|
/*
|
|
* Prefetch Abort Model
|
|
* ================
|
|
*
|
|
* We have the following to choose from:
|
|
* legacy - no IFSR, no IFAR
|
|
* v6 - ARMv6: IFSR, no IFAR
|
|
* v7 - ARMv7: IFSR and IFAR
|
|
*/
|
|
|
|
#undef CPU_PABORT_HANDLER
|
|
#undef MULTI_PABORT
|
|
|
|
#ifdef CONFIG_CPU_PABRT_LEGACY
|
|
# ifdef CPU_PABORT_HANDLER
|
|
# define MULTI_PABORT 1
|
|
# else
|
|
# define CPU_PABORT_HANDLER legacy_pabort
|
|
# endif
|
|
#endif
|
|
|
|
#ifdef CONFIG_CPU_PABRT_V6
|
|
# ifdef CPU_PABORT_HANDLER
|
|
# define MULTI_PABORT 1
|
|
# else
|
|
# define CPU_PABORT_HANDLER v6_pabort
|
|
# endif
|
|
#endif
|
|
|
|
#ifdef CONFIG_CPU_PABRT_V7
|
|
# ifdef CPU_PABORT_HANDLER
|
|
# define MULTI_PABORT 1
|
|
# else
|
|
# define CPU_PABORT_HANDLER v7_pabort
|
|
# endif
|
|
#endif
|
|
|
|
#ifndef CPU_PABORT_HANDLER
|
|
#error Unknown prefetch abort handler type
|
|
#endif
|
|
|
|
#endif
|