LoongArch: Fix and cleanup csr_era handling in do_ri()
authorHuacai Chen <chenhuacai@loongson.cn>
Mon, 26 Sep 2022 14:33:39 +0000 (22:33 +0800)
committerHuacai Chen <chenhuacai@loongson.cn>
Thu, 29 Sep 2022 02:15:00 +0000 (10:15 +0800)
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: Jun Yi <yijun@loongson.cn>
Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
arch/loongarch/kernel/traps.c

index aa1c95aaf595ba0402e80d10f82cffb74db3c735..5010e95cef8475cda9a3bd53d9d769f44cdb2057 100644 (file)
@@ -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);
-       }
+       force_sig(status);
 
 out:
        local_irq_disable();