xref: /openbmc/linux/arch/arm/lib/putuser.S (revision 93ed3970114983543bbebd195bef65db84444ea2)
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 */
29*93ed3970SCatalin Marinas#include <linux/linkage.h>
301da177e4SLinus Torvalds#include <asm/errno.h>
311da177e4SLinus Torvalds
32*93ed3970SCatalin MarinasENTRY(__put_user_1)
331da177e4SLinus Torvalds1:	strbt	r2, [r0]
341da177e4SLinus Torvalds	mov	r0, #0
351da177e4SLinus Torvalds	mov	pc, lr
36*93ed3970SCatalin MarinasENDPROC(__put_user_1)
371da177e4SLinus Torvalds
38*93ed3970SCatalin MarinasENTRY(__put_user_2)
391da177e4SLinus Torvalds	mov	ip, r2, lsr #8
401da177e4SLinus Torvalds#ifndef __ARMEB__
411da177e4SLinus Torvalds2:	strbt	r2, [r0], #1
421da177e4SLinus Torvalds3:	strbt	ip, [r0]
431da177e4SLinus Torvalds#else
441da177e4SLinus Torvalds2:	strbt	ip, [r0], #1
451da177e4SLinus Torvalds3:	strbt	r2, [r0]
461da177e4SLinus Torvalds#endif
471da177e4SLinus Torvalds	mov	r0, #0
481da177e4SLinus Torvalds	mov	pc, lr
49*93ed3970SCatalin MarinasENDPROC(__put_user_2)
501da177e4SLinus Torvalds
51*93ed3970SCatalin MarinasENTRY(__put_user_4)
521da177e4SLinus Torvalds4:	strt	r2, [r0]
531da177e4SLinus Torvalds	mov	r0, #0
541da177e4SLinus Torvalds	mov	pc, lr
55*93ed3970SCatalin MarinasENDPROC(__put_user_4)
561da177e4SLinus Torvalds
57*93ed3970SCatalin MarinasENTRY(__put_user_8)
581da177e4SLinus Torvalds5:	strt	r2, [r0], #4
591da177e4SLinus Torvalds6:	strt	r3, [r0]
601da177e4SLinus Torvalds	mov	r0, #0
611da177e4SLinus Torvalds	mov	pc, lr
62*93ed3970SCatalin MarinasENDPROC(__put_user_8)
631da177e4SLinus Torvalds
641da177e4SLinus Torvalds__put_user_bad:
651da177e4SLinus Torvalds	mov	r0, #-EFAULT
661da177e4SLinus Torvalds	mov	pc, lr
67*93ed3970SCatalin MarinasENDPROC(__put_user_bad)
681da177e4SLinus Torvalds
691da177e4SLinus Torvalds.section __ex_table, "a"
701da177e4SLinus Torvalds	.long	1b, __put_user_bad
711da177e4SLinus Torvalds	.long	2b, __put_user_bad
721da177e4SLinus Torvalds	.long	3b, __put_user_bad
731da177e4SLinus Torvalds	.long	4b, __put_user_bad
741da177e4SLinus Torvalds	.long	5b, __put_user_bad
751da177e4SLinus Torvalds	.long	6b, __put_user_bad
761da177e4SLinus Torvalds.previous
77