Skip to content

Commit 9c0e343

Browse files
committed
csky: Fixup get wrong psr value from phyical reg
We should get psr value from regs->psr in stack, not directly get it from phyiscal register then save the vector number in tsk->trap_no. Signed-off-by: Guo Ren <[email protected]>
1 parent dd7c983 commit 9c0e343

File tree

3 files changed

+18
-1
lines changed

3 files changed

+18
-1
lines changed

arch/csky/include/asm/processor.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ extern struct cpuinfo_csky cpu_data[];
4343
struct thread_struct {
4444
unsigned long ksp; /* kernel stack pointer */
4545
unsigned long sr; /* saved status register */
46+
unsigned long trap_no; /* saved status register */
4647

4748
/* FPU regs */
4849
struct user_fp __aligned(16) user_fp;

arch/csky/kernel/traps.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,8 +115,9 @@ asmlinkage void trap_c(struct pt_regs *regs)
115115
int sig;
116116
unsigned long vector;
117117
siginfo_t info;
118+
struct task_struct *tsk = current;
118119

119-
vector = (mfcr("psr") >> 16) & 0xff;
120+
vector = (regs->sr >> 16) & 0xff;
120121

121122
switch (vector) {
122123
case VEC_ZERODIV:
@@ -129,6 +130,7 @@ asmlinkage void trap_c(struct pt_regs *regs)
129130
sig = SIGTRAP;
130131
break;
131132
case VEC_ILLEGAL:
133+
tsk->thread.trap_no = vector;
132134
die_if_kernel("Kernel mode ILLEGAL", regs, vector);
133135
#ifndef CONFIG_CPU_NO_USER_BKPT
134136
if (*(uint16_t *)instruction_pointer(regs) != USR_BKPT)
@@ -146,16 +148,20 @@ asmlinkage void trap_c(struct pt_regs *regs)
146148
sig = SIGTRAP;
147149
break;
148150
case VEC_ACCESS:
151+
tsk->thread.trap_no = vector;
149152
return buserr(regs);
150153
#ifdef CONFIG_CPU_NEED_SOFTALIGN
151154
case VEC_ALIGN:
155+
tsk->thread.trap_no = vector;
152156
return csky_alignment(regs);
153157
#endif
154158
#ifdef CONFIG_CPU_HAS_FPU
155159
case VEC_FPE:
160+
tsk->thread.trap_no = vector;
156161
die_if_kernel("Kernel mode FPE", regs, vector);
157162
return fpu_fpe(regs);
158163
case VEC_PRIV:
164+
tsk->thread.trap_no = vector;
159165
die_if_kernel("Kernel mode PRIV", regs, vector);
160166
if (fpu_libc_helper(regs))
161167
return;
@@ -164,5 +170,8 @@ asmlinkage void trap_c(struct pt_regs *regs)
164170
sig = SIGSEGV;
165171
break;
166172
}
173+
174+
tsk->thread.trap_no = vector;
175+
167176
send_sig(sig, current, 0);
168177
}

arch/csky/mm/fault.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,11 +179,14 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long write,
179179
bad_area_nosemaphore:
180180
/* User mode accesses just cause a SIGSEGV */
181181
if (user_mode(regs)) {
182+
tsk->thread.trap_no = (regs->sr >> 16) & 0xff;
182183
force_sig_fault(SIGSEGV, si_code, (void __user *)address);
183184
return;
184185
}
185186

186187
no_context:
188+
tsk->thread.trap_no = (regs->sr >> 16) & 0xff;
189+
187190
/* Are we prepared to handle this kernel fault? */
188191
if (fixup_exception(regs))
189192
return;
@@ -198,6 +201,8 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long write,
198201
die_if_kernel("Oops", regs, write);
199202

200203
out_of_memory:
204+
tsk->thread.trap_no = (regs->sr >> 16) & 0xff;
205+
201206
/*
202207
* We ran out of memory, call the OOM killer, and return the userspace
203208
* (which will retry the fault, or kill us if we got oom-killed).
@@ -206,6 +211,8 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long write,
206211
return;
207212

208213
do_sigbus:
214+
tsk->thread.trap_no = (regs->sr >> 16) & 0xff;
215+
209216
up_read(&mm->mmap_sem);
210217

211218
/* Kernel mode? Handle exceptions or die */

0 commit comments

Comments
 (0)