2005-04-16 15:20:36 -07:00
/*
2008-08-02 10:55:55 +01:00
* arch / arm / include / asm / processor . h
2005-04-16 15:20:36 -07:00
*
* Copyright ( C ) 1995 - 1999 Russell King
*
* 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 .
*/
# ifndef __ASM_ARM_PROCESSOR_H
# define __ASM_ARM_PROCESSOR_H
/*
* Default implementation of macro that returns current
* instruction pointer ( " program counter " ) .
*/
# define current_text_addr() ({ __label__ _l; _l: &&_l;})
# ifdef __KERNEL__
2010-09-03 10:42:55 +01:00
# include <asm/hw_breakpoint.h>
2005-04-16 15:20:36 -07:00
# include <asm/ptrace.h>
# include <asm/types.h>
2013-07-02 12:10:42 +01:00
# include <asm/unified.h>
2005-04-16 15:20:36 -07:00
2008-02-08 04:19:26 -08:00
# ifdef __KERNEL__
2008-12-05 03:25:47 +01:00
# define STACK_TOP ((current->personality & ADDR_LIMIT_32BIT) ? \
2008-02-08 04:19:26 -08:00
TASK_SIZE : TASK_SIZE_26 )
# define STACK_TOP_MAX TASK_SIZE
# endif
2005-04-16 15:20:36 -07:00
struct debug_info {
2010-09-03 10:42:55 +01:00
# ifdef CONFIG_HAVE_HW_BREAKPOINT
struct perf_event * hbp [ ARM_MAX_HBP_SLOTS ] ;
# endif
2005-04-16 15:20:36 -07:00
} ;
struct thread_struct {
/* fault info */
unsigned long address ;
unsigned long trap_no ;
unsigned long error_code ;
/* debugging */
struct debug_info debug ;
} ;
2017-08-16 14:09:13 -07:00
/*
* Everything usercopied to / from thread_struct is statically - sized , so
* no hardened usercopy whitelist is needed .
*/
static inline void arch_thread_struct_whitelist ( unsigned long * offset ,
unsigned long * size )
{
* offset = * size = 0 ;
}
2005-04-16 15:20:36 -07:00
# define INIT_THREAD { }
# define start_thread(regs,pc,sp) \
( { \
2017-07-28 18:48:48 -04:00
unsigned long r7 , r8 , r9 ; \
\
if ( IS_ENABLED ( CONFIG_BINFMT_ELF_FDPIC ) ) { \
r7 = regs - > ARM_r7 ; \
r8 = regs - > ARM_r8 ; \
r9 = regs - > ARM_r9 ; \
} \
2008-10-27 11:24:09 +00:00
memset ( regs - > uregs , 0 , sizeof ( regs - > uregs ) ) ; \
2017-07-28 18:48:48 -04:00
if ( IS_ENABLED ( CONFIG_BINFMT_ELF_FDPIC ) & & \
current - > personality & FDPIC_FUNCPTRS ) { \
regs - > ARM_r7 = r7 ; \
regs - > ARM_r8 = r8 ; \
regs - > ARM_r9 = r9 ; \
regs - > ARM_r10 = current - > mm - > start_data ; \
} else if ( ! IS_ENABLED ( CONFIG_MMU ) ) \
regs - > ARM_r10 = current - > mm - > start_data ; \
2005-04-16 15:20:36 -07:00
if ( current - > personality & ADDR_LIMIT_32BIT ) \
regs - > ARM_cpsr = USR_MODE ; \
else \
regs - > ARM_cpsr = USR26_MODE ; \
if ( elf_hwcap & HWCAP_THUMB & & pc & 1 ) \
regs - > ARM_cpsr | = PSR_T_BIT ; \
2009-05-30 14:00:18 +01:00
regs - > ARM_cpsr | = PSR_ENDSTATE ; \
2005-04-16 15:20:36 -07:00
regs - > ARM_pc = pc & ~ 1 ; /* pc */ \
regs - > ARM_sp = sp ; /* sp */ \
} )
/* Forward declaration, a strange C thing */
struct task_struct ;
/* Free all resources held by a thread. */
extern void release_thread ( struct task_struct * ) ;
unsigned long get_wchan ( struct task_struct * p ) ;
2011-03-04 12:38:54 +01:00
# if __LINUX_ARM_ARCH__ == 6 || defined(CONFIG_ARM_ERRATA_754327)
2010-06-21 15:29:03 +01:00
# define cpu_relax() smp_mb()
# else
2005-04-16 15:20:36 -07:00
# define cpu_relax() barrier()
2010-06-21 15:29:03 +01:00
# endif
2005-04-16 15:20:36 -07:00
2006-01-12 01:05:57 -08:00
# define task_pt_regs(p) \
2006-01-12 01:05:58 -08:00
( ( struct pt_regs * ) ( THREAD_START_SP + task_stack_page ( p ) ) - 1 )
2006-01-12 01:05:57 -08:00
# define KSTK_EIP(tsk) task_pt_regs(tsk)->ARM_pc
# define KSTK_ESP(tsk) task_pt_regs(tsk)->ARM_sp
2005-04-16 15:20:36 -07:00
2013-07-02 12:10:42 +01:00
# ifdef CONFIG_SMP
# define __ALT_SMP_ASM(smp, up) \
" 9998: " smp " \n " \
" .pushsection \" .alt.smp.init \" , \" a \" \n " \
" .long 9998b \n " \
" " up " \n " \
" .popsection \n "
# else
# define __ALT_SMP_ASM(smp, up) up
# endif
2005-04-16 15:20:36 -07:00
/*
* Prefetching support - only ARMv5 .
*/
# if __LINUX_ARM_ARCH__ >= 5
# define ARCH_HAS_PREFETCH
2006-12-13 18:39:26 +01:00
static inline void prefetch ( const void * ptr )
{
__asm__ __volatile__ (
2008-08-12 22:10:59 +01:00
" pld \t %a0 "
2013-06-26 16:47:35 +01:00
: : " p " ( ptr ) ) ;
2006-12-13 18:39:26 +01:00
}
2005-04-16 15:20:36 -07:00
2013-06-26 17:03:40 +01:00
# if __LINUX_ARM_ARCH__ >= 7 && defined(CONFIG_SMP)
2005-04-16 15:20:36 -07:00
# define ARCH_HAS_PREFETCHW
2013-06-26 17:03:40 +01:00
static inline void prefetchw ( const void * ptr )
{
__asm__ __volatile__ (
" .arch_extension mp \n "
__ALT_SMP_ASM (
WASM ( pldw ) " \t %a0 " ,
WASM ( pld ) " \t %a0 "
)
: : " p " ( ptr ) ) ;
}
# endif
2005-04-16 15:20:36 -07:00
# endif
2011-11-22 04:01:07 +01:00
# define HAVE_ARCH_PICK_MMAP_LAYOUT
2005-04-16 15:20:36 -07:00
# endif
# endif /* __ASM_ARM_PROCESSOR_H */