Message ID | 1351147410-17452-1-git-send-email-tiejun.chen@windriver.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
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.
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
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
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(+)