processor.h 3.02 KB
Newer Older
Linus Torvalds's avatar
Linus Torvalds committed
1
/*
2
 *  arch/arm/include/asm/processor.h
Linus Torvalds's avatar
Linus Torvalds committed
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 *
 *  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__

22
#include <asm/hw_breakpoint.h>
Linus Torvalds's avatar
Linus Torvalds committed
23
24
25
#include <asm/ptrace.h>
#include <asm/types.h>

26
#ifdef __KERNEL__
27
#define STACK_TOP	((current->personality & ADDR_LIMIT_32BIT) ? \
28
29
30
31
			 TASK_SIZE : TASK_SIZE_26)
#define STACK_TOP_MAX	TASK_SIZE
#endif

Linus Torvalds's avatar
Linus Torvalds committed
32
struct debug_info {
33
34
35
#ifdef CONFIG_HAVE_HW_BREAKPOINT
	struct perf_event	*hbp[ARM_MAX_HBP_SLOTS];
#endif
Linus Torvalds's avatar
Linus Torvalds committed
36
37
38
39
40
41
42
43
44
45
46
47
48
};

struct thread_struct {
							/* fault info	  */
	unsigned long		address;
	unsigned long		trap_no;
	unsigned long		error_code;
							/* debugging	  */
	struct debug_info	debug;
};

#define INIT_THREAD  {	}

49
50
51
52
53
54
#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

Linus Torvalds's avatar
Linus Torvalds committed
55
56
57
#define start_thread(regs,pc,sp)					\
({									\
	unsigned long *stack = (unsigned long *)sp;			\
Russell King's avatar
Russell King committed
58
	memset(regs->uregs, 0, sizeof(regs->uregs));			\
Linus Torvalds's avatar
Linus Torvalds committed
59
60
61
62
63
64
	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;				\
65
	regs->ARM_cpsr |= PSR_ENDSTATE;					\
Linus Torvalds's avatar
Linus Torvalds committed
66
67
68
69
70
	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) */			\
71
	nommu_start_thread(regs);					\
Linus Torvalds's avatar
Linus Torvalds committed
72
73
74
75
76
77
78
79
80
81
82
83
84
})

/* 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);

85
#if __LINUX_ARM_ARCH__ == 6 || defined(CONFIG_ARM_ERRATA_754327)
86
87
#define cpu_relax()			smp_mb()
#else
Linus Torvalds's avatar
Linus Torvalds committed
88
#define cpu_relax()			barrier()
89
#endif
Linus Torvalds's avatar
Linus Torvalds committed
90
91
92
93
94
95

/*
 * Create a new kernel thread
 */
extern int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);

Al Viro's avatar
Al Viro committed
96
#define task_pt_regs(p) \
Al Viro's avatar
Al Viro committed
97
	((struct pt_regs *)(THREAD_START_SP + task_stack_page(p)) - 1)
Al Viro's avatar
Al Viro committed
98
99
100

#define KSTK_EIP(tsk)	task_pt_regs(tsk)->ARM_pc
#define KSTK_ESP(tsk)	task_pt_regs(tsk)->ARM_sp
Linus Torvalds's avatar
Linus Torvalds committed
101
102
103
104
105
106
107

/*
 * Prefetching support - only ARMv5.
 */
#if __LINUX_ARM_ARCH__ >= 5

#define ARCH_HAS_PREFETCH
108
109
110
static inline void prefetch(const void *ptr)
{
	__asm__ __volatile__(
111
		"pld\t%a0"
112
		:
113
		: "p" (ptr)
114
115
		: "cc");
}
Linus Torvalds's avatar
Linus Torvalds committed
116
117
118
119
120
121
122
123
124

#define ARCH_HAS_PREFETCHW
#define prefetchw(ptr)	prefetch(ptr)

#define ARCH_HAS_SPINLOCK_PREFETCH
#define spin_lock_prefetch(x) do { } while (0)

#endif

125
126
#define HAVE_ARCH_PICK_MMAP_LAYOUT

Linus Torvalds's avatar
Linus Torvalds committed
127
128
129
#endif

#endif /* __ASM_ARM_PROCESSOR_H */