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

Configure Feed

Select the types of activity you want to include in your feed.

at v4.18-rc3 174 lines 3.9 kB view raw
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 default: \ 30 __get_user_unknown(); \ 31 break; \ 32 } \ 33} while (0) 34 35#ifdef CONFIG_MMU 36#define __get_user_asm(x, addr, err, insn) \ 37({ \ 38__asm__ __volatile__( \ 39 "1:\n\t" \ 40 "mov." insn " %2, %1\n\t" \ 41 "2:\n" \ 42 ".section .fixup,\"ax\"\n" \ 43 "3:\n\t" \ 44 "mov #0, %1\n\t" \ 45 "mov.l 4f, %0\n\t" \ 46 "jmp @%0\n\t" \ 47 " mov %3, %0\n\t" \ 48 ".balign 4\n" \ 49 "4: .long 2b\n\t" \ 50 ".previous\n" \ 51 ".section __ex_table,\"a\"\n\t" \ 52 ".long 1b, 3b\n\t" \ 53 ".previous" \ 54 :"=&r" (err), "=&r" (x) \ 55 :"m" (__m(addr)), "i" (-EFAULT), "0" (err)); }) 56#else 57#define __get_user_asm(x, addr, err, insn) \ 58do { \ 59 __asm__ __volatile__ ( \ 60 "mov." insn " %1, %0\n\t" \ 61 : "=&r" (x) \ 62 : "m" (__m(addr)) \ 63 ); \ 64} while (0) 65#endif /* CONFIG_MMU */ 66 67extern void __get_user_unknown(void); 68 69#define __put_user_size(x,ptr,size,retval) \ 70do { \ 71 retval = 0; \ 72 switch (size) { \ 73 case 1: \ 74 __put_user_asm(x, ptr, retval, "b"); \ 75 break; \ 76 case 2: \ 77 __put_user_asm(x, ptr, retval, "w"); \ 78 break; \ 79 case 4: \ 80 __put_user_asm(x, ptr, retval, "l"); \ 81 break; \ 82 case 8: \ 83 __put_user_u64(x, ptr, retval); \ 84 break; \ 85 default: \ 86 __put_user_unknown(); \ 87 } \ 88} while (0) 89 90#ifdef CONFIG_MMU 91#define __put_user_asm(x, addr, err, insn) \ 92do { \ 93 __asm__ __volatile__ ( \ 94 "1:\n\t" \ 95 "mov." insn " %1, %2\n\t" \ 96 "2:\n" \ 97 ".section .fixup,\"ax\"\n" \ 98 "3:\n\t" \ 99 "mov.l 4f, %0\n\t" \ 100 "jmp @%0\n\t" \ 101 " mov %3, %0\n\t" \ 102 ".balign 4\n" \ 103 "4: .long 2b\n\t" \ 104 ".previous\n" \ 105 ".section __ex_table,\"a\"\n\t" \ 106 ".long 1b, 3b\n\t" \ 107 ".previous" \ 108 : "=&r" (err) \ 109 : "r" (x), "m" (__m(addr)), "i" (-EFAULT), \ 110 "0" (err) \ 111 : "memory" \ 112 ); \ 113} while (0) 114#else 115#define __put_user_asm(x, addr, err, insn) \ 116do { \ 117 __asm__ __volatile__ ( \ 118 "mov." insn " %0, %1\n\t" \ 119 : /* no outputs */ \ 120 : "r" (x), "m" (__m(addr)) \ 121 : "memory" \ 122 ); \ 123} while (0) 124#endif /* CONFIG_MMU */ 125 126#if defined(CONFIG_CPU_LITTLE_ENDIAN) 127#define __put_user_u64(val,addr,retval) \ 128({ \ 129__asm__ __volatile__( \ 130 "1:\n\t" \ 131 "mov.l %R1,%2\n\t" \ 132 "mov.l %S1,%T2\n\t" \ 133 "2:\n" \ 134 ".section .fixup,\"ax\"\n" \ 135 "3:\n\t" \ 136 "mov.l 4f,%0\n\t" \ 137 "jmp @%0\n\t" \ 138 " mov %3,%0\n\t" \ 139 ".balign 4\n" \ 140 "4: .long 2b\n\t" \ 141 ".previous\n" \ 142 ".section __ex_table,\"a\"\n\t" \ 143 ".long 1b, 3b\n\t" \ 144 ".previous" \ 145 : "=r" (retval) \ 146 : "r" (val), "m" (__m(addr)), "i" (-EFAULT), "0" (retval) \ 147 : "memory"); }) 148#else 149#define __put_user_u64(val,addr,retval) \ 150({ \ 151__asm__ __volatile__( \ 152 "1:\n\t" \ 153 "mov.l %S1,%2\n\t" \ 154 "mov.l %R1,%T2\n\t" \ 155 "2:\n" \ 156 ".section .fixup,\"ax\"\n" \ 157 "3:\n\t" \ 158 "mov.l 4f,%0\n\t" \ 159 "jmp @%0\n\t" \ 160 " mov %3,%0\n\t" \ 161 ".balign 4\n" \ 162 "4: .long 2b\n\t" \ 163 ".previous\n" \ 164 ".section __ex_table,\"a\"\n\t" \ 165 ".long 1b, 3b\n\t" \ 166 ".previous" \ 167 : "=r" (retval) \ 168 : "r" (val), "m" (__m(addr)), "i" (-EFAULT), "0" (retval) \ 169 : "memory"); }) 170#endif 171 172extern void __put_user_unknown(void); 173 174#endif /* __ASM_SH_UACCESS_32_H */