xref: /openbmc/linux/arch/arm/lib/putuser.S (revision 8b592783a2e8b7721a99730bd549aab5208f36af)
11da177e4SLinus Torvalds/*
21da177e4SLinus Torvalds *  linux/arch/arm/lib/putuser.S
31da177e4SLinus Torvalds *
41da177e4SLinus Torvalds *  Copyright (C) 2001 Russell King
51da177e4SLinus Torvalds *
61da177e4SLinus Torvalds * This program is free software; you can redistribute it and/or modify
71da177e4SLinus Torvalds * it under the terms of the GNU General Public License version 2 as
81da177e4SLinus Torvalds * published by the Free Software Foundation.
91da177e4SLinus Torvalds *
101da177e4SLinus Torvalds *  Idea from x86 version, (C) Copyright 1998 Linus Torvalds
111da177e4SLinus Torvalds *
121da177e4SLinus Torvalds * These functions have a non-standard call interface to make
131da177e4SLinus Torvalds * them more efficient, especially as they return an error
141da177e4SLinus Torvalds * value in addition to the "real" return value.
151da177e4SLinus Torvalds *
161da177e4SLinus Torvalds * __put_user_X
171da177e4SLinus Torvalds *
181da177e4SLinus Torvalds * Inputs:	r0 contains the address
191da177e4SLinus Torvalds *		r2, r3 contains the value
201da177e4SLinus Torvalds * Outputs:	r0 is the error code
211da177e4SLinus Torvalds *		lr corrupted
221da177e4SLinus Torvalds *
234baa9922SRussell King * No other registers must be altered.  (see <asm/uaccess.h>
241da177e4SLinus Torvalds * for specific ASM register usage).
251da177e4SLinus Torvalds *
261da177e4SLinus Torvalds * Note that ADDR_LIMIT is either 0 or 0xc0000000
271da177e4SLinus Torvalds * Note also that it is intended that __put_user_bad is not global.
281da177e4SLinus Torvalds */
2993ed3970SCatalin Marinas#include <linux/linkage.h>
301da177e4SLinus Torvalds#include <asm/errno.h>
311da177e4SLinus Torvalds
3293ed3970SCatalin MarinasENTRY(__put_user_1)
331da177e4SLinus Torvalds1:	strbt	r2, [r0]
341da177e4SLinus Torvalds	mov	r0, #0
351da177e4SLinus Torvalds	mov	pc, lr
3693ed3970SCatalin MarinasENDPROC(__put_user_1)
371da177e4SLinus Torvalds
3893ed3970SCatalin MarinasENTRY(__put_user_2)
391da177e4SLinus Torvalds	mov	ip, r2, lsr #8
40*8b592783SCatalin Marinas#ifdef CONFIG_THUMB2_KERNEL
41*8b592783SCatalin Marinas#ifndef __ARMEB__
42*8b592783SCatalin Marinas2:	strbt	r2, [r0]
43*8b592783SCatalin Marinas3:	strbt	ip, [r0, #1]
44*8b592783SCatalin Marinas#else
45*8b592783SCatalin Marinas2:	strbt	ip, [r0]
46*8b592783SCatalin Marinas3:	strbt	r2, [r0, #1]
47*8b592783SCatalin Marinas#endif
48*8b592783SCatalin Marinas#else	/* !CONFIG_THUMB2_KERNEL */
491da177e4SLinus Torvalds#ifndef __ARMEB__
501da177e4SLinus Torvalds2:	strbt	r2, [r0], #1
511da177e4SLinus Torvalds3:	strbt	ip, [r0]
521da177e4SLinus Torvalds#else
531da177e4SLinus Torvalds2:	strbt	ip, [r0], #1
541da177e4SLinus Torvalds3:	strbt	r2, [r0]
551da177e4SLinus Torvalds#endif
56*8b592783SCatalin Marinas#endif	/* CONFIG_THUMB2_KERNEL */
571da177e4SLinus Torvalds	mov	r0, #0
581da177e4SLinus Torvalds	mov	pc, lr
5993ed3970SCatalin MarinasENDPROC(__put_user_2)
601da177e4SLinus Torvalds
6193ed3970SCatalin MarinasENTRY(__put_user_4)
621da177e4SLinus Torvalds4:	strt	r2, [r0]
631da177e4SLinus Torvalds	mov	r0, #0
641da177e4SLinus Torvalds	mov	pc, lr
6593ed3970SCatalin MarinasENDPROC(__put_user_4)
661da177e4SLinus Torvalds
6793ed3970SCatalin MarinasENTRY(__put_user_8)
68*8b592783SCatalin Marinas#ifdef CONFIG_THUMB2_KERNEL
69*8b592783SCatalin Marinas5:	strt	r2, [r0]
70*8b592783SCatalin Marinas6:	strt	r3, [r0, #4]
71*8b592783SCatalin Marinas#else
721da177e4SLinus Torvalds5:	strt	r2, [r0], #4
731da177e4SLinus Torvalds6:	strt	r3, [r0]
74*8b592783SCatalin Marinas#endif
751da177e4SLinus Torvalds	mov	r0, #0
761da177e4SLinus Torvalds	mov	pc, lr
7793ed3970SCatalin MarinasENDPROC(__put_user_8)
781da177e4SLinus Torvalds
791da177e4SLinus Torvalds__put_user_bad:
801da177e4SLinus Torvalds	mov	r0, #-EFAULT
811da177e4SLinus Torvalds	mov	pc, lr
8293ed3970SCatalin MarinasENDPROC(__put_user_bad)
831da177e4SLinus Torvalds
841da177e4SLinus Torvalds.section __ex_table, "a"
851da177e4SLinus Torvalds	.long	1b, __put_user_bad
861da177e4SLinus Torvalds	.long	2b, __put_user_bad
871da177e4SLinus Torvalds	.long	3b, __put_user_bad
881da177e4SLinus Torvalds	.long	4b, __put_user_bad
891da177e4SLinus Torvalds	.long	5b, __put_user_bad
901da177e4SLinus Torvalds	.long	6b, __put_user_bad
911da177e4SLinus Torvalds.previous
92