linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/3] powerpc/book3e: load critical/machine/debug exception stack
@ 2012-10-25  6:43 Tiejun Chen
  2012-10-25  6:43 ` [PATCH 2/3] powerpc/book3e: support kgdb for kernel space Tiejun Chen
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Tiejun Chen @ 2012-10-25  6:43 UTC (permalink / raw)
  To: benh; +Cc: jason.wessel, linuxppc-dev, linux-kernel

We always alloc critical/machine/debug check exceptions. This is
different from the normal exception. So we should load these exception
stack properly like we did for booke.

Signed-off-by: Tiejun Chen <tiejun.chen@windriver.com>
---
 arch/powerpc/kernel/exceptions-64e.S |   27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)

diff --git a/arch/powerpc/kernel/exceptions-64e.S b/arch/powerpc/kernel/exceptions-64e.S
index 4684e33..43b654a 100644
--- a/arch/powerpc/kernel/exceptions-64e.S
+++ b/arch/powerpc/kernel/exceptions-64e.S
@@ -36,6 +36,30 @@
  */
 #define	SPECIAL_EXC_FRAME_SIZE	INT_FRAME_SIZE
 
+/* only on book3e */
+#define DBG_STACK_BASE		dbgirq_ctx
+#define MC_STACK_BASE		mcheckirq_ctx
+#define CRIT_STACK_BASE		critirq_ctx
+
+#ifdef CONFIG_SMP
+#define BOOK3E_LOAD_EXC_LEVEL_STACK(level)		\
+	std	r14,PACA_EX##level+EX_R14(r13);		\
+	mfspr	r14,SPRN_PIR;				\
+	slwi	r14,r14,3;				\
+	LOAD_REG_ADDR(r10, level##_STACK_BASE);		\
+	add	r10,r10,r14;				\
+	ld	r10,0(r10);				\
+	addi	r10,r10,THREAD_SIZE;			\
+	std	r10,PACA_DBG_STACK(r13);		\
+	ld	r14,PACA_EX##level+EX_R14(r13);
+#else
+#define BOOK3E_LOAD_EXC_LEVEL_STACK(level)		\
+	LOAD_REG_ADDR(r10, level##_STACK_BASE);		\
+	ld	r10,0(r10);				\
+	addi	r10,r10,THREAD_SIZE;			\
+	std	r10,PACA_DBG_STACK(r13);
+#endif
+
 /* Exception prolog code for all exceptions */
 #define EXCEPTION_PROLOG(n, intnum, type, addition)	    		    \
 	mtspr	SPRN_SPRG_##type##_SCRATCH,r13;	/* get spare registers */   \
@@ -68,18 +92,21 @@
 #define SPRN_GDBELL_SRR1	SPRN_GSRR1
 
 #define CRIT_SET_KSTACK						            \
+	BOOK3E_LOAD_EXC_LEVEL_STACK(CRIT);					\
 	ld	r1,PACA_CRIT_STACK(r13);				    \
 	subi	r1,r1,SPECIAL_EXC_FRAME_SIZE;
 #define SPRN_CRIT_SRR0	SPRN_CSRR0
 #define SPRN_CRIT_SRR1	SPRN_CSRR1
 
 #define DBG_SET_KSTACK						            \
+	BOOK3E_LOAD_EXC_LEVEL_STACK(DBG);					\
 	ld	r1,PACA_DBG_STACK(r13);					    \
 	subi	r1,r1,SPECIAL_EXC_FRAME_SIZE;
 #define SPRN_DBG_SRR0	SPRN_DSRR0
 #define SPRN_DBG_SRR1	SPRN_DSRR1
 
 #define MC_SET_KSTACK						            \
+	BOOK3E_LOAD_EXC_LEVEL_STACK(MC);					\
 	ld	r1,PACA_MC_STACK(r13);					    \
 	subi	r1,r1,SPECIAL_EXC_FRAME_SIZE;
 #define SPRN_MC_SRR0	SPRN_MCSRR0
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH 2/3] powerpc/book3e: support kgdb for kernel space
  2012-10-25  6:43 [PATCH 1/3] powerpc/book3e: load critical/machine/debug exception stack Tiejun Chen
@ 2012-10-25  6:43 ` Tiejun Chen
  2012-10-25  6:43 ` [PATCH 3/3] kgdb/kgdbts: support ppc64 Tiejun Chen
  2012-12-18 22:10 ` [PATCH 1/3] powerpc/book3e: load critical/machine/debug exception stack Tabi Timur-B04825
  2 siblings, 0 replies; 5+ messages in thread
