2005-04-16 15:20:36 -07:00
/*
* linux / include / asm - arm / processor . h
*
* 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__
# include <asm/ptrace.h>
# include <asm/types.h>
union debug_insn {
u32 arm ;
u16 thumb ;
} ;
struct debug_entry {
u32 address ;
union debug_insn insn ;
} ;
struct debug_info {
int nsaved ;
struct debug_entry bp [ 2 ] ;
} ;
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 ) ; \
memzero ( regs - > uregs , sizeof ( regs - > uregs ) ) ; \
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 ; \
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 ) ;
# define cpu_relax() barrier()
/*
* 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__ (
" pld \t %0 "
:
: " o " ( * ( char * ) ptr )
: " 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 */