17c83a1ed81a15f3e75836c1ac7d500a952f02e10Christopher Ferris/*
24d8fe5177eae8abe3cf5a596916e85daee78a0f4Christopher Ferris * Copyright (C) 2013 The Android Open Source Project
37c83a1ed81a15f3e75836c1ac7d500a952f02e10Christopher Ferris * All rights reserved.
47c83a1ed81a15f3e75836c1ac7d500a952f02e10Christopher Ferris *
57c83a1ed81a15f3e75836c1ac7d500a952f02e10Christopher Ferris * Redistribution and use in source and binary forms, with or without
67c83a1ed81a15f3e75836c1ac7d500a952f02e10Christopher Ferris * modification, are permitted provided that the following conditions
77c83a1ed81a15f3e75836c1ac7d500a952f02e10Christopher Ferris * are met:
87c83a1ed81a15f3e75836c1ac7d500a952f02e10Christopher Ferris *  * Redistributions of source code must retain the above copyright
97c83a1ed81a15f3e75836c1ac7d500a952f02e10Christopher Ferris *    notice, this list of conditions and the following disclaimer.
107c83a1ed81a15f3e75836c1ac7d500a952f02e10Christopher Ferris *  * Redistributions in binary form must reproduce the above copyright
117c83a1ed81a15f3e75836c1ac7d500a952f02e10Christopher Ferris *    notice, this list of conditions and the following disclaimer in
127c83a1ed81a15f3e75836c1ac7d500a952f02e10Christopher Ferris *    the documentation and/or other materials provided with the
137c83a1ed81a15f3e75836c1ac7d500a952f02e10Christopher Ferris *    distribution.
147c83a1ed81a15f3e75836c1ac7d500a952f02e10Christopher Ferris *
157c83a1ed81a15f3e75836c1ac7d500a952f02e10Christopher Ferris * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
167c83a1ed81a15f3e75836c1ac7d500a952f02e10Christopher Ferris * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
177c83a1ed81a15f3e75836c1ac7d500a952f02e10Christopher Ferris * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
187c83a1ed81a15f3e75836c1ac7d500a952f02e10Christopher Ferris * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
197c83a1ed81a15f3e75836c1ac7d500a952f02e10Christopher Ferris * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
207c83a1ed81a15f3e75836c1ac7d500a952f02e10Christopher Ferris * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
217c83a1ed81a15f3e75836c1ac7d500a952f02e10Christopher Ferris * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
227c83a1ed81a15f3e75836c1ac7d500a952f02e10Christopher Ferris * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
237c83a1ed81a15f3e75836c1ac7d500a952f02e10Christopher Ferris * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
247c83a1ed81a15f3e75836c1ac7d500a952f02e10Christopher Ferris * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
257c83a1ed81a15f3e75836c1ac7d500a952f02e10Christopher Ferris * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
267c83a1ed81a15f3e75836c1ac7d500a952f02e10Christopher Ferris * SUCH DAMAGE.
277c83a1ed81a15f3e75836c1ac7d500a952f02e10Christopher Ferris */
287c83a1ed81a15f3e75836c1ac7d500a952f02e10Christopher Ferris
297c83a1ed81a15f3e75836c1ac7d500a952f02e10Christopher Ferris/* Assumes neon instructions and a cache line size of 32 bytes. */
307c83a1ed81a15f3e75836c1ac7d500a952f02e10Christopher Ferris
31851e68a2402fa414544e66650e09dfdaac813e51Elliott Hughes#include <private/bionic_asm.h>
32851e68a2402fa414544e66650e09dfdaac813e51Elliott Hughes#include <private/libc_events.h>
337c83a1ed81a15f3e75836c1ac7d500a952f02e10Christopher Ferris
347c83a1ed81a15f3e75836c1ac7d500a952f02e10Christopher Ferris/*
357c83a1ed81a15f3e75836c1ac7d500a952f02e10Christopher Ferris * This code assumes it is running on a processor that supports all arm v7
367c83a1ed81a15f3e75836c1ac7d500a952f02e10Christopher Ferris * instructions, that supports neon instructions, and that has a 32 byte
377c83a1ed81a15f3e75836c1ac7d500a952f02e10Christopher Ferris * cache line.
387c83a1ed81a15f3e75836c1ac7d500a952f02e10Christopher Ferris */
397c83a1ed81a15f3e75836c1ac7d500a952f02e10Christopher Ferris
407c83a1ed81a15f3e75836c1ac7d500a952f02e10Christopher Ferris        .text
415f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris        .syntax unified
427c83a1ed81a15f3e75836c1ac7d500a952f02e10Christopher Ferris        .fpu    neon
435f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris        .thumb
445f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris        .thumb_func
457c83a1ed81a15f3e75836c1ac7d500a952f02e10Christopher Ferris
4659a13c122ebc4191583b67c846a95d690dcda5cfChristopher FerrisENTRY(__memcpy_chk)
4759a13c122ebc4191583b67c846a95d690dcda5cfChristopher Ferris        cmp         r2, r3
4816e185c9081530859c17270fbaf5798f0ea871f8Christopher Ferris        bhi         __memcpy_chk_fail
4959a13c122ebc4191583b67c846a95d690dcda5cfChristopher Ferris
5059a13c122ebc4191583b67c846a95d690dcda5cfChristopher Ferris        // Fall through to memcpy...
5159a13c122ebc4191583b67c846a95d690dcda5cfChristopher FerrisEND(__memcpy_chk)
527c83a1ed81a15f3e75836c1ac7d500a952f02e10Christopher Ferris
537c83a1ed81a15f3e75836c1ac7d500a952f02e10Christopher FerrisENTRY(memcpy)
545f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris        pld     [r1, #64]
555f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris        stmfd   sp!, {r0, lr}
565f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris        .cfi_def_cfa_offset 8
575f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris        .cfi_rel_offset r0, 0
585f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris        .cfi_rel_offset lr, 4
595f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher FerrisEND(memcpy)
607c83a1ed81a15f3e75836c1ac7d500a952f02e10Christopher Ferris
61a57c9c084bc686a35f4f494ce23cf2a9bb3d5d00Christopher Ferris#define MEMCPY_BASE         __memcpy_base
62a57c9c084bc686a35f4f494ce23cf2a9bb3d5d00Christopher Ferris#define MEMCPY_BASE_ALIGNED __memcpy_base_aligned
63a57c9c084bc686a35f4f494ce23cf2a9bb3d5d00Christopher Ferris#include "memcpy_base.S"
64a57c9c084bc686a35f4f494ce23cf2a9bb3d5d00Christopher Ferris
6532bbf8a63bb43a540cc0f1dd5037736d10b70e0bNick KralevichENTRY_PRIVATE(__memcpy_chk_fail)
665f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris        // Preserve lr for backtrace.
675f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris        push    {lr}
685f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris        .cfi_def_cfa_offset 4
695f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris        .cfi_rel_offset lr, 0
7059a13c122ebc4191583b67c846a95d690dcda5cfChristopher Ferris
7159a13c122ebc4191583b67c846a95d690dcda5cfChristopher Ferris        ldr     r0, error_message
7259a13c122ebc4191583b67c846a95d690dcda5cfChristopher Ferris        ldr     r1, error_code
7359a13c122ebc4191583b67c846a95d690dcda5cfChristopher Ferris1:
7459a13c122ebc4191583b67c846a95d690dcda5cfChristopher Ferris        add     r0, pc
7559a13c122ebc4191583b67c846a95d690dcda5cfChristopher Ferris        bl      __fortify_chk_fail
7659a13c122ebc4191583b67c846a95d690dcda5cfChristopher Ferriserror_code:
7759a13c122ebc4191583b67c846a95d690dcda5cfChristopher Ferris        .word   BIONIC_EVENT_MEMCPY_BUFFER_OVERFLOW
7859a13c122ebc4191583b67c846a95d690dcda5cfChristopher Ferriserror_message:
795f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris        .word   error_string-(1b+4)
80a57c9c084bc686a35f4f494ce23cf2a9bb3d5d00Christopher FerrisEND(__memcpy_chk_fail)
8159a13c122ebc4191583b67c846a95d690dcda5cfChristopher Ferris
8259a13c122ebc4191583b67c846a95d690dcda5cfChristopher Ferris        .data
8359a13c122ebc4191583b67c846a95d690dcda5cfChristopher Ferriserror_string:
8468b67113a44311b3568027af5893e316f63ec556Elliott Hughes        .string     "memcpy: prevented write past end of buffer"
85