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>
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 ;
} ;
# define INIT_THREAD { }
2006-01-13 21:04:17 +00:00
# ifdef CONFIG_MMU
# define nommu_start_thread(regs) do { } while (0)
# else
# define nommu_start_thread(regs) regs->ARM_r10 = current->mm->start_data
# endif
2005-04-16 15:20:36 -07:00
# define start_thread(regs,pc,sp) \
( { \
unsigned long * stack = ( unsigned long * ) sp ; \
set_fs ( USER_DS ) ; \
2008-10-27 11:24:09 +00:00
memset ( regs - > uregs , 0 , sizeof ( regs - > uregs ) ) ; \
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 */ \
regs - > ARM_r2 = stack [ 2 ] ; /* r2 (envp) */ \
regs - > ARM_r1 = stack [ 1 ] ; /* r1 (argv) */ \
regs - > ARM_r0 = stack [ 0 ] ; /* r0 (argc) */ \
2006-01-13 21:04:17 +00:00
nommu_start_thread ( regs ) ; \
2005-04-16 15:20:36 -07:00
} )
/* Forward declaration, a strange C thing */
struct task_struct ;
/* Free all resources held by a thread. */
extern void release_thread ( struct task_struct * ) ;
/* Prepare to copy thread state - unlazy all lazy status */
# define prepare_to_copy(tsk) do { } while (0)
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
/*
* Create a new kernel thread
*/
extern int kernel_thread ( int ( * fn ) ( void * ) , void * arg , unsigned long flags ) ;
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
/*
* 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 "
2006-12-13 18:39:26 +01:00
:
2008-08-12 22:10:59 +01:00
: " p " ( ptr )
2006-12-13 18:39:26 +01:00
: " cc " ) ;
}
2005-04-16 15:20:36 -07:00
# define ARCH_HAS_PREFETCHW
# define prefetchw(ptr) prefetch(ptr)
# define ARCH_HAS_SPINLOCK_PREFETCH
# define spin_lock_prefetch(x) do { } while (0)
# endif
# endif
# endif /* __ASM_ARM_PROCESSOR_H */