Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ARC: Handle un-aligned user space access in BE.

Adding endian awarness to un-aligned access exception handling.

Signed-off-by: Noam Camus <noamc@ezchip.com>
Signed-off-by: Vineet Gupta <vgupta@synopsys.com>

authored by

Noam Camus and committed by
Vineet Gupta
7d669a19 947bf103

+19 -7
+19 -7
arch/arc/kernel/unaligned.c
··· 16 16 #include <linux/uaccess.h> 17 17 #include <asm/disasm.h> 18 18 19 + #ifdef CONFIG_CPU_BIG_ENDIAN 20 + #define BE 1 21 + #define FIRST_BYTE_16 "swap %1, %1\n swape %1, %1\n" 22 + #define FIRST_BYTE_32 "swape %1, %1\n" 23 + #else 24 + #define BE 0 25 + #define FIRST_BYTE_16 26 + #define FIRST_BYTE_32 27 + #endif 28 + 19 29 #define __get8_unaligned_check(val, addr, err) \ 20 30 __asm__( \ 21 31 "1: ldb.ab %1, [%2, 1]\n" \ ··· 46 36 do { \ 47 37 unsigned int err = 0, v, a = addr; \ 48 38 __get8_unaligned_check(v, a, err); \ 49 - val = v ; \ 39 + val = v << ((BE) ? 8 : 0); \ 50 40 __get8_unaligned_check(v, a, err); \ 51 - val |= v << 8; \ 41 + val |= v << ((BE) ? 0 : 8); \ 52 42 if (err) \ 53 43 goto fault; \ 54 44 } while (0) ··· 57 47 do { \ 58 48 unsigned int err = 0, v, a = addr; \ 59 49 __get8_unaligned_check(v, a, err); \ 60 - val = v << 0; \ 50 + val = v << ((BE) ? 24 : 0); \ 61 51 __get8_unaligned_check(v, a, err); \ 62 - val |= v << 8; \ 52 + val |= v << ((BE) ? 16 : 8); \ 63 53 __get8_unaligned_check(v, a, err); \ 64 - val |= v << 16; \ 54 + val |= v << ((BE) ? 8 : 16); \ 65 55 __get8_unaligned_check(v, a, err); \ 66 - val |= v << 24; \ 56 + val |= v << ((BE) ? 0 : 24); \ 67 57 if (err) \ 68 58 goto fault; \ 69 59 } while (0) ··· 73 63 unsigned int err = 0, v = val, a = addr;\ 74 64 \ 75 65 __asm__( \ 66 + FIRST_BYTE_16 \ 76 67 "1: stb.ab %1, [%2, 1]\n" \ 77 68 " lsr %1, %1, 8\n" \ 78 69 "2: stb %1, [%2]\n" \ ··· 98 87 #define put32_unaligned_check(val, addr) \ 99 88 do { \ 100 89 unsigned int err = 0, v = val, a = addr;\ 101 - __asm__( \ 102 90 \ 91 + __asm__( \ 92 + FIRST_BYTE_32 \ 103 93 "1: stb.ab %1, [%2, 1]\n" \ 104 94 " lsr %1, %1, 8\n" \ 105 95 "2: stb.ab %1, [%2, 1]\n" \