1 1.1 matt /*- 2 1.1 matt * Copyright (c) 2013 The NetBSD Foundation, Inc. 3 1.1 matt * All rights reserved. 4 1.1 matt * 5 1.1 matt * This code is derived from software contributed to The NetBSD Foundation 6 1.1 matt * by Matt Thomas of 3am Software Foundry. 7 1.1 matt * 8 1.1 matt * Redistribution and use in source and binary forms, with or without 9 1.1 matt * modification, are permitted provided that the following conditions 10 1.1 matt * are met: 11 1.1 matt * 1. Redistributions of source code must retain the above copyright 12 1.1 matt * notice, this list of conditions and the following disclaimer. 13 1.1 matt * 2. Redistributions in binary form must reproduce the above copyright 14 1.1 matt * notice, this list of conditions and the following disclaimer in the 15 1.1 matt * documentation and/or other materials provided with the distribution. 16 1.1 matt * 17 1.1 matt * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 18 1.1 matt * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 19 1.1 matt * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 20 1.1 matt * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 21 1.1 matt * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22 1.1 matt * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23 1.1 matt * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 24 1.1 matt * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 25 1.1 matt * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 26 1.1 matt * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 27 1.1 matt * POSSIBILITY OF SUCH DAMAGE. 28 1.1 matt */ 29 1.1 matt #include <machine/asm.h> 30 1.1 matt 31 1.8 christos RCSID("$NetBSD: strcpy_naive.S,v 1.8 2017/01/14 04:54:42 christos Exp $") 32 1.2 matt 33 1.2 matt #ifdef _LIBC 34 1.2 matt #ifdef STRLCPY 35 1.2 matt WEAK_ALIAS(strlcpy, _strlcpy) 36 1.6 christos #define strlcpy _strlcpy 37 1.2 matt #endif 38 1.2 matt #endif 39 1.1 matt 40 1.1 matt /* 41 1.1 matt * These are "naive" versions of the str*cpy routines designed to be simple 42 1.1 matt * and small. 43 1.1 matt */ 44 1.1 matt 45 1.1 matt #if defined(STRLCPY) 46 1.1 matt /* LINTSTUB: size_t strlcpy(char *, const char *, size_t) */ 47 1.6 christos ENTRY(strlcpy) 48 1.1 matt add ip, r1, #1 /* save src pointer (+ NUL) */ 49 1.1 matt subs r2, r2, #1 /* make sure there's room for a NUL */ 50 1.1 matt blt 3f /* no room, do the strlen */ 51 1.1 matt add r2, r2, r0 /* get end of dst */ 52 1.1 matt 1: cmp r0, r2 /* room for another char? */ 53 1.1 matt beq 2f /* no, write NUL and do the strlen */ 54 1.1 matt ldrb r3, [r1], #1 /* read a byte */ 55 1.1 matt strb r3, [r0], #1 /* write a byte */ 56 1.1 matt teq r3, #0 /* was it a NUL? */ 57 1.1 matt bne 1b /* no, do next byte */ 58 1.1 matt b 4f /* yes, end of string, so return */ 59 1.1 matt 2: mov r3, #0 /* NUL */ 60 1.4 matt strb r3, [r0] /* write to end of string */ 61 1.1 matt 3: ldrb r3, [r1], #1 /* read a byte */ 62 1.1 matt teq r3, #0 /* was it a NUL? */ 63 1.1 matt bne 3b /* no, get next byte */ 64 1.1 matt 4: sub r0, r1, ip /* return length of src string */ 65 1.1 matt RET 66 1.6 christos END(strlcpy) 67 1.1 matt #elif defined(STRNCPY) 68 1.1 matt /* LINTSTUB: char * strncpy(char *, const char *, size_t) */ 69 1.7 christos ENTRY(strncpy) 70 1.1 matt mov ip, r0 /* we want to preserve r0 */ 71 1.1 matt add r2, r2, r0 /* get end of dst buffer */ 72 1.1 matt 1: cmp ip, r2 /* are at the end of dst already? */ 73 1.1 matt RETc(eq) /* yes, just return. */ 74 1.1 matt ldrb r3, [r1], #1 /* read a byte */ 75 1.1 matt strb r3, [ip], #1 /* write a byte */ 76 1.1 matt teq r3, #0 /* was it a NUL? */ 77 1.1 matt bne 1b /* no, try next byte */ 78 1.1 matt 2: cmp ip, r2 /* are at the end of dst already? */ 79 1.3 matt strblt r3, [ip], #1 /* no, write a NUL */ 80 1.1 matt blt 2b /* until dst is filled */ 81 1.1 matt 3: RET /* return dst pointer */ 82 1.7 christos END(strncpy) 83 1.1 matt #else 84 1.1 matt /* LINTSTUB: char * strcpy(char *, const char *) */ 85 1.8 christos ENTRY(strcpy) 86 1.1 matt mov ip, r0 /* we want to preserve r0 */ 87 1.1 matt 1: ldrb r3, [r1], #1 /* read a byte */ 88 1.1 matt strb r3, [ip], #1 /* write a byte */ 89 1.1 matt teq r3, #0 /* was it a NUL? */ 90 1.1 matt bne 1b /* no, try next byte */ 91 1.1 matt RET /* return dst pointer */ 92 1.8 christos END(strcpy) 93 1.1 matt #endif 94