summaryrefslogtreecommitdiff
path: root/include/linux/regs_debug.h
blob: 971efd2d87e5c13f6260e1d6418de22e1e50a295 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#ifndef _REGS_DEBUG_
#define _REGS_DEBUG_

#include <linux/smp.h>
#include <linux/threads.h>
#include <linux/jiffies.h>

struct sprd_debug_regs_access{
	unsigned long vaddr;
	unsigned long stack;
	unsigned long pc;
	unsigned long time;
	unsigned int status;
	u32 value;
};
#ifdef CONFIG_64BIT
#define sprd_debug_regs_read_start(a)	({unsigned long cpu_id, stack, lr, tmp;	\
		asm volatile(						\
			"	mrs %3,mpidr_el1\n"	\
			"	ands %0, %3, #0xf\n"			\
			"	lsr %3,%3,#8\n"			\
			"	ands %3, %3, #0xf\n"			\
			"	lsl %3,%3,#2\n"			\
			"	add %0,%0,%3\n"			\
			"	mov %2, sp\n"				\
			"	mov %1, x30\n"				\
			: "=&r" (cpu_id), "=&r" (lr), "=&r" (stack), "=&r" (tmp)\
			:						\
			: "memory");					\
		if(sprd_debug_last_regs_access){			\
		sprd_debug_last_regs_access[cpu_id].value = 0;		\
		sprd_debug_last_regs_access[cpu_id].vaddr = (unsigned long)a;	\
		sprd_debug_last_regs_access[cpu_id].stack = stack;	\
		sprd_debug_last_regs_access[cpu_id].pc = lr;		\
		sprd_debug_last_regs_access[cpu_id].status = 0;}	\
		})

#define sprd_debug_regs_write_start(v, a)	({unsigned long cpu_id, stack, lr, tmp;	\
		asm volatile(						\
			"	mrs %3,mpidr_el1\n"	\
			"	ands %0, %3, #0xf\n"			\
			"	lsr %3,%3,#8\n"			\
			"	ands %3, %3, #0xf\n"			\
			"	lsl %3,%3,#2\n"			\
			"	add %0,%0,%3\n"			\
			"	mov %2, sp\n"				\
			"	mov %1, x30\n"				\
			: "=&r" (cpu_id), "=&r" (lr), "=&r" (stack), "=&r" (tmp)\
			:						\
			: "memory");					\
		if(sprd_debug_last_regs_access){			\
		sprd_debug_last_regs_access[cpu_id].value = (unsigned long)(v);	\
		sprd_debug_last_regs_access[cpu_id].vaddr = (unsigned long)(a);	\
		sprd_debug_last_regs_access[cpu_id].stack = stack;	\
		sprd_debug_last_regs_access[cpu_id].pc = lr;		\
		sprd_debug_last_regs_access[cpu_id].status = 0;}	\
		})

#define sprd_debug_regs_access_done()	({unsigned long cpu_id, lr,tmp;		\
		asm volatile(						\
			"	mrs %2,mpidr_el1\n"	\
			"	ands %0, %2, #0xf\n"			\
			"	lsr %2,%2,#8\n"			\
			"	ands %2, %2, #0xf\n"			\
			"	lsl %2,%2,#2\n"			\
			"	add %0,%0,%2\n"			\
			"	mov %1, x30\n"				\
			: "=&r" (cpu_id), "=&r" (lr), "=&r" (tmp)\
			:						\
			: "memory");					\
		if(sprd_debug_last_regs_access){			\
		sprd_debug_last_regs_access[cpu_id].time = jiffies;     \
		sprd_debug_last_regs_access[cpu_id].status = 1;}	\
		})

#else
#define sprd_debug_regs_read_start(a)	({u32 cpu_id, stack, lr;	\
		asm volatile(						\
			"	mrc	p15, 0, %0, c0, c0, 5\n"	\
			"	ands %0, %0, #0xf\n"			\
			"	mov %2, r13\n"				\
			"	mov %1, lr\n"				\
			: "=&r" (cpu_id), "=&r" (lr), "=&r" (stack)	\
			:						\
			: "memory");					\
		if(sprd_debug_last_regs_access){			\
		sprd_debug_last_regs_access[cpu_id].value = 0;		\
		sprd_debug_last_regs_access[cpu_id].vaddr = (u32)a;	\
		sprd_debug_last_regs_access[cpu_id].stack = stack;	\
		sprd_debug_last_regs_access[cpu_id].pc = lr;		\
		sprd_debug_last_regs_access[cpu_id].status = 0;}	\
		})

#define sprd_debug_regs_write_start(v, a)	({u32 cpu_id, stack, lr;	\
		asm volatile(						\
			"	mrc	p15, 0, %0, c0, c0, 5\n"	\
			"	ands %0, %0, #0xf\n"			\
			"	mov %2, r13\n"				\
			"	mov %1, lr\n"				\
			: "=&r" (cpu_id), "=&r" (lr), "=&r" (stack)	\
			:						\
			: "memory");					\
		if(sprd_debug_last_regs_access){			\
		sprd_debug_last_regs_access[cpu_id].value = (u32)(v);	\
		sprd_debug_last_regs_access[cpu_id].vaddr = (u32)(a);	\
		sprd_debug_last_regs_access[cpu_id].stack = stack;	\
		sprd_debug_last_regs_access[cpu_id].pc = lr;		\
		sprd_debug_last_regs_access[cpu_id].status = 0;}	\
		})

#define sprd_debug_regs_access_done()	({u32 cpu_id, lr;		\
		asm volatile(						\
			"	mrc	p15, 0, %0, c0, c0, 5\n"	\
			"	ands %0, %0, #0xf\n"			\
			"	mov %1, lr\n"				\
			: "=&r" (cpu_id), "=&r" (lr)			\
			:						\
			: "memory");					\
		if(sprd_debug_last_regs_access){			\
		sprd_debug_last_regs_access[cpu_id].time = jiffies;     \
		sprd_debug_last_regs_access[cpu_id].status = 1;}	\
		})

#endif
#endif