[PARISC] Add ability for prctl to change unaligned trap behaviour
Add support for changing unaligned trap behaviour on a per-thread basis. Signed-off-by: Kyle McMartin <kyle@parisc-linux.org>
This commit is contained in:
parent
99ac794799
commit
f053725b89
|
@ -513,15 +513,18 @@ void handle_unaligned(struct pt_regs *regs)
|
||||||
register int flop=0; /* true if this is a flop */
|
register int flop=0; /* true if this is a flop */
|
||||||
|
|
||||||
/* log a message with pacing */
|
/* log a message with pacing */
|
||||||
if (user_mode(regs))
|
if (user_mode(regs)) {
|
||||||
{
|
if (current->thread.flags & PARISC_UAC_SIGBUS) {
|
||||||
if (unaligned_count > 5 && jiffies - last_time > 5*HZ)
|
goto force_sigbus;
|
||||||
{
|
}
|
||||||
|
|
||||||
|
if (unaligned_count > 5 && jiffies - last_time > 5*HZ) {
|
||||||
unaligned_count = 0;
|
unaligned_count = 0;
|
||||||
last_time = jiffies;
|
last_time = jiffies;
|
||||||
}
|
}
|
||||||
if (++unaligned_count < 5)
|
|
||||||
{
|
if (!(current->thread.flags & PARISC_UAC_NOPRINT)
|
||||||
|
&& ++unaligned_count < 5) {
|
||||||
char buf[256];
|
char buf[256];
|
||||||
sprintf(buf, "%s(%d): unaligned access to 0x" RFMT " at ip=0x" RFMT "\n",
|
sprintf(buf, "%s(%d): unaligned access to 0x" RFMT " at ip=0x" RFMT "\n",
|
||||||
current->comm, current->pid, regs->ior, regs->iaoq[0]);
|
current->comm, current->pid, regs->ior, regs->iaoq[0]);
|
||||||
|
@ -530,6 +533,7 @@ void handle_unaligned(struct pt_regs *regs)
|
||||||
show_regs(regs);
|
show_regs(regs);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!unaligned_enabled)
|
if (!unaligned_enabled)
|
||||||
goto force_sigbus;
|
goto force_sigbus;
|
||||||
}
|
}
|
||||||
|
|
|
@ -122,8 +122,27 @@ struct thread_struct {
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Thread struct flags. */
|
/* Thread struct flags. */
|
||||||
|
#define PARISC_UAC_NOPRINT (1UL << 0) /* see prctl and unaligned.c */
|
||||||
|
#define PARISC_UAC_SIGBUS (1UL << 1)
|
||||||
#define PARISC_KERNEL_DEATH (1UL << 31) /* see die_if_kernel()... */
|
#define PARISC_KERNEL_DEATH (1UL << 31) /* see die_if_kernel()... */
|
||||||
|
|
||||||
|
#define PARISC_UAC_SHIFT 0
|
||||||
|
#define PARISC_UAC_MASK (PARISC_UAC_NOPRINT|PARISC_UAC_SIGBUS)
|
||||||
|
|
||||||
|
#define SET_UNALIGN_CTL(task,value) \
|
||||||
|
({ \
|
||||||
|
(task)->thread.flags = (((task)->thread.flags & ~PARISC_UAC_MASK) \
|
||||||
|
| (((value) << PARISC_UAC_SHIFT) & \
|
||||||
|
PARISC_UAC_MASK)); \
|
||||||
|
0; \
|
||||||
|
})
|
||||||
|
|
||||||
|
#define GET_UNALIGN_CTL(task,addr) \
|
||||||
|
({ \
|
||||||
|
put_user(((task)->thread.flags & PARISC_UAC_MASK) \
|
||||||
|
>> PARISC_UAC_SHIFT, (int __user *) (addr)); \
|
||||||
|
})
|
||||||
|
|
||||||
#define INIT_THREAD { \
|
#define INIT_THREAD { \
|
||||||
regs: { gr: { 0, }, \
|
regs: { gr: { 0, }, \
|
||||||
fr: { 0, }, \
|
fr: { 0, }, \
|
||||||
|
|
Loading…
Reference in New Issue