|  | /* strncpy_from_user.S: Sparc strncpy from userspace. | 
|  | * | 
|  | *  Copyright(C) 1996 David S. Miller | 
|  | */ | 
|  |  | 
|  | #include <asm/ptrace.h> | 
|  | #include <asm/errno.h> | 
|  |  | 
|  | .text | 
|  | .align	4 | 
|  |  | 
|  | /* Must return: | 
|  | * | 
|  | * -EFAULT		for an exception | 
|  | * count		if we hit the buffer limit | 
|  | * bytes copied		if we hit a null byte | 
|  | */ | 
|  |  | 
|  | .globl	__strncpy_from_user | 
|  | __strncpy_from_user: | 
|  | /* %o0=dest, %o1=src, %o2=count */ | 
|  | mov	%o2, %o3 | 
|  | 1: | 
|  | subcc	%o2, 1, %o2 | 
|  | bneg	2f | 
|  | nop | 
|  | 10: | 
|  | ldub	[%o1], %o4 | 
|  | add	%o0, 1, %o0 | 
|  | cmp	%o4, 0 | 
|  | add	%o1, 1, %o1 | 
|  | bne	1b | 
|  | stb	%o4, [%o0 - 1] | 
|  | 2: | 
|  | add	%o2, 1, %o0 | 
|  | retl | 
|  | sub	%o3, %o0, %o0 | 
|  |  | 
|  | .section .fixup,#alloc,#execinstr | 
|  | .align	4 | 
|  | 4: | 
|  | retl | 
|  | mov	-EFAULT, %o0 | 
|  |  | 
|  | .section __ex_table,#alloc | 
|  | .align	4 | 
|  | .word	10b, 4b |