Commit 06e76ace authored by Huacai Chen's avatar Huacai Chen
Browse files

LoongArch: Fix and cleanup csr_era handling in do_ri()



We don't emulate reserved instructions and just send a signal to the
current process now. So we don't need to call compute_return_era() to
add 4 (point to the next instruction) to csr_era in pt_regs. RA/ERA's
backup/restore is cleaned up as well.

Signed-off-by: default avatarJun Yi <yijun@loongson.cn>
Signed-off-by: default avatarHuacai Chen <chenhuacai@loongson.cn>
parent 2938431e
Loading
Loading
Loading
Loading
+2 −13
Original line number Diff line number Diff line
@@ -461,11 +461,9 @@ asmlinkage void noinstr do_watch(struct pt_regs *regs)

asmlinkage void noinstr do_ri(struct pt_regs *regs)
{
	int status = -1;
	int status = SIGILL;
	unsigned int opcode = 0;
	unsigned int __user *era = (unsigned int __user *)exception_era(regs);
	unsigned long old_era = regs->csr_era;
	unsigned long old_ra = regs->regs[1];
	irqentry_state_t state = irqentry_enter(regs);

	local_irq_enable();
@@ -477,21 +475,12 @@ asmlinkage void noinstr do_ri(struct pt_regs *regs)

	die_if_kernel("Reserved instruction in kernel code", regs);

	compute_return_era(regs);

	if (unlikely(get_user(opcode, era) < 0)) {
		status = SIGSEGV;
		current->thread.error_code = 1;
	}

	if (status < 0)
		status = SIGILL;

	if (unlikely(status > 0)) {
		regs->csr_era = old_era;		/* Undo skip-over.  */
		regs->regs[1] = old_ra;
	force_sig(status);
	}

out:
	local_irq_disable();