xref: /openbmc/linux/arch/arm/lib/putuser.S (revision 247055aa21ffef1c49dd64710d5e94c2aee19b58)
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>
31*247055aaSCatalin Marinas#include <asm/domain.h>
321da177e4SLinus Torvalds
3393ed3970SCatalin MarinasENTRY(__put_user_1)
34*247055aaSCatalin Marinas1:	T(strb)	r2, [r0]
351da177e4SLinus Torvalds	mov	r0, #0
361da177e4SLinus Torvalds	mov	pc, lr
3793ed3970SCatalin MarinasENDPROC(__put_user_1)
381da177e4SLinus Torvalds
3993ed3970SCatalin MarinasENTRY(__put_user_2)
401da177e4SLinus Torvalds	mov	ip, r2, lsr #8
418b592783SCatalin Marinas#ifdef CONFIG_THUMB2_KERNEL
428b592783SCatalin Marinas#ifndef __ARMEB__
43*247055aaSCatalin Marinas2:	T(strb)	r2, [r0]
44*247055aaSCatalin Marinas3:	T(strb)	ip, [r0, #1]
458b592783SCatalin Marinas#else
46*247055aaSCatalin Marinas2:	T(strb)	ip, [r0]
47*247055aaSCatalin Marinas3:	T(strb)	r2, [r0, #1]
488b592783SCatalin Marinas#endif
498b592783SCatalin Marinas#else	/* !CONFIG_THUMB2_KERNEL */
501da177e4SLinus Torvalds#ifndef __ARMEB__
51*247055aaSCatalin Marinas2:	T(strb)	r2, [r0], #1
52*247055aaSCatalin Marinas3:	T(strb)	ip, [r0]
531da177e4SLinus Torvalds#else
54*247055aaSCatalin Marinas2:	T(strb)	ip, [r0], #1
55*247055aaSCatalin Marinas3:	T(strb)	r2, [r0]
561da177e4SLinus Torvalds#endif
578b592783SCatalin Marinas#endif	/* CONFIG_THUMB2_KERNEL */
581da177e4SLinus Torvalds	mov	r0, #0
591da177e4SLinus Torvalds	mov	pc, lr
6093ed3970SCatalin MarinasENDPROC(__put_user_2)
611da177e4SLinus Torvalds
6293ed3970SCatalin MarinasENTRY(__put_user_4)
63*247055aaSCatalin Marinas4:	T(str)	r2, [r0]
641da177e4SLinus Torvalds	mov	r0, #0
651da177e4SLinus Torvalds	mov	pc, lr
6693ed3970SCatalin MarinasENDPROC(__put_user_4)
671da177e4SLinus Torvalds
6893ed3970SCatalin MarinasENTRY(__put_user_8)
698b592783SCatalin Marinas#ifdef CONFIG_THUMB2_KERNEL
70*247055aaSCatalin Marinas5:	T(str)	r2, [r0]
71*247055aaSCatalin Marinas6:	T(str)	r3, [r0, #4]
728b592783SCatalin Marinas#else
73*247055aaSCatalin Marinas5:	T(str)	r2, [r0], #4
74*247055aaSCatalin Marinas6:	T(str)	r3, [r0]
758b592783SCatalin Marinas#endif
761da177e4SLinus Torvalds	mov	r0, #0
771da177e4SLinus Torvalds	mov	pc, lr
7893ed3970SCatalin MarinasENDPROC(__put_user_8)
791da177e4SLinus Torvalds
801da177e4SLinus Torvalds__put_user_bad:
811da177e4SLinus Torvalds	mov	r0, #-EFAULT
821da177e4SLinus Torvalds	mov	pc, lr
8393ed3970SCatalin MarinasENDPROC(__put_user_bad)
841da177e4SLinus Torvalds
854260415fSRussell King.pushsection __ex_table, "a"
861da177e4SLinus Torvalds	.long	1b, __put_user_bad
871da177e4SLinus Torvalds	.long	2b, __put_user_bad
881da177e4SLinus Torvalds	.long	3b, __put_user_bad
891da177e4SLinus Torvalds	.long	4b, __put_user_bad
901da177e4SLinus Torvalds	.long	5b, __put_user_bad
911da177e4SLinus Torvalds	.long	6b, __put_user_bad
924260415fSRussell King.popsection
93