diff options
author | Paul Mackerras <paulus@samba.org> | 2006-06-07 02:15:39 -0400 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2006-06-09 07:24:16 -0400 |
commit | e9370ae15dc2f8ba1e1889ce26f13cda565b6ecb (patch) | |
tree | 338ed732f7a6607bc168795008e244f180876cda /arch | |
parent | fab5db97e44f76461f76b24adfa8ccb14d4df498 (diff) |
[PATCH] powerpc: Implement PR_[GS]ET_UNALIGN prctls for powerpc
This gives the ability to control whether alignment exceptions get
fixed up or reported to the process as a SIGBUS, using the existing
PR_SET_UNALIGN and PR_GET_UNALIGN prctls. We do not implement the
option of logging a message on alignment exceptions.
Signed-off-by: Paul Mackerras <paulus@samba.org>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/powerpc/kernel/process.c | 11 | ||||
-rw-r--r-- | arch/powerpc/kernel/traps.c | 6 |
2 files changed, 15 insertions, 2 deletions
diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c index 2d35d83961b2..e4732459c485 100644 --- a/arch/powerpc/kernel/process.c +++ b/arch/powerpc/kernel/process.c | |||
@@ -752,6 +752,17 @@ int get_endian(struct task_struct *tsk, unsigned long adr) | |||
752 | return put_user(val, (unsigned int __user *)adr); | 752 | return put_user(val, (unsigned int __user *)adr); |
753 | } | 753 | } |
754 | 754 | ||
755 | int set_unalign_ctl(struct task_struct *tsk, unsigned int val) | ||
756 | { | ||
757 | tsk->thread.align_ctl = val; | ||
758 | return 0; | ||
759 | } | ||
760 | |||
761 | int get_unalign_ctl(struct task_struct *tsk, unsigned long adr) | ||
762 | { | ||
763 | return put_user(tsk->thread.align_ctl, (unsigned int __user *)adr); | ||
764 | } | ||
765 | |||
755 | #define TRUNC_PTR(x) ((typeof(x))(((unsigned long)(x)) & 0xffffffff)) | 766 | #define TRUNC_PTR(x) ((typeof(x))(((unsigned long)(x)) & 0xffffffff)) |
756 | 767 | ||
757 | int sys_clone(unsigned long clone_flags, unsigned long usp, | 768 | int sys_clone(unsigned long clone_flags, unsigned long usp, |
diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c index 03def5715494..91a6e04d9741 100644 --- a/arch/powerpc/kernel/traps.c +++ b/arch/powerpc/kernel/traps.c | |||
@@ -805,9 +805,11 @@ void __kprobes program_check_exception(struct pt_regs *regs) | |||
805 | 805 | ||
806 | void alignment_exception(struct pt_regs *regs) | 806 | void alignment_exception(struct pt_regs *regs) |
807 | { | 807 | { |
808 | int fixed; | 808 | int fixed = 0; |
809 | 809 | ||
810 | fixed = fix_alignment(regs); | 810 | /* we don't implement logging of alignment exceptions */ |
811 | if (!(current->thread.align_ctl & PR_UNALIGN_SIGBUS)) | ||
812 | fixed = fix_alignment(regs); | ||
811 | 813 | ||
812 | if (fixed == 1) { | 814 | if (fixed == 1) { |
813 | regs->nip += 4; /* skip over emulated instruction */ | 815 | regs->nip += 4; /* skip over emulated instruction */ |