From: Tiejun Chen @ 2012-10-25  6:43 UTC (permalink / raw)
  To: benh; +Cc: jason.wessel, linuxppc-dev, linux-kernel

Currently we need to skip this for supporting KGDB.

Signed-off-by: Tiejun Chen <tiejun.chen@windriver.com>
---
 arch/powerpc/kernel/exceptions-64e.S |    5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/arch/powerpc/kernel/exceptions-64e.S b/arch/powerpc/kernel/exceptions-64e.S
index 43b654a..c5564d4 100644
--- a/arch/powerpc/kernel/exceptions-64e.S
+++ b/arch/powerpc/kernel/exceptions-64e.S
@@ -566,11 +566,14 @@ kernel_dbg_exc:
 	rfdi
 
 	/* Normal debug exception */
+1:
+#ifndef CONFIG_KGDB
 	/* XXX We only handle coming from userspace for now since we can't
 	 *     quite save properly an interrupted kernel state yet
 	 */
-1:	andi.	r14,r11,MSR_PR;		/* check for userspace again */
+	andi.	r14,r11,MSR_PR;		/* check for userspace again */
 	beq	kernel_dbg_exc;		/* if from kernel mode */
+#endif
 
 	/* Now we mash up things to make it look like we are coming on a
 	 * normal exception
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH 3/3] kgdb/kgdbts: support ppc64
  2012-10-25  6:43 [PATCH 1/3] powerpc/book3e: load critical/machine/debug exception stack Tiejun Chen
  2012-10-25  6:43 ` [PATCH 2/3] powerpc/book3e: support kgdb for kernel space Tiejun Chen
@ 2012-10-25  6:43 ` Tiejun Chen
  2012-12-18 22:10 ` [PATCH 1/3] powerpc/book3e: load critical/machine/debug exception stack Tabi Timur-B04825
  2 siblings, 0 replies; 5+ messages in thread
From: Tiejun Chen @ 2012-10-25  6:43 UTC (permalink / raw)
  To: benh; +Cc: jason.wessel, linuxppc-dev, linux-kernel

We can't look up the address of the entry point of the function simply
via that function symbol for all architectures.

For PPC64 ABI, actually there is a function descriptors structure.

A function descriptor is a three doubleword data structure that contains
the following values:
	* The first doubleword contains the address of the entry point of
		the function.
	* The second doubleword contains the TOC base address for
		the function.
	* The third doubleword contains the environment pointer for
		languages such as Pascal and PL/1.

So we should call a wapperred dereference_function_descriptor() to get
the address of the entry point of the function.

Note this is also safe for other architecture after refer to
"include/asm-generic/sections.h" since:

dereference_function_descriptor(p) always is (p) if without arched definition.

Signed-off-by: Tiejun Chen <tiejun.chen@windriver.com>
---
 drivers/misc/kgdbts.c |    2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/misc/kgdbts.c b/drivers/misc/kgdbts.c
index 3aa9a96..4799e1f 100644
--- a/drivers/misc/kgdbts.c
+++ b/drivers/misc/kgdbts.c
@@ -103,6 +103,7 @@
 #include <linux/delay.h>
 #include <linux/kthread.h>
 #include <linux/module.h>
+#include <asm/sections.h>
 
 #define v1printk(a...) do { \
 	if (verbose) \
@@ -222,6 +223,7 @@ static unsigned long lookup_addr(char *arg)
 		addr = (unsigned long)do_fork;
 	else if (!strcmp(arg, "hw_break_val"))
 		addr = (unsigned long)&hw_break_val;
+	addr = (unsigned long )dereference_function_descriptor((void *)addr);
 	return addr;
 }
 
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH 1/3] powerpc/book3e: load critical/machine/debug exception stack
  2012-10-25  6:43 [PATCH 1/3] powerpc/book3e: load critical/machine/debug exception stack Tiejun Chen
  2012-10-25  6:43 ` [PATCH 2/3] powerpc/book3e: support kgdb for kernel space Tiejun Chen
  2012-10-25  6:43 ` [PATCH 3/3] kgdb/kgdbts: support ppc64 Tiejun Chen
@ 2012-12-18 22:10 ` Tabi Timur-B04825
  2012-12-20  9:14   ` tiejun.chen
  2 siblings, 1 reply; 5+ messages in thread
From: Tabi Timur-B04825 @ 2012-12-18 22:10 UTC (permalink / raw)
  To: Tiejun Chen; +Cc: benh, jason.wessel, linuxppc-dev, linux-kernel

On Thu, Oct 25, 2012 at 1:43 AM, Tiejun Chen <tiejun.chen@windriver.com> wrote:
> We always alloc critical/machine/debug check exceptions. This is
> different from the normal exception. So we should load these exception
> stack properly like we did for booke.

Tiejun,

I'm a little confused by these patches, because the actual critical
exception handlers are still commented out:

/* Critical Input Interrupt */
	START_EXCEPTION(critical_input);
	CRIT_EXCEPTION_PROLOG(0x100, BOOKE_INTERRUPT_CRITICAL,
			      PROLOG_ADDITION_NONE)
