1 #ifndef _ASMARM_PROCESSOR_H_
2 #define _ASMARM_PROCESSOR_H_
3 /*
4 * Copyright (C) 2014, Red Hat Inc, Andrew Jones <drjones@redhat.com>
5 *
6 * This work is licensed under the terms of the GNU LGPL, version 2.
7 */
8 #include <asm/ptrace.h>
9 #include <asm/sysreg.h>
10 #include <asm/barrier.h>
11
12 enum vector {
13 EXCPTN_RST,
14 EXCPTN_UND,
15 EXCPTN_SVC,
16 EXCPTN_PABT,
17 EXCPTN_DABT,
18 EXCPTN_ADDREXCPTN,
19 EXCPTN_IRQ,
20 EXCPTN_FIQ,
21 EXCPTN_MAX,
22 };
23
24 typedef void (*irq_handler_fn)(struct pt_regs *regs);
25 typedef void (*exception_fn)(struct pt_regs *);
26
27 extern void install_exception_handler(enum vector v, exception_fn fn);
28
29 extern void show_regs(struct pt_regs *regs);
30
current_cpsr(void)31 static inline unsigned long current_cpsr(void)
32 {
33 unsigned long cpsr;
34 asm volatile("mrs %0, cpsr" : "=r" (cpsr));
35 return cpsr;
36 }
37
38 #define current_mode() (current_cpsr() & MODE_MASK)
39
local_irq_enable(void)40 static inline void local_irq_enable(void)
41 {
42 asm volatile("cpsie i" : : : "memory", "cc");
43 }
44
local_irq_disable(void)45 static inline void local_irq_disable(void)
46 {
47 asm volatile("cpsid i" : : : "memory", "cc");
48 }
49
50 #define MPIDR __ACCESS_CP15(c0, 0, c0, 5)
get_mpidr(void)51 static inline uint64_t get_mpidr(void)
52 {
53 return read_sysreg(MPIDR);
54 }
55
56 #define MPIDR_HWID_BITMASK 0xffffff
57 extern int mpidr_to_cpu(uint64_t mpidr);
58
59 #define MPIDR_LEVEL_SHIFT(level) \
60 (((1 << level) >> 1) << 3)
61 #define MPIDR_AFFINITY_LEVEL(mpidr, level) \
62 ((mpidr >> MPIDR_LEVEL_SHIFT(level)) & 0xff)
63
64 extern void start_usr(void (*func)(void *arg), void *arg, unsigned long sp_usr);
65 extern bool __mmu_enabled(void);
66 extern bool is_user(void);
67
68 #define CNTVCT __ACCESS_CP15_64(1, c14)
69 #define CNTFRQ __ACCESS_CP15(c14, 0, c0, 0)
70 #define CTR __ACCESS_CP15(c0, 0, c0, 1)
71 #define SCTRL __ACCESS_CP15(c1, 0, c0, 0)
72
get_cntvct(void)73 static inline u64 get_cntvct(void)
74 {
75 isb();
76 return read_sysreg(CNTVCT);
77 }
78
get_cntfrq(void)79 static inline u32 get_cntfrq(void)
80 {
81 return read_sysreg(CNTFRQ);
82 }
83
get_ctr(void)84 static inline u32 get_ctr(void)
85 {
86 return read_sysreg(CTR);
87 }
88
89 #endif /* _ASMARM_PROCESSOR_H_ */
90