43 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			43 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
From: Matt Redfearn <matt.redfearn@imgtec.com>
 | 
						|
Date: Mon, 19 Dec 2016 14:20:57 +0000
 | 
						|
Subject: [PATCH] MIPS: Stack unwinding while on IRQ stack
 | 
						|
 | 
						|
Within unwind stack, check if the stack pointer being unwound is within
 | 
						|
the CPU's irq_stack and if so use that page rather than the task's stack
 | 
						|
page.
 | 
						|
 | 
						|
Signed-off-by: Matt Redfearn <matt.redfearn@imgtec.com>
 | 
						|
---
 | 
						|
 | 
						|
--- a/arch/mips/kernel/process.c
 | 
						|
+++ b/arch/mips/kernel/process.c
 | 
						|
@@ -33,6 +33,7 @@
 | 
						|
 #include <asm/dsemul.h>
 | 
						|
 #include <asm/dsp.h>
 | 
						|
 #include <asm/fpu.h>
 | 
						|
+#include <asm/irq.h>
 | 
						|
 #include <asm/msa.h>
 | 
						|
 #include <asm/pgtable.h>
 | 
						|
 #include <asm/mipsregs.h>
 | 
						|
@@ -556,7 +557,19 @@ EXPORT_SYMBOL(unwind_stack_by_address);
 | 
						|
 unsigned long unwind_stack(struct task_struct *task, unsigned long *sp,
 | 
						|
 			   unsigned long pc, unsigned long *ra)
 | 
						|
 {
 | 
						|
-	unsigned long stack_page = (unsigned long)task_stack_page(task);
 | 
						|
+	unsigned long stack_page = 0;
 | 
						|
+	int cpu;
 | 
						|
+
 | 
						|
+	for_each_possible_cpu(cpu) {
 | 
						|
+		if (on_irq_stack(cpu, *sp)) {
 | 
						|
+			stack_page = (unsigned long)irq_stack[cpu];
 | 
						|
+			break;
 | 
						|
+		}
 | 
						|
+	}
 | 
						|
+
 | 
						|
+	if (!stack_page)
 | 
						|
+		stack_page = (unsigned long)task_stack_page(task);
 | 
						|
+
 | 
						|
 	return unwind_stack_by_address(stack_page, sp, pc, ra);
 | 
						|
 }
 | 
						|
 #endif
 |