uaccess_32.h (5007B)
1/* SPDX-License-Identifier: GPL-2.0 */ 2/* 3 * User space memory access functions 4 * 5 * Copyright (C) 1999, 2002 Niibe Yutaka 6 * Copyright (C) 2003 - 2008 Paul Mundt 7 * 8 * Based on: 9 * MIPS implementation version 1.15 by 10 * Copyright (C) 1996, 1997, 1998 by Ralf Baechle 11 * and i386 version. 12 */ 13#ifndef __ASM_SH_UACCESS_32_H 14#define __ASM_SH_UACCESS_32_H 15 16#define __get_user_size(x,ptr,size,retval) \ 17do { \ 18 retval = 0; \ 19 switch (size) { \ 20 case 1: \ 21 __get_user_asm(x, ptr, retval, "b"); \ 22 break; \ 23 case 2: \ 24 __get_user_asm(x, ptr, retval, "w"); \ 25 break; \ 26 case 4: \ 27 __get_user_asm(x, ptr, retval, "l"); \ 28 break; \ 29 case 8: \ 30 __get_user_u64(x, ptr, retval); \ 31 break; \ 32 default: \ 33 __get_user_unknown(); \ 34 break; \ 35 } \ 36} while (0) 37 38#ifdef CONFIG_MMU 39#define __get_user_asm(x, addr, err, insn) \ 40({ \ 41__asm__ __volatile__( \ 42 "1:\n\t" \ 43 "mov." insn " %2, %1\n\t" \ 44 "2:\n" \ 45 ".section .fixup,\"ax\"\n" \ 46 "3:\n\t" \ 47 "mov #0, %1\n\t" \ 48 "mov.l 4f, %0\n\t" \ 49 "jmp @%0\n\t" \ 50 " mov %3, %0\n\t" \ 51 ".balign 4\n" \ 52 "4: .long 2b\n\t" \ 53 ".previous\n" \ 54 ".section __ex_table,\"a\"\n\t" \ 55 ".long 1b, 3b\n\t" \ 56 ".previous" \ 57 :"=&r" (err), "=&r" (x) \ 58 :"m" (__m(addr)), "i" (-EFAULT), "0" (err)); }) 59#else 60#define __get_user_asm(x, addr, err, insn) \ 61do { \ 62 __asm__ __volatile__ ( \ 63 "mov." insn " %1, %0\n\t" \ 64 : "=&r" (x) \ 65 : "m" (__m(addr)) \ 66 ); \ 67} while (0) 68#endif /* CONFIG_MMU */ 69 70extern void __get_user_unknown(void); 71 72#if defined(CONFIG_CPU_LITTLE_ENDIAN) 73#define __get_user_u64(x, addr, err) \ 74({ \ 75__asm__ __volatile__( \ 76 "1:\n\t" \ 77 "mov.l %2,%R1\n\t" \ 78 "mov.l %T2,%S1\n\t" \ 79 "2:\n" \ 80 ".section .fixup,\"ax\"\n" \ 81 "3:\n\t" \ 82 "mov #0,%R1\n\t" \ 83 "mov #0,%S1\n\t" \ 84 "mov.l 4f, %0\n\t" \ 85 "jmp @%0\n\t" \ 86 " mov %3, %0\n\t" \ 87 ".balign 4\n" \ 88 "4: .long 2b\n\t" \ 89 ".previous\n" \ 90 ".section __ex_table,\"a\"\n\t" \ 91 ".long 1b, 3b\n\t" \ 92 ".long 1b + 2, 3b\n\t" \ 93 ".previous" \ 94 :"=&r" (err), "=&r" (x) \ 95 :"m" (__m(addr)), "i" (-EFAULT), "0" (err)); }) 96#else 97#define __get_user_u64(x, addr, err) \ 98({ \ 99__asm__ __volatile__( \ 100 "1:\n\t" \ 101 "mov.l %2,%S1\n\t" \ 102 "mov.l %T2,%R1\n\t" \ 103 "2:\n" \ 104 ".section .fixup,\"ax\"\n" \ 105 "3:\n\t" \ 106 "mov #0,%S1\n\t" \ 107 "mov #0,%R1\n\t" \ 108 "mov.l 4f, %0\n\t" \ 109 "jmp @%0\n\t" \ 110 " mov %3, %0\n\t" \ 111 ".balign 4\n" \ 112 "4: .long 2b\n\t" \ 113 ".previous\n" \ 114 ".section __ex_table,\"a\"\n\t" \ 115 ".long 1b, 3b\n\t" \ 116 ".long 1b + 2, 3b\n\t" \ 117 ".previous" \ 118 :"=&r" (err), "=&r" (x) \ 119 :"m" (__m(addr)), "i" (-EFAULT), "0" (err)); }) 120#endif 121 122#define __put_user_size(x,ptr,size,retval) \ 123do { \ 124 retval = 0; \ 125 switch (size) { \ 126 case 1: \ 127 __put_user_asm(x, ptr, retval, "b"); \ 128 break; \ 129 case 2: \ 130 __put_user_asm(x, ptr, retval, "w"); \ 131 break; \ 132 case 4: \ 133 __put_user_asm(x, ptr, retval, "l"); \ 134 break; \ 135 case 8: \ 136 __put_user_u64(x, ptr, retval); \ 137 break; \ 138 default: \ 139 __put_user_unknown(); \ 140 } \ 141} while (0) 142 143#ifdef CONFIG_MMU 144#define __put_user_asm(x, addr, err, insn) \ 145do { \ 146 __asm__ __volatile__ ( \ 147 "1:\n\t" \ 148 "mov." insn " %1, %2\n\t" \ 149 "2:\n" \ 150 ".section .fixup,\"ax\"\n" \ 151 "3:\n\t" \ 152 "mov.l 4f, %0\n\t" \ 153 "jmp @%0\n\t" \ 154 " mov %3, %0\n\t" \ 155 ".balign 4\n" \ 156 "4: .long 2b\n\t" \ 157 ".previous\n" \ 158 ".section __ex_table,\"a\"\n\t" \ 159 ".long 1b, 3b\n\t" \ 160 ".previous" \ 161 : "=&r" (err) \ 162 : "r" (x), "m" (__m(addr)), "i" (-EFAULT), \ 163 "0" (err) \ 164 : "memory" \ 165 ); \ 166} while (0) 167#else 168#define __put_user_asm(x, addr, err, insn) \ 169do { \ 170 __asm__ __volatile__ ( \ 171 "mov." insn " %0, %1\n\t" \ 172 : /* no outputs */ \ 173 : "r" (x), "m" (__m(addr)) \ 174 : "memory" \ 175 ); \ 176} while (0) 177#endif /* CONFIG_MMU */ 178 179#if defined(CONFIG_CPU_LITTLE_ENDIAN) 180#define __put_user_u64(val,addr,retval) \ 181({ \ 182__asm__ __volatile__( \ 183 "1:\n\t" \ 184 "mov.l %R1,%2\n\t" \ 185 "mov.l %S1,%T2\n\t" \ 186 "2:\n" \ 187 ".section .fixup,\"ax\"\n" \ 188 "3:\n\t" \ 189 "mov.l 4f,%0\n\t" \ 190 "jmp @%0\n\t" \ 191 " mov %3,%0\n\t" \ 192 ".balign 4\n" \ 193 "4: .long 2b\n\t" \ 194 ".previous\n" \ 195 ".section __ex_table,\"a\"\n\t" \ 196 ".long 1b, 3b\n\t" \ 197 ".previous" \ 198 : "=r" (retval) \ 199 : "r" (val), "m" (__m(addr)), "i" (-EFAULT), "0" (retval) \ 200 : "memory"); }) 201#else 202#define __put_user_u64(val,addr,retval) \ 203({ \ 204__asm__ __volatile__( \ 205 "1:\n\t" \ 206 "mov.l %S1,%2\n\t" \ 207 "mov.l %R1,%T2\n\t" \ 208 "2:\n" \ 209 ".section .fixup,\"ax\"\n" \ 210 "3:\n\t" \ 211 "mov.l 4f,%0\n\t" \ 212 "jmp @%0\n\t" \ 213 " mov %3,%0\n\t" \ 214 ".balign 4\n" \ 215 "4: .long 2b\n\t" \ 216 ".previous\n" \ 217 ".section __ex_table,\"a\"\n\t" \ 218 ".long 1b, 3b\n\t" \ 219 ".previous" \ 220 : "=r" (retval) \ 221 : "r" (val), "m" (__m(addr)), "i" (-EFAULT), "0" (retval) \ 222 : "memory"); }) 223#endif 224 225extern void __put_user_unknown(void); 226 227#endif /* __ASM_SH_UACCESS_32_H */