From: Matt Redfearn <matt.redfearn@imgtec.com> To: Ralf Baechle <ralf@linux-mips.org> Cc: <linux-mips@linux-mips.org>, "Jason A . Donenfeld" <Jason@zx2c4.com>, Thomas Gleixner <tglx@linutronix.de>, Matt Redfearn <matt.redfearn@imgtec.com>, <linux-kernel@vger.kernel.org>, James Hogan <james.hogan@imgtec.com>, Paul Burton <paul.burton@imgtec.com> Subject: [PATCH v3 4/5] MIPS: Switch to the irq_stack in interrupts Date: Mon, 19 Dec 2016 14:20:59 +0000 [thread overview] Message-ID: <1482157260-18730-5-git-send-email-matt.redfearn@imgtec.com> (raw) In-Reply-To: <1482157260-18730-1-git-send-email-matt.redfearn@imgtec.com> When enterring interrupt context via handle_int or except_vec_vi, switch to the irq_stack of the current CPU if it is not already in use. The current stack pointer is masked with the thread size and compared to the base or the irq stack. If it does not match then the stack pointer is set to the top of that stack, otherwise this is a nested irq being handled on the irq stack so the stack pointer should be left as it was. The in-use stack pointer is placed in the callee saved register s1. It will be saved to the stack when plat_irq_dispatch is invoked and can be restored once control returns here. Signed-off-by: Matt Redfearn <matt.redfearn@imgtec.com> --- Changes in v3: None Changes in v2: None arch/mips/kernel/genex.S | 81 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 76 insertions(+), 5 deletions(-) diff --git a/arch/mips/kernel/genex.S b/arch/mips/kernel/genex.S index dc0b29612891..0a7ba4b2f687 100644 --- a/arch/mips/kernel/genex.S +++ b/arch/mips/kernel/genex.S @@ -187,9 +187,44 @@ NESTED(handle_int, PT_SIZE, sp) LONG_L s0, TI_REGS($28) LONG_S sp, TI_REGS($28) - PTR_LA ra, ret_from_irq - PTR_LA v0, plat_irq_dispatch - jr v0 + + /* + * SAVE_ALL ensures we are using a valid kernel stack for the thread. + * Check if we are already using the IRQ stack. + */ + move s1, sp # Preserve the sp + + /* Get IRQ stack for this CPU */ + ASM_CPUID_MFC0 k0, ASM_SMP_CPUID_REG +#if defined(CONFIG_32BIT) || defined(KBUILD_64BIT_SYM32) + lui k1, %hi(irq_stack) +#else + lui k1, %highest(irq_stack) + daddiu k1, %higher(irq_stack) + dsll k1, 16 + daddiu k1, %hi(irq_stack) + dsll k1, 16 +#endif + LONG_SRL k0, SMP_CPUID_PTRSHIFT + LONG_ADDU k1, k0 + LONG_L t0, %lo(irq_stack)(k1) + + # Check if already on IRQ stack + PTR_LI t1, ~(_THREAD_SIZE-1) + and t1, t1, sp + beq t0, t1, 2f + + /* Switch to IRQ stack */ + li t1, _IRQ_STACK_SIZE + PTR_ADD sp, t0, t1 + +2: + jal plat_irq_dispatch + + /* Restore sp */ + move sp, s1 + + j ret_from_irq #ifdef CONFIG_CPU_MICROMIPS nop #endif @@ -262,8 +297,44 @@ NESTED(except_vec_vi_handler, 0, sp) LONG_L s0, TI_REGS($28) LONG_S sp, TI_REGS($28) - PTR_LA ra, ret_from_irq - jr v0 + + /* + * SAVE_ALL ensures we are using a valid kernel stack for the thread. + * Check if we are already using the IRQ stack. + */ + move s1, sp # Preserve the sp + + /* Get IRQ stack for this CPU */ + ASM_CPUID_MFC0 k0, ASM_SMP_CPUID_REG +#if defined(CONFIG_32BIT) || defined(KBUILD_64BIT_SYM32) + lui k1, %hi(irq_stack) +#else + lui k1, %highest(irq_stack) + daddiu k1, %higher(irq_stack) + dsll k1, 16 + daddiu k1, %hi(irq_stack) + dsll k1, 16 +#endif + LONG_SRL k0, SMP_CPUID_PTRSHIFT + LONG_ADDU k1, k0 + LONG_L t0, %lo(irq_stack)(k1) + + # Check if already on IRQ stack + PTR_LI t1, ~(_THREAD_SIZE-1) + and t1, t1, sp + beq t0, t1, 2f + + /* Switch to IRQ stack */ + li t1, _IRQ_STACK_SIZE + PTR_ADD sp, t0, t1 + +2: + jal plat_irq_dispatch + + /* Restore sp */ + move sp, s1 + + j ret_from_irq END(except_vec_vi_handler) /* -- 2.7.4
next prev parent reply other threads:[~2016-12-19 14:21 UTC|newest] Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top 2016-12-19 14:20 [PATCH v3 0/5] MIPS: Add per-cpu IRQ stack Matt Redfearn 2016-12-19 14:20 ` [PATCH v3 1/5] MIPS: Introduce irq_stack Matt Redfearn 2016-12-19 14:20 ` [PATCH v3 2/5] MIPS: Stack unwinding while on IRQ stack Matt Redfearn 2016-12-19 14:20 ` [PATCH v3 3/5] MIPS: Only change $28 to thread_info if coming from user mode Matt Redfearn 2016-12-21 12:13 ` Maciej W. Rozycki 2016-12-19 14:20 ` Matt Redfearn [this message] 2016-12-19 14:21 ` [PATCH v3 5/5] MIPS: Select HAVE_IRQ_EXIT_ON_IRQ_STACK Matt Redfearn 2016-12-21 1:18 ` [PATCH v3 0/5] MIPS: Add per-cpu IRQ stack Jason A. Donenfeld 2017-01-10 23:32 ` Jason A. Donenfeld 2017-01-11 1:20 ` Ralf Baechle 2017-01-11 23:32 ` Jason A. Donenfeld 2017-01-13 9:49 ` James Hogan 2017-01-15 13:39 ` Jason A. Donenfeld 2017-01-15 13:48 ` Greg Kroah-Hartman 2017-01-15 14:11 ` Jason A. Donenfeld 2017-01-15 14:15 ` Jason A. Donenfeld 2017-01-15 14:30 ` Greg Kroah-Hartman 2017-01-15 18:07 ` Jason A. Donenfeld
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=1482157260-18730-5-git-send-email-matt.redfearn@imgtec.com \ --to=matt.redfearn@imgtec.com \ --cc=Jason@zx2c4.com \ --cc=james.hogan@imgtec.com \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-mips@linux-mips.org \ --cc=paul.burton@imgtec.com \ --cc=ralf@linux-mips.org \ --cc=tglx@linutronix.de \ --subject='Re: [PATCH v3 4/5] MIPS: Switch to the irq_stack in interrupts' \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
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).