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 3284d9c625SLionel Sambuc/* 3384d9c625SLionel Sambuc * Implementation of strcat using strlen/strcpy. 3484d9c625SLionel Sambuc */ 3584d9c625SLionel SambucENTRY(strcat) 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 {r3-r5, lr} /* save registers */ 4384d9c625SLionel Sambuc#if defined(__ARM_EABI__) && defined(__UNWIND_TABLES__) 44*0a6a1f1dSLionel Sambuc# if !defined(__ARM_DWARF_EH__) 4584d9c625SLionel Sambuc .save {r3-r5, lr} 46*0a6a1f1dSLionel Sambuc# endif 4784d9c625SLionel Sambuc .cfi_def_cfa_offset 16 4884d9c625SLionel Sambuc .cfi_offset 14, -4 4984d9c625SLionel Sambuc .cfi_offset 5, -8 5084d9c625SLionel Sambuc .cfi_offset 4, -12 5184d9c625SLionel Sambuc .cfi_offset 3, -16 5284d9c625SLionel Sambuc#endif 5384d9c625SLionel Sambuc 5484d9c625SLionel Sambuc mov r4, r0 /* save dst */ 5584d9c625SLionel Sambuc mov r5, r1 /* save append */ 5684d9c625SLionel Sambuc 5784d9c625SLionel Sambuc bl PLT_SYM(strlen) /* find length of dst */ 5884d9c625SLionel Sambuc 5984d9c625SLionel Sambuc adds r0, r0, r4 /* add to dst pointer */ 6084d9c625SLionel Sambuc mov r1, r5 /* fetch append */ 6184d9c625SLionel Sambuc bl PLT_SYM(strcpy) /* append string */ 6284d9c625SLionel Sambuc 6384d9c625SLionel Sambuc mov r0, r4 /* restore dst as return value */ 6484d9c625SLionel Sambuc pop {r3-r5, pc} /* restore registers */ 6584d9c625SLionel Sambuc#if defined(__ARM_EABI__) && defined(__UNWIND_TABLES__) 6684d9c625SLionel Sambuc .cfi_endproc 67*0a6a1f1dSLionel Sambuc# if !defined(__ARM_DWARF_EH__) 6884d9c625SLionel Sambuc .fnend 6984d9c625SLionel Sambuc# endif 70*0a6a1f1dSLionel Sambuc#endif 7184d9c625SLionel SambucEND(strcat) 72