184d9c625SLionel Sambuc/*- 284d9c625SLionel Sambuc * Copyright (c) 2013 The NetBSD Foundation, Inc. 384d9c625SLionel Sambuc * All rights reserved. 484d9c625SLionel Sambuc * 584d9c625SLionel Sambuc * This code is derived from software contributed to The NetBSD Foundation 684d9c625SLionel Sambuc * by Matt Thomas of 3am Software Foundry. 784d9c625SLionel Sambuc * 884d9c625SLionel Sambuc * Redistribution and use in source and binary forms, with or without 984d9c625SLionel Sambuc * modification, are permitted provided that the following conditions 1084d9c625SLionel Sambuc * are met: 1184d9c625SLionel Sambuc * 1. Redistributions of source code must retain the above copyright 1284d9c625SLionel Sambuc * notice, this list of conditions and the following disclaimer. 1384d9c625SLionel Sambuc * 2. Redistributions in binary form must reproduce the above copyright 1484d9c625SLionel Sambuc * notice, this list of conditions and the following disclaimer in the 1584d9c625SLionel Sambuc * documentation and/or other materials provided with the distribution. 1684d9c625SLionel Sambuc * 1784d9c625SLionel Sambuc * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 1884d9c625SLionel Sambuc * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 1984d9c625SLionel Sambuc * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 2084d9c625SLionel Sambuc * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 2184d9c625SLionel Sambuc * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2284d9c625SLionel Sambuc * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2384d9c625SLionel Sambuc * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2484d9c625SLionel Sambuc * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 2584d9c625SLionel Sambuc * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 2684d9c625SLionel Sambuc * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 2784d9c625SLionel Sambuc * POSSIBILITY OF SUCH DAMAGE. 2884d9c625SLionel Sambuc */ 2984d9c625SLionel Sambuc 3084d9c625SLionel Sambuc#include <machine/asm.h> 3184d9c625SLionel Sambuc 32*0a6a1f1dSLionel SambucRCSID("$NetBSD: strlcat_arm.S,v 1.6 2014/05/06 16:02:11 joerg Exp $") 3384d9c625SLionel Sambuc 3484d9c625SLionel Sambuc/* LINTSTUB: size_t strlcat(char *, const char *, size_t) */ 3584d9c625SLionel SambucENTRY(strlcat) 3684d9c625SLionel Sambuc#if defined(__ARM_EABI__) && defined(__UNWIND_TABLES__) 37*0a6a1f1dSLionel Sambuc# if !defined(__ARM_DWARF_EH__) 3884d9c625SLionel Sambuc .fnstart 39*0a6a1f1dSLionel Sambuc# endif 4084d9c625SLionel Sambuc .cfi_startproc 4184d9c625SLionel Sambuc#endif 4284d9c625SLionel Sambuc push {r4-r6, lr} 4384d9c625SLionel Sambuc#if defined(__ARM_EABI__) && defined(__UNWIND_TABLES__) 44*0a6a1f1dSLionel Sambuc# if !defined(__ARM_DWARF_EH__) 4584d9c625SLionel Sambuc .save {r4-r6, lr} 46*0a6a1f1dSLionel Sambuc# endif 4784d9c625SLionel Sambuc .cfi_def_cfa_offset 16 4884d9c625SLionel Sambuc .cfi_offset 14, -4 4984d9c625SLionel Sambuc .cfi_offset 6, -8 5084d9c625SLionel Sambuc .cfi_offset 5, -12 5184d9c625SLionel Sambuc .cfi_offset 4, -16 5284d9c625SLionel Sambuc#endif 5384d9c625SLionel Sambuc mov r4, r0 /* save dst */ 5484d9c625SLionel Sambuc mov r5, r1 /* save src */ 5584d9c625SLionel Sambuc mov r6, r2 /* save siz */ 5684d9c625SLionel Sambuc 5784d9c625SLionel Sambuc mov r1, r6 /* get siz */ 5884d9c625SLionel Sambuc bl PLT_SYM(strnlen) /* find length of dst (up to siz) */ 5984d9c625SLionel Sambuc 6084d9c625SLionel Sambuc subs r2, r6, r0 /* get remaining space in dst */ 6184d9c625SLionel Sambuc mov r1, r5 /* restore src */ 6284d9c625SLionel Sambuc mov r5, r0 /* save remaining space */ 6384d9c625SLionel Sambuc adds r0, r0, r4 /* set start to end of dst */ 6484d9c625SLionel Sambuc bl PLT_SYM(strlcpy) /* attempt to copy src */ 6584d9c625SLionel Sambuc adds r0, r0, r5 /* add remaining to strlcpy return */ 6684d9c625SLionel Sambuc pop {r4-r6, pc} /* restore registers and return */ 6784d9c625SLionel Sambuc#if defined(__ARM_EABI__) && defined(__UNWIND_TABLES__) 6884d9c625SLionel Sambuc .cfi_endproc 69*0a6a1f1dSLionel Sambuc# if !defined(__ARM_DWARF_EH__) 7084d9c625SLionel Sambuc .fnend 7184d9c625SLionel Sambuc# endif 72*0a6a1f1dSLionel Sambuc#endif 7384d9c625SLionel SambucEND(strlcat) 74