/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/*
* The strlcpy() function copies at most dstsize-1 characters
* (dstsize being the size of the string buffer dst) from src
* to dst, truncating src if necessary. The result is always
* null-terminated. The function returns strlen(src). Buffer
* overflow can be checked as follows:
*
* if (strlcpy(dst, src, dstsize) >= dstsize)
* return -1;
*/
#include <sys/asm_linkage.h>
!
.align 32
.alignsrc:
add %i2, %g4, %l0 ! dst
or %i4, %lo(0x01010101),%i4! finish loading magic1
and %l0, 3, %g1 ! dst<1:0> to examine offset
sllx %i4, 32, %l1 ! spread magic1
cmp %g1, 1 ! dst offset of 1 or 5
or %i4, %l1, %i4 ! to all 64 bits
sub %i2, 8, %i2 ! adjust for dest pre-incr in cpy loops
be,pn %ncc, .storebyte1241 ! store 1, 2, 4, 1 bytes
sllx %i4, 7, %i5 ! Alan Mycroft's magic2
.zerobyte:
.done:
.lastword:
.endfound:
!
or %i4, %lo(0x01010101),%i4! finish loading magic1
sllx %i4, 32, %i2 ! spread magic1
or %i4, %i2, %i4 ! to all 64 bits
sllx %i4, 7, %i5 ! Alan Mycroft's magic2