Home | History | Annotate | Download | only in bionic
      1 /*
      2  * Copyright (C) 2013 The Android Open Source Project
      3  * All rights reserved.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions
      7  * are met:
      8  *  * Redistributions of source code must retain the above copyright
      9  *    notice, this list of conditions and the following disclaimer.
     10  *  * Redistributions in binary form must reproduce the above copyright
     11  *    notice, this list of conditions and the following disclaimer in
     12  *    the documentation and/or other materials provided with the
     13  *    distribution.
     14  *
     15  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     16  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     17  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
     18  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
     19  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
     20  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
     21  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
     22  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
     23  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
     24  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
     25  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     26  * SUCH DAMAGE.
     27  */
     28 
     29 /* Assumes neon instructions and a cache line size of 32 bytes. */
     30 
     31 #include <machine/asm.h>
     32 #include "libc_events.h"
     33 
     34 /*
     35  * This code assumes it is running on a processor that supports all arm v7
     36  * instructions, that supports neon instructions, and that has a 32 byte
     37  * cache line.
     38  */
     39 
     40         .text
     41         .syntax unified
     42         .fpu    neon
     43         .thumb
     44         .thumb_func
     45 
     46 ENTRY(__memcpy_chk)
     47         .cfi_startproc
     48         cmp         r2, r3
     49         bhi         __memcpy_chk_fail
     50 
     51         // Fall through to memcpy...
     52         .cfi_endproc
     53 END(__memcpy_chk)
     54 
     55 ENTRY(memcpy)
     56         .cfi_startproc
     57         pld     [r1, #64]
     58         stmfd   sp!, {r0, lr}
     59         .save   {r0, lr}
     60         .cfi_def_cfa_offset 8
     61         .cfi_rel_offset r0, 0
     62         .cfi_rel_offset lr, 4
     63         .cfi_endproc
     64 END(memcpy)
     65 
     66 #define MEMCPY_BASE         __memcpy_base
     67 #define MEMCPY_BASE_ALIGNED __memcpy_base_aligned
     68 #include "memcpy_base.S"
     69 
     70 ENTRY(__memcpy_chk_fail)
     71         .cfi_startproc
     72         // Preserve lr for backtrace.
     73         push    {lr}
     74         .save   {lr}
     75         .cfi_def_cfa_offset 4
     76         .cfi_rel_offset lr, 0
     77 
     78         ldr     r0, error_message
     79         ldr     r1, error_code
     80 1:
     81         add     r0, pc
     82         bl      __fortify_chk_fail
     83 error_code:
     84         .word   BIONIC_EVENT_MEMCPY_BUFFER_OVERFLOW
     85 error_message:
     86         .word   error_string-(1b+4)
     87         .cfi_endproc
     88 END(__memcpy_chk_fail)
     89 
     90         .data
     91 error_string:
     92         .string     "memcpy buffer overflow"
     93