1  // SPDX-License-Identifier: GPL-2.0-only
2  /*
3   * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
4   */
5  
6  #include <linux/ptrace.h>
7  #include <linux/module.h>
8  #include <linux/mm.h>
9  #include <linux/fs.h>
10  #include <linux/kdev_t.h>
11  #include <linux/proc_fs.h>
12  #include <linux/file.h>
13  #include <linux/sched/mm.h>
14  #include <linux/sched/debug.h>
15  
16  #include <asm/arcregs.h>
17  #include <asm/irqflags.h>
18  
19  #define ARC_PATH_MAX	256
20  
print_regs_scratch(struct pt_regs * regs)21  static noinline void print_regs_scratch(struct pt_regs *regs)
22  {
23  	pr_cont("BTA: 0x%08lx\n SP: 0x%08lx  FP: 0x%08lx BLK: %pS\n",
24  		regs->bta, regs->sp, regs->fp, (void *)regs->blink);
25  	pr_cont("LPS: 0x%08lx\tLPE: 0x%08lx\tLPC: 0x%08lx\n",
26  		regs->lp_start, regs->lp_end, regs->lp_count);
27  
28  	pr_info("r00: 0x%08lx\tr01: 0x%08lx\tr02: 0x%08lx\n"	\
29  		"r03: 0x%08lx\tr04: 0x%08lx\tr05: 0x%08lx\n"	\
30  		"r06: 0x%08lx\tr07: 0x%08lx\tr08: 0x%08lx\n"	\
31  		"r09: 0x%08lx\tr10: 0x%08lx\tr11: 0x%08lx\n"	\
32  		"r12: 0x%08lx\t",
33  		regs->r0, regs->r1, regs->r2,
34  		regs->r3, regs->r4, regs->r5,
35  		regs->r6, regs->r7, regs->r8,
36  		regs->r9, regs->r10, regs->r11,
37  		regs->r12);
38  }
39  
print_regs_callee(struct callee_regs * regs)40  static void print_regs_callee(struct callee_regs *regs)
41  {
42  	pr_cont("r13: 0x%08lx\tr14: 0x%08lx\n"			\
43  		"r15: 0x%08lx\tr16: 0x%08lx\tr17: 0x%08lx\n"	\
44  		"r18: 0x%08lx\tr19: 0x%08lx\tr20: 0x%08lx\n"	\
45  		"r21: 0x%08lx\tr22: 0x%08lx\tr23: 0x%08lx\n"	\
46  		"r24: 0x%08lx\tr25: 0x%08lx\n",
47  		regs->r13, regs->r14,
48  		regs->r15, regs->r16, regs->r17,
49  		regs->r18, regs->r19, regs->r20,
50  		regs->r21, regs->r22, regs->r23,
51  		regs->r24, regs->r25);
52  }
53  
print_task_path_n_nm(struct task_struct * tsk)54  static void print_task_path_n_nm(struct task_struct *tsk)
55  {
56  	char *path_nm = NULL;
57  	struct mm_struct *mm;
58  	struct file *exe_file;
59  	char buf[ARC_PATH_MAX];
60  
61  	mm = get_task_mm(tsk);
62  	if (!mm)
63  		goto done;
64  
65  	exe_file = get_mm_exe_file(mm);
66  	mmput(mm);
67  
68  	if (exe_file) {
69  		path_nm = file_path(exe_file, buf, ARC_PATH_MAX-1);
70  		fput(exe_file);
71  	}
72  
73  done:
74  	pr_info("Path: %s\n", !IS_ERR(path_nm) ? path_nm : "?");
75  }
76  
show_faulting_vma(unsigned long address)77  static void show_faulting_vma(unsigned long address)
78  {
79  	struct vm_area_struct *vma;
80  	struct mm_struct *active_mm = current->active_mm;
81  
82  	/* can't use print_vma_addr() yet as it doesn't check for
83  	 * non-inclusive vma
84  	 */
85  	mmap_read_lock(active_mm);
86  	vma = vma_lookup(active_mm, address);
87  
88  	/* Lookup the vma at the address and report if the container VMA is not
89  	 * found
90  	 */
91  	if (vma) {
92  		char buf[ARC_PATH_MAX];
93  		char *nm = "anon";
94  
95  		if (vma->vm_file) {
96  			/* XXX: can we use %pD below and get rid of buf? */
97  			nm = d_path(file_user_path(vma->vm_file), buf,
98  				    ARC_PATH_MAX-1);
99  			if (IS_ERR(nm))
100  				nm = "?";
101  		}
102  		pr_info("  @off 0x%lx in [%s]  VMA: 0x%08lx to 0x%08lx\n",
103  			vma->vm_start < TASK_UNMAPPED_BASE ?
104  				address : address - vma->vm_start,
105  			nm, vma->vm_start, vma->vm_end);
106  	} else
107  		pr_info("    @No matching VMA found\n");
108  
109  	mmap_read_unlock(active_mm);
110  }
111  
show_ecr_verbose(struct pt_regs * regs)112  static void show_ecr_verbose(struct pt_regs *regs)
113  {
114  	unsigned int vec, cause_code;
115  	unsigned long address;
116  
117  	/* For Data fault, this is data address not instruction addr */
118  	address = current->thread.fault_address;
119  
120  	vec = regs->ecr.vec;
121  	cause_code = regs->ecr.cause;
122  
123  	/* For DTLB Miss or ProtV, display the memory involved too */
124  	if (vec == ECR_V_DTLB_MISS) {
125  		pr_cont("Invalid %s @ 0x%08lx by insn @ %pS\n",
126  		       (cause_code == 0x01) ? "Read" :
127  		       ((cause_code == 0x02) ? "Write" : "EX"),
128  		       address, (void *)regs->ret);
129  	} else if (vec == ECR_V_ITLB_MISS) {
130  		pr_cont("Insn could not be fetched\n");
131  	} else if (vec == ECR_V_MACH_CHK) {
132  		pr_cont("Machine Check (%s)\n", (cause_code == 0x0) ?
133  					"Double Fault" : "Other Fatal Err");
134  
135  	} else if (vec == ECR_V_PROTV) {
136  		if (cause_code == ECR_C_PROTV_INST_FETCH)
137  			pr_cont("Execute from Non-exec Page\n");
138  		else if (cause_code == ECR_C_PROTV_MISALIG_DATA &&
139  		         IS_ENABLED(CONFIG_ISA_ARCOMPACT))
140  			pr_cont("Misaligned r/w from 0x%08lx\n", address);
141  		else
142  			pr_cont("%s access not allowed on page\n",
143  				(cause_code == 0x01) ? "Read" :
144  				((cause_code == 0x02) ? "Write" : "EX"));
145  	} else if (vec == ECR_V_INSN_ERR) {
146  		pr_cont("Illegal Insn\n");
147  #ifdef CONFIG_ISA_ARCV2
148  	} else if (vec == ECR_V_MEM_ERR) {
149  		if (cause_code == 0x00)
150  			pr_cont("Bus Error from Insn Mem\n");
151  		else if (cause_code == 0x10)
152  			pr_cont("Bus Error from Data Mem\n");
153  		else
154  			pr_cont("Bus Error, check PRM\n");
155  	} else if (vec == ECR_V_MISALIGN) {
156  		pr_cont("Misaligned r/w from 0x%08lx\n", address);
157  #endif
158  	} else if (vec == ECR_V_TRAP) {
159  		if (regs->ecr.param == 5)
160  			pr_cont("gcc generated __builtin_trap\n");
161  	} else {
162  		pr_cont("Check Programmer's Manual\n");
163  	}
164  }
165  
166  /************************************************************************
167   *  API called by rest of kernel
168   ***********************************************************************/
169  
show_regs(struct pt_regs * regs)170  void show_regs(struct pt_regs *regs)
171  {
172  	struct task_struct *tsk = current;
173  	struct callee_regs *cregs = (struct callee_regs *)tsk->thread.callee_reg;
174  
175  	/*
176  	 * generic code calls us with preemption disabled, but some calls
177  	 * here could sleep, so re-enable to avoid lockdep splat
178  	 */
179  	preempt_enable();
180  
181  	print_task_path_n_nm(tsk);
182  	show_regs_print_info(KERN_INFO);
183  
184  	show_ecr_verbose(regs);
185  
186  	if (user_mode(regs))
187  		show_faulting_vma(regs->ret); /* faulting code, not data */
188  
189  	pr_info("ECR: 0x%08lx EFA: 0x%08lx ERET: 0x%08lx\n",
190  		regs->ecr.full, current->thread.fault_address, regs->ret);
191  
192  	pr_info("STAT32: 0x%08lx", regs->status32);
193  
194  #define STS_BIT(r, bit)	r->status32 & STATUS_##bit##_MASK ? #bit" " : ""
195  
196  #ifdef CONFIG_ISA_ARCOMPACT
197  	pr_cont(" [%2s%2s%2s%2s%2s%2s%2s]",
198  			(regs->status32 & STATUS_U_MASK) ? "U " : "K ",
199  			STS_BIT(regs, DE), STS_BIT(regs, AE),
200  			STS_BIT(regs, A2), STS_BIT(regs, A1),
201  			STS_BIT(regs, E2), STS_BIT(regs, E1));
202  #else
203  	pr_cont(" [%2s%2s%2s%2s]   ",
204  			STS_BIT(regs, IE),
205  			(regs->status32 & STATUS_U_MASK) ? "U " : "K ",
206  			STS_BIT(regs, DE), STS_BIT(regs, AE));
207  #endif
208  
209  	print_regs_scratch(regs);
210  	if (cregs)
211  		print_regs_callee(cregs);
212  
213  	preempt_disable();
214  }
215  
show_kernel_fault_diag(const char * str,struct pt_regs * regs,unsigned long address)216  void show_kernel_fault_diag(const char *str, struct pt_regs *regs,
217  			    unsigned long address)
218  {
219  	current->thread.fault_address = address;
220  
221  	/* Show fault description */
222  	pr_info("\n%s\n", str);
223  
224  	/* Caller and Callee regs */
225  	show_regs(regs);
226  
227  	/* Show stack trace if this Fatality happened in kernel mode */
228  	if (!user_mode(regs))
229  		show_stacktrace(current, regs, KERN_DEFAULT);
230  }
231