//	EXCEPTION_COMMON(0x100, PACA_EXCRIT, INTS_DISABLE)
//	bl	special_reg_save_crit
//	CHECK_NAPPING();
//	addi	r3,r1,STACK_FRAME_OVERHEAD
//	bl	.critical_exception
//	b	ret_from_crit_except
	b	.

Are you working on fixing this?  I'm trying to fix it, too, but I
think you're way ahead of me.

-- 
Timur Tabi
Linux kernel developer at Freescale

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH 1/3] powerpc/book3e: load critical/machine/debug exception stack
  2012-12-18 22:10 ` [PATCH 1/3] powerpc/book3e: load critical/machine/debug exception stack Tabi Timur-B04825
@ 2012-12-20  9:14   ` tiejun.chen
  0 siblings, 0 replies; 5+ messages in thread
From: tiejun.chen @ 2012-12-20  9:14 UTC (permalink / raw)
  To: Tabi Timur-B04825; +Cc: benh, jason.wessel, linuxppc-dev, linux-kernel

On 12/19/2012 06:10 AM, Tabi Timur-B04825 wrote:
> On Thu, Oct 25, 2012 at 1:43 AM, Tiejun Chen <tiejun.chen@windriver.com> wrote:
>> We always alloc critical/machine/debug check exceptions. This is
>> different from the normal exception. So we should load these exception
>> stack properly like we did for booke.
>
> Tiejun,
>
> I'm a little confused by these patches, because the actual critical
> exception handlers are still commented out:
>
> /* Critical Input Interrupt */
> 	START_EXCEPTION(critical_input);
> 	CRIT_EXCEPTION_PROLOG(0x100, BOOKE_INTERRUPT_CRITICAL,
> 			      PROLOG_ADDITION_NONE)
> //	EXCEPTION_COMMON(0x100, PACA_EXCRIT, INTS_DISABLE)
> //	bl	special_reg_save_crit
> //	CHECK_NAPPING();
> //	addi	r3,r1,STACK_FRAME_OVERHEAD
> //	bl	.critical_exception
> //	b	ret_from_crit_except
> 	b	.
>
> Are you working on fixing this?  I'm trying to fix it, too, but I

No, I have no approach to Crit/MC and currently I'm focus only on Debug so 
please do this as you expect :)

BTW, I send next version just now since there are something needed to 
correct/improve.

Tiejun

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2012-12-20  9:14 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-10-25  6:43 [PATCH 1/3] powerpc/book3e: load critical/machine/debug exception stack Tiejun Chen
2012-10-25  6:43 ` [PATCH 2/3] powerpc/book3e: support kgdb for kernel space Tiejun Chen
2012-10-25  6:43 ` [PATCH 3/3] kgdb/kgdbts: support ppc64 Tiejun Chen
2012-12-18 22:10 ` [PATCH 1/3] powerpc/book3e: load critical/machine/debug exception stack Tabi Timur-B04825
2012-12-20  9:14   ` tiejun.chen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).