15f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris/*
25f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris * Copyright (C) 2013 The Android Open Source Project
35f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris * All rights reserved.
45f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris *
55f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris * Redistribution and use in source and binary forms, with or without
65f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris * modification, are permitted provided that the following conditions
75f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris * are met:
85f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris *  * Redistributions of source code must retain the above copyright
95f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris *    notice, this list of conditions and the following disclaimer.
105f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris *  * Redistributions in binary form must reproduce the above copyright
115f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris *    notice, this list of conditions and the following disclaimer in
125f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris *    the documentation and/or other materials provided with the
135f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris *    distribution.
145f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris *
155f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
165f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
175f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
185f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
195f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
205f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
215f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
225f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
235f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
245f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
255f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
265f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris * SUCH DAMAGE.
275f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris */
285f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
29851e68a2402fa414544e66650e09dfdaac813e51Elliott Hughes#include <private/bionic_asm.h>
30851e68a2402fa414544e66650e09dfdaac813e51Elliott Hughes#include <private/libc_events.h>
315f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
325f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    .syntax unified
335f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    .fpu    neon
345f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    .thumb
355f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    .thumb_func
365f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
375f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris// Get the length of src string, then get the source of the dst string.
385f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris// Check that the two lengths together don't exceed the threshold, then
395f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris// do a memcpy of the data.
405f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher FerrisENTRY(__strcat_chk)
415f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    pld     [r0, #0]
425f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    push    {r0, lr}
43a57c9c084bc686a35f4f494ce23cf2a9bb3d5d00Christopher Ferris    .save   {r0, lr}
445f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    .cfi_def_cfa_offset 8
455f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    .cfi_rel_offset r0, 0
465f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    .cfi_rel_offset lr, 4
475f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    push    {r4, r5}
48a57c9c084bc686a35f4f494ce23cf2a9bb3d5d00Christopher Ferris    .save   {r4, r5}
495f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    .cfi_adjust_cfa_offset 8
505f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    .cfi_rel_offset r4, 0
515f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    .cfi_rel_offset r5, 4
525f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
535f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    mov     lr, r2
545f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
555f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    // Save the dst register to r5
565f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    mov     r5, r0
575f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
585f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    // Zero out r4
595f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    eor     r4, r4, r4
605f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
615f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    // r1 contains the address of the string to count.
625f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris.L_strlen_start:
635f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    mov     r0, r1
645f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
655f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    ands    r3, r0, #7
665f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    bne     .L_align_src
675f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
685f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    .p2align 2
695f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris.L_mainloop:
705f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    ldmia   r1!, {r2, r3}
715f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
725f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    pld     [r1, #64]
735f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
745f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    sub     ip, r2, #0x01010101
755f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    bic     ip, ip, r2
765f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    ands    ip, ip, #0x80808080
775f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    bne     .L_zero_in_first_register
785f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
795f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    sub     ip, r3, #0x01010101
805f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    bic     ip, ip, r3
815f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    ands    ip, ip, #0x80808080
825f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    bne     .L_zero_in_second_register
835f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    b       .L_mainloop
845f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
855f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris.L_zero_in_first_register:
865f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    sub     r3, r1, r0
875f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    // Check for zero in byte 0.
885f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    lsls    r2, ip, #17
895f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    beq     .L_check_byte1_reg1
905f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
915f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    sub     r3, r3, #8
925f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    b       .L_finish
935f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
945f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris.L_check_byte1_reg1:
955f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    bcc     .L_check_byte2_reg1
965f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
975f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    sub     r3, r3, #7
985f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    b       .L_finish
995f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
1005f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris.L_check_byte2_reg1:
1015f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    // Check for zero in byte 2.
1025f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    tst     ip, #0x800000
1035f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    it      ne
1045f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    subne   r3, r3, #6
1055f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    bne     .L_finish
1065f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    sub     r3, r3, #5
1075f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    b       .L_finish
1085f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
1095f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris.L_zero_in_second_register:
1105f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    sub     r3, r1, r0
1115f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    // Check for zero in byte 0.
1125f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    lsls    r2, ip, #17
1135f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    beq     .L_check_byte1_reg2
1145f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
1155f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    sub     r3, r3, #4
1165f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    b       .L_finish
1175f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
1185f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris.L_check_byte1_reg2:
1195f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    bcc     .L_check_byte2_reg2
1205f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
1215f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    sub     r3, r3, #3
1225f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    b       .L_finish
1235f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
1245f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris.L_check_byte2_reg2:
1255f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    // Check for zero in byte 2.
1265f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    tst     ip, #0x800000
1275f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    it      ne
1285f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    subne   r3, r3, #2
1295f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    bne     .L_finish
1305f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    sub     r3, r3, #1
1315f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    b       .L_finish
1325f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
1335f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris.L_align_src:
1345f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    // Align to a double word (64 bits).
1355f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    rsb     r3, r3, #8
1365f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    lsls    ip, r3, #31
1375f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    beq     .L_align_to_32
1385f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
1395f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    ldrb    r2, [r1], #1
1405f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    cbz     r2, .L_done
1415f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
1425f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris.L_align_to_32:
1435f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    bcc     .L_align_to_64
1445f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
1455f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    ldrb    r2, [r1], #1
1465f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    cbz     r2, .L_done
1475f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    ldrb    r2, [r1], #1
1485f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    cbz     r2, .L_done
1495f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
1505f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris.L_align_to_64:
1515f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    tst     r3, #4
1525f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    beq     .L_mainloop
1535f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    ldr     r2, [r1], #4
1545f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
1555f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    sub     ip, r2, #0x01010101
1565f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    bic     ip, ip, r2
1575f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    ands    ip, ip, #0x80808080
1585f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    bne     .L_zero_in_second_register
1595f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    b       .L_mainloop
1605f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
1615f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris.L_done:
1625f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    sub     r3, r1, r0
1635f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    sub     r3, r3, #1
1645f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
1655f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris.L_finish:
1665f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    cmp     r4, #0
1675f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    bne     .L_strlen_done
1685f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
1695f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    // Time to get the dst string length.
1705f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    mov     r1, r5
1715f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
1725f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    // Save the original source address to r5.
1735f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    mov     r5, r0
1745f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
1755f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    // Save the current length (adding 1 for the terminator).
1765f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    add     r4, r3, #1
1775f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    b       .L_strlen_start
1785f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
1795f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    // r0 holds the pointer to the dst string.
1805f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    // r3 holds the dst string length.
1815f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    // r4 holds the src string length + 1.
1825f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris.L_strlen_done:
1835f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    add     r2, r3, r4
1845f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    cmp     r2, lr
18516e185c9081530859c17270fbaf5798f0ea871f8Christopher Ferris    bhi     __strcat_chk_fail
1865f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
1875f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    // Set up the registers for the memcpy code.
1885f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    mov     r1, r5
1895f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    pld     [r1, #64]
1905f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    mov     r2, r4
1915f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    add     r0, r0, r3
1925f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    pop     {r4, r5}
1935f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
194a57c9c084bc686a35f4f494ce23cf2a9bb3d5d00Christopher Ferris    // Fall through into the memcpy_base function.
195a57c9c084bc686a35f4f494ce23cf2a9bb3d5d00Christopher FerrisEND(__strcat_chk)
1965f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
197a57c9c084bc686a35f4f494ce23cf2a9bb3d5d00Christopher Ferris#define MEMCPY_BASE         __strcat_chk_memcpy_base
198a57c9c084bc686a35f4f494ce23cf2a9bb3d5d00Christopher Ferris#define MEMCPY_BASE_ALIGNED __strcat_chk_memcpy_base_aligned
199a57c9c084bc686a35f4f494ce23cf2a9bb3d5d00Christopher Ferris#include "memcpy_base.S"
200a57c9c084bc686a35f4f494ce23cf2a9bb3d5d00Christopher Ferris
20132bbf8a63bb43a540cc0f1dd5037736d10b70e0bNick KralevichENTRY_PRIVATE(__strcat_chk_fail)
202a57c9c084bc686a35f4f494ce23cf2a9bb3d5d00Christopher Ferris    .save   {r0, lr}
203a57c9c084bc686a35f4f494ce23cf2a9bb3d5d00Christopher Ferris    .save   {r4, r5}
204a57c9c084bc686a35f4f494ce23cf2a9bb3d5d00Christopher Ferris    .cfi_def_cfa_offset 8
205a57c9c084bc686a35f4f494ce23cf2a9bb3d5d00Christopher Ferris    .cfi_rel_offset r0, 0
206a57c9c084bc686a35f4f494ce23cf2a9bb3d5d00Christopher Ferris    .cfi_rel_offset lr, 4
2075f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    .cfi_adjust_cfa_offset 8
2085f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    .cfi_rel_offset r4, 0
2095f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    .cfi_rel_offset r5, 4
2105f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
2115f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    ldr     r0, error_message
2125f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    ldr     r1, error_code
2135f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris1:
2145f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    add     r0, pc
2155f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    bl      __fortify_chk_fail
2165f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferriserror_code:
2175f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    .word   BIONIC_EVENT_STRCAT_BUFFER_OVERFLOW
2185f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferriserror_message:
2195f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    .word   error_string-(1b+4)
220a57c9c084bc686a35f4f494ce23cf2a9bb3d5d00Christopher FerrisEND(__strcat_chk_fail)
2215f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
2225f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    .data
2235f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferriserror_string:
22468b67113a44311b3568027af5893e316f63ec556Elliott Hughes    .string "strcat: prevented write past end of buffer"
225