Branch data Line data Source code
1 : : /*
2 : : * arch/arm/include/asm/processor.h
3 : : *
4 : : * Copyright (C) 1995-1999 Russell King
5 : : *
6 : : * This program is free software; you can redistribute it and/or modify
7 : : * it under the terms of the GNU General Public License version 2 as
8 : : * published by the Free Software Foundation.
9 : : */
10 : :
11 : : #ifndef __ASM_ARM_PROCESSOR_H
12 : : #define __ASM_ARM_PROCESSOR_H
13 : :
14 : : /*
15 : : * Default implementation of macro that returns current
16 : : * instruction pointer ("program counter").
17 : : */
18 : : #define current_text_addr() ({ __label__ _l; _l: &&_l;})
19 : :
20 : : #ifdef __KERNEL__
21 : :
22 : : #include <asm/hw_breakpoint.h>
23 : : #include <asm/ptrace.h>
24 : : #include <asm/types.h>
25 : : #include <asm/unified.h>
26 : :
27 : : #ifdef __KERNEL__
28 : : #define STACK_TOP ((current->personality & ADDR_LIMIT_32BIT) ? \
29 : : TASK_SIZE : TASK_SIZE_26)
30 : : #define STACK_TOP_MAX TASK_SIZE
31 : : #endif
32 : :
33 : : struct debug_info {
34 : : #ifdef CONFIG_HAVE_HW_BREAKPOINT
35 : : struct perf_event *hbp[ARM_MAX_HBP_SLOTS];
36 : : #endif
37 : : };
38 : :
39 : : struct thread_struct {
40 : : /* fault info */
41 : : unsigned long address;
42 : : unsigned long trap_no;
43 : : unsigned long error_code;
44 : : /* debugging */
45 : : struct debug_info debug;
46 : : };
47 : :
48 : : #define INIT_THREAD { }
49 : :
50 : : #ifdef CONFIG_MMU
51 : : #define nommu_start_thread(regs) do { } while (0)
52 : : #else
53 : : #define nommu_start_thread(regs) regs->ARM_r10 = current->mm->start_data
54 : : #endif
55 : :
56 : : #define start_thread(regs,pc,sp) \
57 : : ({ \
58 : : memset(regs->uregs, 0, sizeof(regs->uregs)); \
59 : : if (current->personality & ADDR_LIMIT_32BIT) \
60 : : regs->ARM_cpsr = USR_MODE; \
61 : : else \
62 : : regs->ARM_cpsr = USR26_MODE; \
63 : : if (elf_hwcap & HWCAP_THUMB && pc & 1) \
64 : : regs->ARM_cpsr |= PSR_T_BIT; \
65 : : regs->ARM_cpsr |= PSR_ENDSTATE; \
66 : : regs->ARM_pc = pc & ~1; /* pc */ \
67 : : regs->ARM_sp = sp; /* sp */ \
68 : : nommu_start_thread(regs); \
69 : : })
70 : :
71 : : /* Forward declaration, a strange C thing */
72 : : struct task_struct;
73 : :
74 : : /* Free all resources held by a thread. */
75 : : extern void release_thread(struct task_struct *);
76 : :
77 : : unsigned long get_wchan(struct task_struct *p);
78 : :
79 : : #if __LINUX_ARM_ARCH__ == 6 || defined(CONFIG_ARM_ERRATA_754327)
80 : : #define cpu_relax() smp_mb()
81 : : #else
82 : : #define cpu_relax() barrier()
83 : : #endif
84 : :
85 : : #define task_pt_regs(p) \
86 : : ((struct pt_regs *)(THREAD_START_SP + task_stack_page(p)) - 1)
87 : :
88 : : #define KSTK_EIP(tsk) task_pt_regs(tsk)->ARM_pc
89 : : #define KSTK_ESP(tsk) task_pt_regs(tsk)->ARM_sp
90 : :
91 : : #ifdef CONFIG_SMP
92 : : #define __ALT_SMP_ASM(smp, up) \
93 : : "9998: " smp "\n" \
94 : : " .pushsection \".alt.smp.init\", \"a\"\n" \
95 : : " .long 9998b\n" \
96 : : " " up "\n" \
97 : : " .popsection\n"
98 : : #else
99 : : #define __ALT_SMP_ASM(smp, up) up
100 : : #endif
101 : :
102 : : /*
103 : : * Prefetching support - only ARMv5.
104 : : */
105 : : #if __LINUX_ARM_ARCH__ >= 5
106 : :
107 : : #define ARCH_HAS_PREFETCH
108 : : static inline void prefetch(const void *ptr)
109 : : {
110 : 16388340 : __asm__ __volatile__(
111 : : "pld\t%a0"
112 : : :: "p" (ptr));
113 : : }
114 : :
115 : : #if __LINUX_ARM_ARCH__ >= 7 && defined(CONFIG_SMP)
116 : : #define ARCH_HAS_PREFETCHW
117 : : static inline void prefetchw(const void *ptr)
118 : : {
119 : 2485253941 : __asm__ __volatile__(
120 : : ".arch_extension mp\n"
121 : : __ALT_SMP_ASM(
122 : : WASM(pldw) "\t%a0",
123 : : WASM(pld) "\t%a0"
124 : : )
125 : : :: "p" (ptr));
126 : : }
127 : : #endif
128 : : #endif
129 : :
130 : : #define HAVE_ARCH_PICK_MMAP_LAYOUT
131 : :
132 : : #endif
133 : :
134 : : #endif /* __ASM_ARM_PROCESSOR_H */
|