mirror of
https://github.com/torvalds/linux.git
synced 2024-11-26 06:02:05 +00:00
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: Jun Yi <yijun@loongson.cn> Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
This commit is contained in:
parent
2938431e93
commit
06e76acec7
@ -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();
|
||||
|
Loading…
Reference in New Issue
Block a user