1/* SPDX-License-Identifier: GPL-2.0-only */ 2/* 3 * linux/arch/arm/lib/putuser.S 4 * 5 * Copyright (C) 2001 Russell King 6 * 7 * Idea from x86 version, (C) Copyright 1998 Linus Torvalds 8 * 9 * These functions have a non-standard call interface to make 10 * them more efficient, especially as they return an error 11 * value in addition to the "real" return value. 12 * 13 * __put_user_X 14 * 15 * Inputs: r0 contains the address 16 * r1 contains the address limit, which must be preserved 17 * r2, r3 contains the value 18 * Outputs: r0 is the error code 19 * lr corrupted 20 * 21 * No other registers must be altered. (see <asm/uaccess.h> 22 * for specific ASM register usage). 23 * 24 * Note that ADDR_LIMIT is either 0 or 0xc0000000 25 * Note also that it is intended that __put_user_bad is not global. 26 */ 27#include <linux/linkage.h> 28#include <asm/assembler.h> 29#include <asm/errno.h> 30#include <asm/extable.h> 31#include <asm/domain.h> 32 33ENTRY(__put_user_1) 34 check_uaccess r0, 1, r1, ip, __put_user_bad 351: TUSER(strb) r2, [r0] 36 mov r0, #0 37 ret lr 38ENDPROC(__put_user_1) 39 40ENTRY(__put_user_2) 41 check_uaccess r0, 2, r1, ip, __put_user_bad 42#if __LINUX_ARM_ARCH__ >= 6 43 442: TUSER(strh) r2, [r0] 45 46#else 47 48 mov ip, r2, lsr #8 49#ifndef __ARMEB__ 502: TUSER(strb) r2, [r0], #1 513: TUSER(strb) ip, [r0] 52#else 532: TUSER(strb) ip, [r0], #1 543: TUSER(strb) r2, [r0] 55#endif 56 57#endif /* __LINUX_ARM_ARCH__ >= 6 */ 58 mov r0, #0 59 ret lr 60ENDPROC(__put_user_2) 61 62ENTRY(__put_user_4) 63 check_uaccess r0, 4, r1, ip, __put_user_bad 644: TUSER(str) r2, [r0] 65 mov r0, #0 66 ret lr 67ENDPROC(__put_user_4) 68 69ENTRY(__put_user_8) 70 check_uaccess r0, 8, r1, ip, __put_user_bad 71#ifdef CONFIG_THUMB2_KERNEL 725: TUSER(str) r2, [r0] 736: TUSER(str) r3, [r0, #4] 74#else 755: TUSER(str) r2, [r0], #4 766: TUSER(str) r3, [r0] 77#endif 78 mov r0, #0 79 ret lr 80ENDPROC(__put_user_8) 81 82__put_user_bad: 83 mov r0, #-EFAULT 84 ret lr 85ENDPROC(__put_user_bad) 86 87 ex_entry 1b, __put_user_bad 88 ex_entry 2b, __put_user_bad 89#if __LINUX_ARM_ARCH__ < 6 90 ex_entry 3b, __put_user_bad 91#endif 92 ex_entry 4b, __put_user_bad 93 ex_entry 5b, __put_user_bad 94 ex_entry 6b, __put_user_bad 95