From nobody Mon Feb 9 13:23:20 2026 Received: from mail.loongson.cn (mail.loongson.cn [114.242.206.163]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 2C1562749E6 for ; Tue, 22 Apr 2025 11:07:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=114.242.206.163 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745320047; cv=none; b=IXgymvggbbZKQugQZCHN+41Kgm5Kdye6aEdNwyPf4G/ubIIavB99ZPy646VnpU7fF0T3eCc8bkB298R+bJdUGIjlj7BK9/0+Kkc8/KPK29uqpYvozfhBrg7RVotI1udbbgzj0aGUY0m35SDRxh03jX3P4t/5wkV6w+jdGAWDxxA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745320047; c=relaxed/simple; bh=B0mqH/GhTJVmfY3J8t0PqVycZFkniE9/OOhD7YK8Q0Y=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=TcSOmPGqZvQb4z7jDIzDud0UaGEOLljnxZhKDiOkP8jN1UuR5Tsihb7mr2TRftovaprkUe3ZzulQkKuXxK6gId6zK0jPLYm+SS09OzS1LtGp2fqGPi5hcOyN+dNo6gXr9lSVGAdByHXf40Q1OCUmQViJ34CjNYCw+/8pyjS8gWo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=loongson.cn; spf=pass smtp.mailfrom=loongson.cn; arc=none smtp.client-ip=114.242.206.163 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=loongson.cn Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=loongson.cn Received: from loongson.cn (unknown [113.200.148.30]) by gateway (Coremail) with SMTP id _____8Bx32tpeAdo_fvDAA--.62869S3; Tue, 22 Apr 2025 19:07:21 +0800 (CST) Received: from linux.localdomain (unknown [113.200.148.30]) by front1 (Coremail) with SMTP id qMiowMCxbsVneAdoe9yPAA--.33268S3; Tue, 22 Apr 2025 19:07:21 +0800 (CST) From: Tiezhu Yang To: Huacai Chen Cc: loongarch@lists.linux.dev, linux-kernel@vger.kernel.org Subject: [PATCH v2 1/2] LoongArch: Make regs_irqs_disabled() more clear Date: Tue, 22 Apr 2025 19:07:18 +0800 Message-ID: <20250422110719.15673-2-yangtiezhu@loongson.cn> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20250422110719.15673-1-yangtiezhu@loongson.cn> References: <20250422110719.15673-1-yangtiezhu@loongson.cn> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: qMiowMCxbsVneAdoe9yPAA--.33268S3 X-CM-SenderInfo: p1dqw3xlh2x3gn0dqz5rrqw2lrqou0/ X-Coremail-Antispam: 1Uk129KBj93XoW7Cr1rWF1xtw1UZF4UXryUCFX_yoW8GrWUpF 9rCF97GF48uF109FZrXFZ8XrZ8JrZ5G392kw17Ga4YyF15Xr1Fqrn7Gw1YvFy8Aa9ayFya qFn8tr1rZF45ZabCm3ZEXasCq-sJn29KB7ZKAUJUUUU5529EdanIXcx71UUUUU7KY7ZEXa sCq-sGcSsGvfJ3Ic02F40EFcxC0VAKzVAqx4xG6I80ebIjqfuFe4nvWSU5nxnvy29KBjDU 0xBIdaVrnRJUUUyEb4IE77IF4wAFF20E14v26r1j6r4UM7CY07I20VC2zVCF04k26cxKx2 IYs7xG6rWj6s0DM7CIcVAFz4kK6r126r13M28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48v e4kI8wA2z4x0Y4vE2Ix0cI8IcVAFwI0_Xr0_Ar1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI 0_Gr0_Cr1l84ACjcxK6I8E87Iv67AKxVW0oVCq3wA2z4x0Y4vEx4A2jsIEc7CjxVAFwI0_ GcCE3s1le2I262IYc4CY6c8Ij28IcVAaY2xG8wAqjxCEc2xF0cIa020Ex4CE44I27wAqx4 xG64xvF2IEw4CE5I8CrVC2j2WlYx0E2Ix0cI8IcVAFwI0_Jrv_JF1lYx0Ex4A2jsIE14v2 6r1j6r4UMcvjeVCFs4IE7xkEbVWUJVW8JwACjcxG0xvY0x0EwIxGrwCF04k20xvY0x0EwI xGrwCFx2IqxVCFs4IE7xkEbVWUJVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480 Y4vE14v26r106r1rMI8E67AF67kF1VAFwI0_Jrv_JF1lIxkGc2Ij64vIr41lIxAIcVC0I7 IYx2IY67AKxVWUJVWUCwCI42IY6xIIjxv20xvEc7CjxVAFwI0_Jr0_Gr1lIxAIcVCF04k2 6cxKx2IYs7xG6r1j6r1xMIIF0xvEx4A2jsIE14v26r1j6r4UMIIF0xvEx4A2jsIEc7CjxV AFwI0_Jr0_GrUvcSsGvfC2KfnxnUUI43ZEXa7IU88HUDUUUUU== Content-Type: text/plain; charset="utf-8" In the current code, the definition of regs_irqs_disabled() is actually !(regs->csr_prmd & CSR_CRMD_IE) because arch_irqs_disabled_flags() is defined as !(flags & CSR_CRMD_IE), it looks a little strange. Define regs_irqs_disabled() as !(regs->csr_prmd & CSR_PRMD_PIE) directly to make it more clear, no functional change. While at it, the return value of regs_irqs_disabled() is true or false, so change its type to reflect that and also make it always inline. Fixes: 803b0fc5c3f2 ("LoongArch: Add process management") Signed-off-by: Tiezhu Yang --- arch/loongarch/include/asm/ptrace.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/loongarch/include/asm/ptrace.h b/arch/loongarch/include/a= sm/ptrace.h index f3ddaed9ef7f..a5b63c84f854 100644 --- a/arch/loongarch/include/asm/ptrace.h +++ b/arch/loongarch/include/asm/ptrace.h @@ -33,9 +33,9 @@ struct pt_regs { unsigned long __last[]; } __aligned(8); =20 -static inline int regs_irqs_disabled(struct pt_regs *regs) +static __always_inline bool regs_irqs_disabled(struct pt_regs *regs) { - return arch_irqs_disabled_flags(regs->csr_prmd); + return !(regs->csr_prmd & CSR_PRMD_PIE); } =20 static inline unsigned long kernel_stack_pointer(struct pt_regs *regs) --=20 2.42.0 From nobody Mon Feb 9 13:23:20 2026 Received: from mail.loongson.cn (mail.loongson.cn [114.242.206.163]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 2C1C3277028 for ; Tue, 22 Apr 2025 11:07:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=114.242.206.163 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745320047; cv=none; b=NR+xdDXXhyREJIV76CzSakgb0Ojt1mBOlp2MUHu/zz1iA91jJdKyGuFyTemSkhDiKrIuatNK9mXLnLuogkH9T/9q3zAF/pYYwRODhIv55NB6aOvdZHU6vdi2gtUs+lbwATWeGiUsg6YZxi6gSE8leGFgfCezJ+t/LHJEATN26Zw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745320047; c=relaxed/simple; bh=qRcTpfruip6kHRva7+FyKLAHcFuHUWIZNcTKgEO1qv0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=KuyR6qZwVySN/4Q2CwlVAMDH5RkrJZRtw2Ey5YHYoNTHbdDjc+flTDbkceMGjE2oBmO0yQayLWK6iVyZiuiK05MIp7rf6B9tfw4uPjSPLUieinw5yknn5VHUpQatqFJcx30u37+QCCIqRisa1846cghe6zaI0iwU0iL4yrB6ElM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=loongson.cn; spf=pass smtp.mailfrom=loongson.cn; arc=none smtp.client-ip=114.242.206.163 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=loongson.cn Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=loongson.cn Received: from loongson.cn (unknown [113.200.148.30]) by gateway (Coremail) with SMTP id _____8CxLGtqeAdoAfzDAA--.62192S3; Tue, 22 Apr 2025 19:07:22 +0800 (CST) Received: from linux.localdomain (unknown [113.200.148.30]) by front1 (Coremail) with SMTP id qMiowMCxbsVneAdoe9yPAA--.33268S4; Tue, 22 Apr 2025 19:07:21 +0800 (CST) From: Tiezhu Yang To: Huacai Chen Cc: loongarch@lists.linux.dev, linux-kernel@vger.kernel.org Subject: [PATCH v2 2/2] LoongArch: Make do_xyz() handlers more robust Date: Tue, 22 Apr 2025 19:07:19 +0800 Message-ID: <20250422110719.15673-3-yangtiezhu@loongson.cn> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20250422110719.15673-1-yangtiezhu@loongson.cn> References: <20250422110719.15673-1-yangtiezhu@loongson.cn> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: qMiowMCxbsVneAdoe9yPAA--.33268S4 X-CM-SenderInfo: p1dqw3xlh2x3gn0dqz5rrqw2lrqou0/ X-Coremail-Antispam: 1Uk129KBj93XoWxAw4kKryrtF1kZrykXFy8tFc_yoWrtry7pa y7Ca13KrWkWF1kZa9rJa4IyF17JrZav3yxCw4UCa4fWFsxC3sYgrn7K3W7ZFyjyrZ5AF1x ZFyjyw1FvFn8CFbCm3ZEXasCq-sJn29KB7ZKAUJUUUU8529EdanIXcx71UUUUU7KY7ZEXa sCq-sGcSsGvfJ3Ic02F40EFcxC0VAKzVAqx4xG6I80ebIjqfuFe4nvWSU5nxnvy29KBjDU 0xBIdaVrnRJUUUyEb4IE77IF4wAFF20E14v26r1j6r4UM7CY07I20VC2zVCF04k26cxKx2 IYs7xG6rWj6s0DM7CIcVAFz4kK6r126r13M28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48v e4kI8wA2z4x0Y4vE2Ix0cI8IcVAFwI0_Xr0_Ar1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI 0_Gr0_Cr1l84ACjcxK6I8E87Iv67AKxVW0oVCq3wA2z4x0Y4vEx4A2jsIEc7CjxVAFwI0_ GcCE3s1le2I262IYc4CY6c8Ij28IcVAaY2xG8wAqjxCEc2xF0cIa020Ex4CE44I27wAqx4 xG64xvF2IEw4CE5I8CrVC2j2WlYx0E2Ix0cI8IcVAFwI0_JF0_Jw1lYx0Ex4A2jsIE14v2 6r4j6F4UMcvjeVCFs4IE7xkEbVWUJVW8JwACjcxG0xvY0x0EwIxGrwCF04k20xvY0x0EwI xGrwCFx2IqxVCFs4IE7xkEbVWUJVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480 Y4vE14v26r106r1rMI8E67AF67kF1VAFwI0_Jrv_JF1lIxkGc2Ij64vIr41lIxAIcVC0I7 IYx2IY67AKxVWUCVW8JwCI42IY6xIIjxv20xvEc7CjxVAFwI0_Jr0_Gr1lIxAIcVCF04k2 6cxKx2IYs7xG6r1j6r1xMIIF0xvEx4A2jsIE14v26r1j6r4UMIIF0xvEx4A2jsIEc7CjxV AFwI0_Jr0_GrUvcSsGvfC2KfnxnUUI43ZEXa7IU8SksDUUUUU== Content-Type: text/plain; charset="utf-8" Currently, interrupts need to be disabled before single-step mode is set, it requires that the CSR_PRMD_PIE must be cleared in save_local_irqflag() which is called by setup_singlestep(), this is reasonable. But in the first kprobe breakpoint exception, if the irq is enabled at the beginning of do_bp(), it will not be disabled at the end of do_bp() due to the CSR_PRMD_PIE has been cleared in save_local_irqflag(). For this case, it may corrupt exception context when restoring exception after do_bp() in handle_bp(), this is not reasonable. In order to restore exception safely in handle_bp(), it needs to make sure the irq is disabled at the end of do_bp(), so just add a local variable to record the original interrupt status in the parent context, then use it as check condition to enable and disable irq in do_bp(). While at it, do the similar thing for the other do_xyz() handlers to make them more robust. Fixes: 6d4cc40fb5f5 ("LoongArch: Add kprobes support") Suggested-by: Jinyang He Suggested-by: Huacai Chen Co-developed-by: Tianyang Zhang Signed-off-by: Tianyang Zhang Signed-off-by: Tiezhu Yang --- arch/loongarch/kernel/traps.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/arch/loongarch/kernel/traps.c b/arch/loongarch/kernel/traps.c index 2ec3106c0da3..7de38d34efc6 100644 --- a/arch/loongarch/kernel/traps.c +++ b/arch/loongarch/kernel/traps.c @@ -547,6 +547,7 @@ int no_unaligned_warning __read_mostly =3D 1; /* Only 1= warning by default */ =20 asmlinkage void noinstr do_ale(struct pt_regs *regs) { + bool pie =3D regs_irqs_disabled(regs); irqentry_state_t state =3D irqentry_enter(regs); =20 #ifndef CONFIG_ARCH_STRICT_ALIGN @@ -555,7 +556,7 @@ asmlinkage void noinstr do_ale(struct pt_regs *regs) #else unsigned int *pc; =20 - if (regs->csr_prmd & CSR_PRMD_PIE) + if (!pie) local_irq_enable(); =20 perf_sw_event(PERF_COUNT_SW_ALIGNMENT_FAULTS, 1, regs, regs->csr_badvaddr= ); @@ -582,7 +583,7 @@ asmlinkage void noinstr do_ale(struct pt_regs *regs) die_if_kernel("Kernel ale access", regs); force_sig_fault(SIGBUS, BUS_ADRALN, (void __user *)regs->csr_badvaddr); out: - if (regs->csr_prmd & CSR_PRMD_PIE) + if (!pie) local_irq_disable(); #endif irqentry_exit(regs, state); @@ -621,12 +622,13 @@ static void bug_handler(struct pt_regs *regs) asmlinkage void noinstr do_bce(struct pt_regs *regs) { bool user =3D user_mode(regs); + bool pie =3D regs_irqs_disabled(regs); unsigned long era =3D exception_era(regs); u64 badv =3D 0, lower =3D 0, upper =3D ULONG_MAX; union loongarch_instruction insn; irqentry_state_t state =3D irqentry_enter(regs); =20 - if (regs->csr_prmd & CSR_PRMD_PIE) + if (!pie) local_irq_enable(); =20 current->thread.trap_nr =3D read_csr_excode(); @@ -692,7 +694,7 @@ asmlinkage void noinstr do_bce(struct pt_regs *regs) force_sig_bnderr((void __user *)badv, (void __user *)lower, (void __user = *)upper); =20 out: - if (regs->csr_prmd & CSR_PRMD_PIE) + if (!pie) local_irq_disable(); =20 irqentry_exit(regs, state); @@ -710,11 +712,12 @@ asmlinkage void noinstr do_bce(struct pt_regs *regs) asmlinkage void noinstr do_bp(struct pt_regs *regs) { bool user =3D user_mode(regs); + bool pie =3D regs_irqs_disabled(regs); unsigned int opcode, bcode; unsigned long era =3D exception_era(regs); irqentry_state_t state =3D irqentry_enter(regs); =20 - if (regs->csr_prmd & CSR_PRMD_PIE) + if (!pie) local_irq_enable(); =20 if (__get_inst(&opcode, (u32 *)era, user)) @@ -780,7 +783,7 @@ asmlinkage void noinstr do_bp(struct pt_regs *regs) } =20 out: - if (regs->csr_prmd & CSR_PRMD_PIE) + if (!pie) local_irq_disable(); =20 irqentry_exit(regs, state); @@ -1015,6 +1018,7 @@ static void init_restore_lbt(void) =20 asmlinkage void noinstr do_lbt(struct pt_regs *regs) { + bool pie =3D regs_irqs_disabled(regs); irqentry_state_t state =3D irqentry_enter(regs); =20 /* @@ -1024,7 +1028,7 @@ asmlinkage void noinstr do_lbt(struct pt_regs *regs) * (including the user using 'MOVGR2GCSR' to turn on TM, which * will not trigger the BTE), we need to check PRMD first. */ - if (regs->csr_prmd & CSR_PRMD_PIE) + if (!pie) local_irq_enable(); =20 if (!cpu_has_lbt) { @@ -1038,7 +1042,7 @@ asmlinkage void noinstr do_lbt(struct pt_regs *regs) preempt_enable(); =20 out: - if (regs->csr_prmd & CSR_PRMD_PIE) + if (!pie) local_irq_disable(); =20 irqentry_exit(regs, state); --=20 2.42.0