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