177c93b2f2388b974253af4149aa025b4751f92adGuanXuetao/*
277c93b2f2388b974253af4149aa025b4751f92adGuanXuetao * linux/arch/unicore32/lib/strncpy_from_user.S
377c93b2f2388b974253af4149aa025b4751f92adGuanXuetao *
477c93b2f2388b974253af4149aa025b4751f92adGuanXuetao * Code specific to PKUnity SoC and UniCore ISA
577c93b2f2388b974253af4149aa025b4751f92adGuanXuetao *
677c93b2f2388b974253af4149aa025b4751f92adGuanXuetao * Copyright (C) 2001-2010 GUAN Xue-tao
777c93b2f2388b974253af4149aa025b4751f92adGuanXuetao *
877c93b2f2388b974253af4149aa025b4751f92adGuanXuetao * This program is free software; you can redistribute it and/or modify
977c93b2f2388b974253af4149aa025b4751f92adGuanXuetao * it under the terms of the GNU General Public License version 2 as
1077c93b2f2388b974253af4149aa025b4751f92adGuanXuetao * published by the Free Software Foundation.
1177c93b2f2388b974253af4149aa025b4751f92adGuanXuetao */
1277c93b2f2388b974253af4149aa025b4751f92adGuanXuetao#include <linux/linkage.h>
1377c93b2f2388b974253af4149aa025b4751f92adGuanXuetao#include <asm/assembler.h>
1477c93b2f2388b974253af4149aa025b4751f92adGuanXuetao#include <asm/errno.h>
1577c93b2f2388b974253af4149aa025b4751f92adGuanXuetao
1677c93b2f2388b974253af4149aa025b4751f92adGuanXuetao	.text
1777c93b2f2388b974253af4149aa025b4751f92adGuanXuetao	.align	5
1877c93b2f2388b974253af4149aa025b4751f92adGuanXuetao
1977c93b2f2388b974253af4149aa025b4751f92adGuanXuetao/*
2077c93b2f2388b974253af4149aa025b4751f92adGuanXuetao * Copy a string from user space to kernel space.
2177c93b2f2388b974253af4149aa025b4751f92adGuanXuetao *  r0 = dst, r1 = src, r2 = byte length
2277c93b2f2388b974253af4149aa025b4751f92adGuanXuetao * returns the number of characters copied (strlen of copied string),
2377c93b2f2388b974253af4149aa025b4751f92adGuanXuetao *  -EFAULT on exception, or "len" if we fill the whole buffer
2477c93b2f2388b974253af4149aa025b4751f92adGuanXuetao */
2577c93b2f2388b974253af4149aa025b4751f92adGuanXuetaoENTRY(__strncpy_from_user)
2677c93b2f2388b974253af4149aa025b4751f92adGuanXuetao	mov	ip, r1
2777c93b2f2388b974253af4149aa025b4751f92adGuanXuetao1:	sub.a	r2, r2, #1
2877c93b2f2388b974253af4149aa025b4751f92adGuanXuetao	ldrusr	r3, r1, 1, ns
2977c93b2f2388b974253af4149aa025b4751f92adGuanXuetao	bfs	2f
3077c93b2f2388b974253af4149aa025b4751f92adGuanXuetao	stb.w	r3, [r0]+, #1
3177c93b2f2388b974253af4149aa025b4751f92adGuanXuetao	cxor.a	r3, #0
3277c93b2f2388b974253af4149aa025b4751f92adGuanXuetao	bne	1b
3377c93b2f2388b974253af4149aa025b4751f92adGuanXuetao	sub	r1, r1, #1	@ take NUL character out of count
3477c93b2f2388b974253af4149aa025b4751f92adGuanXuetao2:	sub	r0, r1, ip
3577c93b2f2388b974253af4149aa025b4751f92adGuanXuetao	mov	pc, lr
3677c93b2f2388b974253af4149aa025b4751f92adGuanXuetaoENDPROC(__strncpy_from_user)
3777c93b2f2388b974253af4149aa025b4751f92adGuanXuetao
3877c93b2f2388b974253af4149aa025b4751f92adGuanXuetao	.pushsection .fixup,"ax"
3977c93b2f2388b974253af4149aa025b4751f92adGuanXuetao	.align	0
4077c93b2f2388b974253af4149aa025b4751f92adGuanXuetao9001:	mov	r3, #0
4177c93b2f2388b974253af4149aa025b4751f92adGuanXuetao	stb	r3, [r0+], #0	@ null terminate
4277c93b2f2388b974253af4149aa025b4751f92adGuanXuetao	mov	r0, #-EFAULT
4377c93b2f2388b974253af4149aa025b4751f92adGuanXuetao	mov	pc, lr
4477c93b2f2388b974253af4149aa025b4751f92adGuanXuetao	.popsection
4577c93b2f2388b974253af4149aa025b4751f92adGuanXuetao
46