diff options
author | Magnus Damm <magnus.damm@gmail.com> | 2008-02-07 11:58:46 +0100 |
---|---|---|
committer | Paul Mundt <lethal@linux-sh.org> | 2008-02-14 06:22:09 +0100 |
commit | 4252c659a4e7f4260e4bdc87538578236c51ab2d (patch) | |
tree | 0b85509081e8ad05db5514bccaa71f384dfa92bd /arch | |
parent | sh: make copy_to/from_user() static inline (diff) | |
download | linux-4252c659a4e7f4260e4bdc87538578236c51ab2d.tar.xz linux-4252c659a4e7f4260e4bdc87538578236c51ab2d.zip |
sh: add byte support to the sign extension code
This patch adds byte support to the sign extension code. Unaligned access
traps should never be generated on 8-bit io operations, but we will use this
code for trapped io and we do need byte support there.
Signed-off-by: Magnus Damm <damm@igel.co.jp>
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/sh/kernel/traps_32.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/arch/sh/kernel/traps_32.c b/arch/sh/kernel/traps_32.c index 7154a7b2135b..2e7dd2ebec9a 100644 --- a/arch/sh/kernel/traps_32.c +++ b/arch/sh/kernel/traps_32.c @@ -150,14 +150,24 @@ static int die_if_no_fixup(const char * str, struct pt_regs * regs, long err) static inline void sign_extend(unsigned int count, unsigned char *dst) { #ifdef __LITTLE_ENDIAN__ + if ((count == 1) && dst[0] & 0x80) { + dst[1] = 0xff; + dst[2] = 0xff; + dst[3] = 0xff; + } if ((count == 2) && dst[1] & 0x80) { dst[2] = 0xff; dst[3] = 0xff; } #else - if ((count == 2) && dst[2] & 0x80) { + if ((count == 1) && dst[3] & 0x80) { + dst[2] = 0xff; + dst[1] = 0xff; dst[0] = 0xff; + } + if ((count == 2) && dst[2] & 0x80) { dst[1] = 0xff; + dst[0] = 0xff; } #endif } |