Add optimized cortex-a7/cortex-a53 memset/memcpy.
Add an optimized memset that is ~20% faster for cortex-a7 and cortex-a53. Add a 32 bit optimized cortex-a53 memcpy that is about ~20% faster on cached data. Fix the cortex-a15 __str{cat,cpy}_chk.S, memcpy_base.S to remove the phony functions, since they aren't needed any more. Then add a direct include of these for cortex-a53. Verified the new functions by stepping through all of the major paths and verifying the backtrace is still correct. Bug: 22696180 Change-Id: Iec92a3f82d51243cca76c9aff9f35d920ff865ae
This commit is contained in:
parent
b3db7764d0
commit
5930772286
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2013 The Android Open Source Project
|
* Copyright (C) 2015 The Android Open Source Project
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
@ -26,191 +26,7 @@
|
|||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <private/bionic_asm.h>
|
// Indicate which memcpy base file to include.
|
||||||
#include <private/libc_events.h>
|
#define MEMCPY_BASE "memcpy_base.S"
|
||||||
|
|
||||||
.syntax unified
|
#include "__strcat_chk_common.S"
|
||||||
|
|
||||||
.thumb
|
|
||||||
.thumb_func
|
|
||||||
|
|
||||||
// Get the length of src string, then get the source of the dst string.
|
|
||||||
// Check that the two lengths together don't exceed the threshold, then
|
|
||||||
// do a memcpy of the data.
|
|
||||||
ENTRY(__strcat_chk)
|
|
||||||
pld [r0, #0]
|
|
||||||
push {r0, lr}
|
|
||||||
.cfi_def_cfa_offset 8
|
|
||||||
.cfi_rel_offset r0, 0
|
|
||||||
.cfi_rel_offset lr, 4
|
|
||||||
push {r4, r5}
|
|
||||||
.cfi_adjust_cfa_offset 8
|
|
||||||
.cfi_rel_offset r4, 0
|
|
||||||
.cfi_rel_offset r5, 4
|
|
||||||
|
|
||||||
mov lr, r2
|
|
||||||
|
|
||||||
// Save the dst register to r5
|
|
||||||
mov r5, r0
|
|
||||||
|
|
||||||
// Zero out r4
|
|
||||||
eor r4, r4, r4
|
|
||||||
|
|
||||||
// r1 contains the address of the string to count.
|
|
||||||
.L_strlen_start:
|
|
||||||
mov r0, r1
|
|
||||||
ands r3, r1, #7
|
|
||||||
beq .L_mainloop
|
|
||||||
|
|
||||||
// Align to a double word (64 bits).
|
|
||||||
rsb r3, r3, #8
|
|
||||||
lsls ip, r3, #31
|
|
||||||
beq .L_align_to_32
|
|
||||||
|
|
||||||
ldrb r2, [r1], #1
|
|
||||||
cbz r2, .L_update_count_and_finish
|
|
||||||
|
|
||||||
.L_align_to_32:
|
|
||||||
bcc .L_align_to_64
|
|
||||||
ands ip, r3, #2
|
|
||||||
beq .L_align_to_64
|
|
||||||
|
|
||||||
ldrb r2, [r1], #1
|
|
||||||
cbz r2, .L_update_count_and_finish
|
|
||||||
ldrb r2, [r1], #1
|
|
||||||
cbz r2, .L_update_count_and_finish
|
|
||||||
|
|
||||||
.L_align_to_64:
|
|
||||||
tst r3, #4
|
|
||||||
beq .L_mainloop
|
|
||||||
ldr r3, [r1], #4
|
|
||||||
|
|
||||||
sub ip, r3, #0x01010101
|
|
||||||
bic ip, ip, r3
|
|
||||||
ands ip, ip, #0x80808080
|
|
||||||
bne .L_zero_in_second_register
|
|
||||||
|
|
||||||
.p2align 2
|
|
||||||
.L_mainloop:
|
|
||||||
ldrd r2, r3, [r1], #8
|
|
||||||
|
|
||||||
pld [r1, #64]
|
|
||||||
|
|
||||||
sub ip, r2, #0x01010101
|
|
||||||
bic ip, ip, r2
|
|
||||||
ands ip, ip, #0x80808080
|
|
||||||
bne .L_zero_in_first_register
|
|
||||||
|
|
||||||
sub ip, r3, #0x01010101
|
|
||||||
bic ip, ip, r3
|
|
||||||
ands ip, ip, #0x80808080
|
|
||||||
bne .L_zero_in_second_register
|
|
||||||
b .L_mainloop
|
|
||||||
|
|
||||||
.L_update_count_and_finish:
|
|
||||||
sub r3, r1, r0
|
|
||||||
sub r3, r3, #1
|
|
||||||
b .L_finish
|
|
||||||
|
|
||||||
.L_zero_in_first_register:
|
|
||||||
sub r3, r1, r0
|
|
||||||
lsls r2, ip, #17
|
|
||||||
bne .L_sub8_and_finish
|
|
||||||
bcs .L_sub7_and_finish
|
|
||||||
lsls ip, ip, #1
|
|
||||||
bne .L_sub6_and_finish
|
|
||||||
|
|
||||||
sub r3, r3, #5
|
|
||||||
b .L_finish
|
|
||||||
|
|
||||||
.L_sub8_and_finish:
|
|
||||||
sub r3, r3, #8
|
|
||||||
b .L_finish
|
|
||||||
|
|
||||||
.L_sub7_and_finish:
|
|
||||||
sub r3, r3, #7
|
|
||||||
b .L_finish
|
|
||||||
|
|
||||||
.L_sub6_and_finish:
|
|
||||||
sub r3, r3, #6
|
|
||||||
b .L_finish
|
|
||||||
|
|
||||||
.L_zero_in_second_register:
|
|
||||||
sub r3, r1, r0
|
|
||||||
lsls r2, ip, #17
|
|
||||||
bne .L_sub4_and_finish
|
|
||||||
bcs .L_sub3_and_finish
|
|
||||||
lsls ip, ip, #1
|
|
||||||
bne .L_sub2_and_finish
|
|
||||||
|
|
||||||
sub r3, r3, #1
|
|
||||||
b .L_finish
|
|
||||||
|
|
||||||
.L_sub4_and_finish:
|
|
||||||
sub r3, r3, #4
|
|
||||||
b .L_finish
|
|
||||||
|
|
||||||
.L_sub3_and_finish:
|
|
||||||
sub r3, r3, #3
|
|
||||||
b .L_finish
|
|
||||||
|
|
||||||
.L_sub2_and_finish:
|
|
||||||
sub r3, r3, #2
|
|
||||||
|
|
||||||
.L_finish:
|
|
||||||
cmp r4, #0
|
|
||||||
bne .L_strlen_done
|
|
||||||
|
|
||||||
// Time to get the dst string length.
|
|
||||||
mov r1, r5
|
|
||||||
|
|
||||||
// Save the original source address to r5.
|
|
||||||
mov r5, r0
|
|
||||||
|
|
||||||
// Save the current length (adding 1 for the terminator).
|
|
||||||
add r4, r3, #1
|
|
||||||
b .L_strlen_start
|
|
||||||
|
|
||||||
// r0 holds the pointer to the dst string.
|
|
||||||
// r3 holds the dst string length.
|
|
||||||
// r4 holds the src string length + 1.
|
|
||||||
.L_strlen_done:
|
|
||||||
add r2, r3, r4
|
|
||||||
cmp r2, lr
|
|
||||||
bhi __strcat_chk_failed
|
|
||||||
|
|
||||||
// Set up the registers for the memcpy code.
|
|
||||||
mov r1, r5
|
|
||||||
pld [r1, #64]
|
|
||||||
mov r2, r4
|
|
||||||
add r0, r0, r3
|
|
||||||
pop {r4, r5}
|
|
||||||
END(__strcat_chk)
|
|
||||||
|
|
||||||
#define MEMCPY_BASE __strcat_chk_memcpy_base
|
|
||||||
#define MEMCPY_BASE_ALIGNED __strcat_chk_memcpy_base_aligned
|
|
||||||
|
|
||||||
#include "memcpy_base.S"
|
|
||||||
|
|
||||||
ENTRY_PRIVATE(__strcat_chk_failed)
|
|
||||||
.cfi_def_cfa_offset 8
|
|
||||||
.cfi_rel_offset r0, 0
|
|
||||||
.cfi_rel_offset lr, 4
|
|
||||||
.cfi_adjust_cfa_offset 8
|
|
||||||
.cfi_rel_offset r4, 0
|
|
||||||
.cfi_rel_offset r5, 4
|
|
||||||
|
|
||||||
ldr r0, error_message
|
|
||||||
ldr r1, error_code
|
|
||||||
1:
|
|
||||||
add r0, pc
|
|
||||||
bl __fortify_chk_fail
|
|
||||||
error_code:
|
|
||||||
.word BIONIC_EVENT_STRCAT_BUFFER_OVERFLOW
|
|
||||||
error_message:
|
|
||||||
.word error_string-(1b+4)
|
|
||||||
END(__strcat_chk_failed)
|
|
||||||
|
|
||||||
.data
|
|
||||||
error_string:
|
|
||||||
.string "strcat: prevented write past end of buffer"
|
|
||||||
|
212
libc/arch-arm/cortex-a15/bionic/__strcat_chk_common.S
Normal file
212
libc/arch-arm/cortex-a15/bionic/__strcat_chk_common.S
Normal file
@ -0,0 +1,212 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2013 The Android Open Source Project
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in
|
||||||
|
* the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||||
|
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||||
|
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||||
|
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||||
|
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||||
|
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <private/bionic_asm.h>
|
||||||
|
#include <private/libc_events.h>
|
||||||
|
|
||||||
|
.syntax unified
|
||||||
|
|
||||||
|
.thumb
|
||||||
|
.thumb_func
|
||||||
|
|
||||||
|
// Get the length of src string, then get the source of the dst string.
|
||||||
|
// Check that the two lengths together don't exceed the threshold, then
|
||||||
|
// do a memcpy of the data.
|
||||||
|
ENTRY(__strcat_chk)
|
||||||
|
pld [r0, #0]
|
||||||
|
push {r0, lr}
|
||||||
|
.cfi_def_cfa_offset 8
|
||||||
|
.cfi_rel_offset r0, 0
|
||||||
|
.cfi_rel_offset lr, 4
|
||||||
|
push {r4, r5}
|
||||||
|
.cfi_adjust_cfa_offset 8
|
||||||
|
.cfi_rel_offset r4, 0
|
||||||
|
.cfi_rel_offset r5, 4
|
||||||
|
|
||||||
|
mov lr, r2
|
||||||
|
|
||||||
|
// Save the dst register to r5
|
||||||
|
mov r5, r0
|
||||||
|
|
||||||
|
// Zero out r4
|
||||||
|
eor r4, r4, r4
|
||||||
|
|
||||||
|
// r1 contains the address of the string to count.
|
||||||
|
.L_strlen_start:
|
||||||
|
mov r0, r1
|
||||||
|
ands r3, r1, #7
|
||||||
|
beq .L_mainloop
|
||||||
|
|
||||||
|
// Align to a double word (64 bits).
|
||||||
|
rsb r3, r3, #8
|
||||||
|
lsls ip, r3, #31
|
||||||
|
beq .L_align_to_32
|
||||||
|
|
||||||
|
ldrb r2, [r1], #1
|
||||||
|
cbz r2, .L_update_count_and_finish
|
||||||
|
|
||||||
|
.L_align_to_32:
|
||||||
|
bcc .L_align_to_64
|
||||||
|
ands ip, r3, #2
|
||||||
|
beq .L_align_to_64
|
||||||
|
|
||||||
|
ldrb r2, [r1], #1
|
||||||
|
cbz r2, .L_update_count_and_finish
|
||||||
|
ldrb r2, [r1], #1
|
||||||
|
cbz r2, .L_update_count_and_finish
|
||||||
|
|
||||||
|
.L_align_to_64:
|
||||||
|
tst r3, #4
|
||||||
|
beq .L_mainloop
|
||||||
|
ldr r3, [r1], #4
|
||||||
|
|
||||||
|
sub ip, r3, #0x01010101
|
||||||
|
bic ip, ip, r3
|
||||||
|
ands ip, ip, #0x80808080
|
||||||
|
bne .L_zero_in_second_register
|
||||||
|
|
||||||
|
.p2align 2
|
||||||
|
.L_mainloop:
|
||||||
|
ldrd r2, r3, [r1], #8
|
||||||
|
|
||||||
|
pld [r1, #64]
|
||||||
|
|
||||||
|
sub ip, r2, #0x01010101
|
||||||
|
bic ip, ip, r2
|
||||||
|
ands ip, ip, #0x80808080
|
||||||
|
bne .L_zero_in_first_register
|
||||||
|
|
||||||
|
sub ip, r3, #0x01010101
|
||||||
|
bic ip, ip, r3
|
||||||
|
ands ip, ip, #0x80808080
|
||||||
|
bne .L_zero_in_second_register
|
||||||
|
b .L_mainloop
|
||||||
|
|
||||||
|
.L_update_count_and_finish:
|
||||||
|
sub r3, r1, r0
|
||||||
|
sub r3, r3, #1
|
||||||
|
b .L_finish
|
||||||
|
|
||||||
|
.L_zero_in_first_register:
|
||||||
|
sub r3, r1, r0
|
||||||
|
lsls r2, ip, #17
|
||||||
|
bne .L_sub8_and_finish
|
||||||
|
bcs .L_sub7_and_finish
|
||||||
|
lsls ip, ip, #1
|
||||||
|
bne .L_sub6_and_finish
|
||||||
|
|
||||||
|
sub r3, r3, #5
|
||||||
|
b .L_finish
|
||||||
|
|
||||||
|
.L_sub8_and_finish:
|
||||||
|
sub r3, r3, #8
|
||||||
|
b .L_finish
|
||||||
|
|
||||||
|
.L_sub7_and_finish:
|
||||||
|
sub r3, r3, #7
|
||||||
|
b .L_finish
|
||||||
|
|
||||||
|
.L_sub6_and_finish:
|
||||||
|
sub r3, r3, #6
|
||||||
|
b .L_finish
|
||||||
|
|
||||||
|
.L_zero_in_second_register:
|
||||||
|
sub r3, r1, r0
|
||||||
|
lsls r2, ip, #17
|
||||||
|
bne .L_sub4_and_finish
|
||||||
|
bcs .L_sub3_and_finish
|
||||||
|
lsls ip, ip, #1
|
||||||
|
bne .L_sub2_and_finish
|
||||||
|
|
||||||
|
sub r3, r3, #1
|
||||||
|
b .L_finish
|
||||||
|
|
||||||
|
.L_sub4_and_finish:
|
||||||
|
sub r3, r3, #4
|
||||||
|
b .L_finish
|
||||||
|
|
||||||
|
.L_sub3_and_finish:
|
||||||
|
sub r3, r3, #3
|
||||||
|
b .L_finish
|
||||||
|
|
||||||
|
.L_sub2_and_finish:
|
||||||
|
sub r3, r3, #2
|
||||||
|
|
||||||
|
.L_finish:
|
||||||
|
cmp r4, #0
|
||||||
|
bne .L_strlen_done
|
||||||
|
|
||||||
|
// Time to get the dst string length.
|
||||||
|
mov r1, r5
|
||||||
|
|
||||||
|
// Save the original source address to r5.
|
||||||
|
mov r5, r0
|
||||||
|
|
||||||
|
// Save the current length (adding 1 for the terminator).
|
||||||
|
add r4, r3, #1
|
||||||
|
b .L_strlen_start
|
||||||
|
|
||||||
|
// r0 holds the pointer to the dst string.
|
||||||
|
// r3 holds the dst string length.
|
||||||
|
// r4 holds the src string length + 1.
|
||||||
|
.L_strlen_done:
|
||||||
|
add r2, r3, r4
|
||||||
|
cmp r2, lr
|
||||||
|
bhi .L_strcat_chk_failed
|
||||||
|
|
||||||
|
// Set up the registers for the memcpy code.
|
||||||
|
mov r1, r5
|
||||||
|
pld [r1, #64]
|
||||||
|
mov r2, r4
|
||||||
|
add r0, r0, r3
|
||||||
|
pop {r4, r5}
|
||||||
|
.cfi_adjust_cfa_offset -8
|
||||||
|
.cfi_restore r4
|
||||||
|
.cfi_restore r5
|
||||||
|
|
||||||
|
#include MEMCPY_BASE
|
||||||
|
|
||||||
|
// Undo the above cfi directives
|
||||||
|
.cfi_adjust_cfa_offset 8
|
||||||
|
.cfi_rel_offset r4, 0
|
||||||
|
.cfi_rel_offset r5, 4
|
||||||
|
.L_strcat_chk_failed:
|
||||||
|
ldr r0, error_message
|
||||||
|
ldr r1, error_code
|
||||||
|
1:
|
||||||
|
add r0, pc
|
||||||
|
bl __fortify_chk_fail
|
||||||
|
error_code:
|
||||||
|
.word BIONIC_EVENT_STRCAT_BUFFER_OVERFLOW
|
||||||
|
error_message:
|
||||||
|
.word error_string-(1b+4)
|
||||||
|
END(__strcat_chk)
|
||||||
|
|
||||||
|
.data
|
||||||
|
error_string:
|
||||||
|
.string "strcat: prevented write past end of buffer"
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2013 The Android Open Source Project
|
* Copyright (C) 2015 The Android Open Source Project
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
@ -26,155 +26,7 @@
|
|||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <private/bionic_asm.h>
|
// Indicate which memcpy base file to include.
|
||||||
#include <private/libc_events.h>
|
#define MEMCPY_BASE "memcpy_base.S"
|
||||||
|
|
||||||
.syntax unified
|
#include "__strcpy_chk_common.S"
|
||||||
|
|
||||||
.thumb
|
|
||||||
.thumb_func
|
|
||||||
|
|
||||||
// Get the length of the source string first, then do a memcpy of the data
|
|
||||||
// instead of a strcpy.
|
|
||||||
ENTRY(__strcpy_chk)
|
|
||||||
pld [r0, #0]
|
|
||||||
push {r0, lr}
|
|
||||||
.cfi_def_cfa_offset 8
|
|
||||||
.cfi_rel_offset r0, 0
|
|
||||||
.cfi_rel_offset lr, 4
|
|
||||||
|
|
||||||
mov lr, r2
|
|
||||||
mov r0, r1
|
|
||||||
|
|
||||||
ands r3, r1, #7
|
|
||||||
beq .L_mainloop
|
|
||||||
|
|
||||||
// Align to a double word (64 bits).
|
|
||||||
rsb r3, r3, #8
|
|
||||||
lsls ip, r3, #31
|
|
||||||
beq .L_align_to_32
|
|
||||||
|
|
||||||
ldrb r2, [r0], #1
|
|
||||||
cbz r2, .L_update_count_and_finish
|
|
||||||
|
|
||||||
.L_align_to_32:
|
|
||||||
bcc .L_align_to_64
|
|
||||||
ands ip, r3, #2
|
|
||||||
beq .L_align_to_64
|
|
||||||
|
|
||||||
ldrb r2, [r0], #1
|
|
||||||
cbz r2, .L_update_count_and_finish
|
|
||||||
ldrb r2, [r0], #1
|
|
||||||
cbz r2, .L_update_count_and_finish
|
|
||||||
|
|
||||||
.L_align_to_64:
|
|
||||||
tst r3, #4
|
|
||||||
beq .L_mainloop
|
|
||||||
ldr r3, [r0], #4
|
|
||||||
|
|
||||||
sub ip, r3, #0x01010101
|
|
||||||
bic ip, ip, r3
|
|
||||||
ands ip, ip, #0x80808080
|
|
||||||
bne .L_zero_in_second_register
|
|
||||||
|
|
||||||
.p2align 2
|
|
||||||
.L_mainloop:
|
|
||||||
ldrd r2, r3, [r0], #8
|
|
||||||
|
|
||||||
pld [r0, #64]
|
|
||||||
|
|
||||||
sub ip, r2, #0x01010101
|
|
||||||
bic ip, ip, r2
|
|
||||||
ands ip, ip, #0x80808080
|
|
||||||
bne .L_zero_in_first_register
|
|
||||||
|
|
||||||
sub ip, r3, #0x01010101
|
|
||||||
bic ip, ip, r3
|
|
||||||
ands ip, ip, #0x80808080
|
|
||||||
bne .L_zero_in_second_register
|
|
||||||
b .L_mainloop
|
|
||||||
|
|
||||||
.L_update_count_and_finish:
|
|
||||||
sub r3, r0, r1
|
|
||||||
sub r3, r3, #1
|
|
||||||
b .L_check_size
|
|
||||||
|
|
||||||
.L_zero_in_first_register:
|
|
||||||
sub r3, r0, r1
|
|
||||||
lsls r2, ip, #17
|
|
||||||
bne .L_sub8_and_finish
|
|
||||||
bcs .L_sub7_and_finish
|
|
||||||
lsls ip, ip, #1
|
|
||||||
bne .L_sub6_and_finish
|
|
||||||
|
|
||||||
sub r3, r3, #5
|
|
||||||
b .L_check_size
|
|
||||||
|
|
||||||
.L_sub8_and_finish:
|
|
||||||
sub r3, r3, #8
|
|
||||||
b .L_check_size
|
|
||||||
|
|
||||||
.L_sub7_and_finish:
|
|
||||||
sub r3, r3, #7
|
|
||||||
b .L_check_size
|
|
||||||
|
|
||||||
.L_sub6_and_finish:
|
|
||||||
sub r3, r3, #6
|
|
||||||
b .L_check_size
|
|
||||||
|
|
||||||
.L_zero_in_second_register:
|
|
||||||
sub r3, r0, r1
|
|
||||||
lsls r2, ip, #17
|
|
||||||
bne .L_sub4_and_finish
|
|
||||||
bcs .L_sub3_and_finish
|
|
||||||
lsls ip, ip, #1
|
|
||||||
bne .L_sub2_and_finish
|
|
||||||
|
|
||||||
sub r3, r3, #1
|
|
||||||
b .L_check_size
|
|
||||||
|
|
||||||
.L_sub4_and_finish:
|
|
||||||
sub r3, r3, #4
|
|
||||||
b .L_check_size
|
|
||||||
|
|
||||||
.L_sub3_and_finish:
|
|
||||||
sub r3, r3, #3
|
|
||||||
b .L_check_size
|
|
||||||
|
|
||||||
.L_sub2_and_finish:
|
|
||||||
sub r3, r3, #2
|
|
||||||
|
|
||||||
.L_check_size:
|
|
||||||
pld [r1, #0]
|
|
||||||
pld [r1, #64]
|
|
||||||
ldr r0, [sp]
|
|
||||||
cmp r3, lr
|
|
||||||
bhs __strcpy_chk_failed
|
|
||||||
|
|
||||||
// Add 1 for copy length to get the string terminator.
|
|
||||||
add r2, r3, #1
|
|
||||||
END(__strcpy_chk)
|
|
||||||
|
|
||||||
#define MEMCPY_BASE __strcpy_chk_memcpy_base
|
|
||||||
#define MEMCPY_BASE_ALIGNED __strcpy_chk_memcpy_base_aligned
|
|
||||||
#include "memcpy_base.S"
|
|
||||||
|
|
||||||
ENTRY_PRIVATE(__strcpy_chk_failed)
|
|
||||||
.cfi_def_cfa_offset 8
|
|
||||||
.cfi_rel_offset r0, 0
|
|
||||||
.cfi_rel_offset lr, 4
|
|
||||||
|
|
||||||
ldr r0, error_message
|
|
||||||
ldr r1, error_code
|
|
||||||
1:
|
|
||||||
add r0, pc
|
|
||||||
bl __fortify_chk_fail
|
|
||||||
error_code:
|
|
||||||
.word BIONIC_EVENT_STRCPY_BUFFER_OVERFLOW
|
|
||||||
error_message:
|
|
||||||
.word error_string-(1b+4)
|
|
||||||
END(__strcpy_chk_failed)
|
|
||||||
|
|
||||||
.data
|
|
||||||
error_string:
|
|
||||||
.string "strcpy: prevented write past end of buffer"
|
|
||||||
|
173
libc/arch-arm/cortex-a15/bionic/__strcpy_chk_common.S
Normal file
173
libc/arch-arm/cortex-a15/bionic/__strcpy_chk_common.S
Normal file
@ -0,0 +1,173 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2013 The Android Open Source Project
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in
|
||||||
|
* the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||||
|
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||||
|
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||||
|
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||||
|
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||||
|
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <private/bionic_asm.h>
|
||||||
|
#include <private/libc_events.h>
|
||||||
|
|
||||||
|
.syntax unified
|
||||||
|
|
||||||
|
.thumb
|
||||||
|
.thumb_func
|
||||||
|
|
||||||
|
// Get the length of the source string first, then do a memcpy of the data
|
||||||
|
// instead of a strcpy.
|
||||||
|
ENTRY(__strcpy_chk)
|
||||||
|
pld [r0, #0]
|
||||||
|
push {r0, lr}
|
||||||
|
.cfi_def_cfa_offset 8
|
||||||
|
.cfi_rel_offset r0, 0
|
||||||
|
.cfi_rel_offset lr, 4
|
||||||
|
|
||||||
|
mov lr, r2
|
||||||
|
mov r0, r1
|
||||||
|
|
||||||
|
ands r3, r1, #7
|
||||||
|
beq .L_mainloop
|
||||||
|
|
||||||
|
// Align to a double word (64 bits).
|
||||||
|
rsb r3, r3, #8
|
||||||
|
lsls ip, r3, #31
|
||||||
|
beq .L_align_to_32
|
||||||
|
|
||||||
|
ldrb r2, [r0], #1
|
||||||
|
cbz r2, .L_update_count_and_finish
|
||||||
|
|
||||||
|
.L_align_to_32:
|
||||||
|
bcc .L_align_to_64
|
||||||
|
ands ip, r3, #2
|
||||||
|
beq .L_align_to_64
|
||||||
|
|
||||||
|
ldrb r2, [r0], #1
|
||||||
|
cbz r2, .L_update_count_and_finish
|
||||||
|
ldrb r2, [r0], #1
|
||||||
|
cbz r2, .L_update_count_and_finish
|
||||||
|
|
||||||
|
.L_align_to_64:
|
||||||
|
tst r3, #4
|
||||||
|
beq .L_mainloop
|
||||||
|
ldr r3, [r0], #4
|
||||||
|
|
||||||
|
sub ip, r3, #0x01010101
|
||||||
|
bic ip, ip, r3
|
||||||
|
ands ip, ip, #0x80808080
|
||||||
|
bne .L_zero_in_second_register
|
||||||
|
|
||||||
|
.p2align 2
|
||||||
|
.L_mainloop:
|
||||||
|
ldrd r2, r3, [r0], #8
|
||||||
|
|
||||||
|
pld [r0, #64]
|
||||||
|
|
||||||
|
sub ip, r2, #0x01010101
|
||||||
|
bic ip, ip, r2
|
||||||
|
ands ip, ip, #0x80808080
|
||||||
|
bne .L_zero_in_first_register
|
||||||
|
|
||||||
|
sub ip, r3, #0x01010101
|
||||||
|
bic ip, ip, r3
|
||||||
|
ands ip, ip, #0x80808080
|
||||||
|
bne .L_zero_in_second_register
|
||||||
|
b .L_mainloop
|
||||||
|
|
||||||
|
.L_update_count_and_finish:
|
||||||
|
sub r3, r0, r1
|
||||||
|
sub r3, r3, #1
|
||||||
|
b .L_check_size
|
||||||
|
|
||||||
|
.L_zero_in_first_register:
|
||||||
|
sub r3, r0, r1
|
||||||
|
lsls r2, ip, #17
|
||||||
|
bne .L_sub8_and_finish
|
||||||
|
bcs .L_sub7_and_finish
|
||||||
|
lsls ip, ip, #1
|
||||||
|
bne .L_sub6_and_finish
|
||||||
|
|
||||||
|
sub r3, r3, #5
|
||||||
|
b .L_check_size
|
||||||
|
|
||||||
|
.L_sub8_and_finish:
|
||||||
|
sub r3, r3, #8
|
||||||
|
b .L_check_size
|
||||||
|
|
||||||
|
.L_sub7_and_finish:
|
||||||
|
sub r3, r3, #7
|
||||||
|
b .L_check_size
|
||||||
|
|
||||||
|
.L_sub6_and_finish:
|
||||||
|
sub r3, r3, #6
|
||||||
|
b .L_check_size
|
||||||
|
|
||||||
|
.L_zero_in_second_register:
|
||||||
|
sub r3, r0, r1
|
||||||
|
lsls r2, ip, #17
|
||||||
|
bne .L_sub4_and_finish
|
||||||
|
bcs .L_sub3_and_finish
|
||||||
|
lsls ip, ip, #1
|
||||||
|
bne .L_sub2_and_finish
|
||||||
|
|
||||||
|
sub r3, r3, #1
|
||||||
|
b .L_check_size
|
||||||
|
|
||||||
|
.L_sub4_and_finish:
|
||||||
|
sub r3, r3, #4
|
||||||
|
b .L_check_size
|
||||||
|
|
||||||
|
.L_sub3_and_finish:
|
||||||
|
sub r3, r3, #3
|
||||||
|
b .L_check_size
|
||||||
|
|
||||||
|
.L_sub2_and_finish:
|
||||||
|
sub r3, r3, #2
|
||||||
|
|
||||||
|
.L_check_size:
|
||||||
|
pld [r1, #0]
|
||||||
|
pld [r1, #64]
|
||||||
|
ldr r0, [sp]
|
||||||
|
cmp r3, lr
|
||||||
|
bhs .L_strcpy_chk_failed
|
||||||
|
|
||||||
|
// Add 1 for copy length to get the string terminator.
|
||||||
|
add r2, r3, #1
|
||||||
|
|
||||||
|
#include MEMCPY_BASE
|
||||||
|
|
||||||
|
.L_strcpy_chk_failed:
|
||||||
|
ldr r0, error_message
|
||||||
|
ldr r1, error_code
|
||||||
|
1:
|
||||||
|
add r0, pc
|
||||||
|
bl __fortify_chk_fail
|
||||||
|
error_code:
|
||||||
|
.word BIONIC_EVENT_STRCPY_BUFFER_OVERFLOW
|
||||||
|
error_message:
|
||||||
|
.word error_string-(1b+4)
|
||||||
|
END(__strcpy_chk)
|
||||||
|
|
||||||
|
.data
|
||||||
|
error_string:
|
||||||
|
.string "strcpy: prevented write past end of buffer"
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2008 The Android Open Source Project
|
* Copyright (C) 2015 The Android Open Source Project
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
@ -25,79 +25,8 @@
|
|||||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
/*
|
|
||||||
* Copyright (c) 2013 ARM Ltd
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
* 3. The name of the company may not be used to endorse or promote
|
|
||||||
* products derived from this software without specific prior written
|
|
||||||
* permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
|
||||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
||||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
||||||
* IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
|
||||||
* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
||||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
||||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Prototype: void *memcpy (void *dst, const void *src, size_t count).
|
// Indicate which memcpy base file to include.
|
||||||
|
#define MEMCPY_BASE "memcpy_base.S"
|
||||||
|
|
||||||
#include <private/bionic_asm.h>
|
#include "memcpy_common.S"
|
||||||
#include <private/libc_events.h>
|
|
||||||
|
|
||||||
.text
|
|
||||||
.syntax unified
|
|
||||||
.fpu neon
|
|
||||||
|
|
||||||
ENTRY(__memcpy_chk)
|
|
||||||
cmp r2, r3
|
|
||||||
bhi __memcpy_chk_fail
|
|
||||||
|
|
||||||
// Fall through to memcpy...
|
|
||||||
END(__memcpy_chk)
|
|
||||||
|
|
||||||
ENTRY(memcpy)
|
|
||||||
pld [r1, #64]
|
|
||||||
push {r0, lr}
|
|
||||||
.cfi_def_cfa_offset 8
|
|
||||||
.cfi_rel_offset r0, 0
|
|
||||||
.cfi_rel_offset lr, 4
|
|
||||||
END(memcpy)
|
|
||||||
|
|
||||||
#define MEMCPY_BASE __memcpy_base
|
|
||||||
#define MEMCPY_BASE_ALIGNED __memcpy_base_aligned
|
|
||||||
#include "memcpy_base.S"
|
|
||||||
|
|
||||||
ENTRY_PRIVATE(__memcpy_chk_fail)
|
|
||||||
// Preserve lr for backtrace.
|
|
||||||
push {lr}
|
|
||||||
.cfi_def_cfa_offset 4
|
|
||||||
.cfi_rel_offset lr, 0
|
|
||||||
|
|
||||||
ldr r0, error_message
|
|
||||||
ldr r1, error_code
|
|
||||||
1:
|
|
||||||
add r0, pc
|
|
||||||
bl __fortify_chk_fail
|
|
||||||
error_code:
|
|
||||||
.word BIONIC_EVENT_MEMCPY_BUFFER_OVERFLOW
|
|
||||||
error_message:
|
|
||||||
.word error_string-(1b+8)
|
|
||||||
END(__memcpy_chk_fail)
|
|
||||||
|
|
||||||
.data
|
|
||||||
error_string:
|
|
||||||
.string "memcpy: prevented write past end of buffer"
|
|
||||||
|
@ -53,11 +53,7 @@
|
|||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ENTRY_PRIVATE(MEMCPY_BASE)
|
.L_memcpy_base:
|
||||||
.cfi_def_cfa_offset 8
|
|
||||||
.cfi_rel_offset r0, 0
|
|
||||||
.cfi_rel_offset lr, 4
|
|
||||||
|
|
||||||
// Assumes that n >= 0, and dst, src are valid pointers.
|
// Assumes that n >= 0, and dst, src are valid pointers.
|
||||||
// For any sizes less than 832 use the neon code that doesn't
|
// For any sizes less than 832 use the neon code that doesn't
|
||||||
// care about the src alignment. This avoids any checks
|
// care about the src alignment. This avoids any checks
|
||||||
@ -168,12 +164,6 @@ ENTRY_PRIVATE(MEMCPY_BASE)
|
|||||||
eor r3, r0, r1
|
eor r3, r0, r1
|
||||||
ands r3, r3, #0x3
|
ands r3, r3, #0x3
|
||||||
bne .L_copy_unknown_alignment
|
bne .L_copy_unknown_alignment
|
||||||
END(MEMCPY_BASE)
|
|
||||||
|
|
||||||
ENTRY_PRIVATE(MEMCPY_BASE_ALIGNED)
|
|
||||||
.cfi_def_cfa_offset 8
|
|
||||||
.cfi_rel_offset r0, 0
|
|
||||||
.cfi_rel_offset lr, 4
|
|
||||||
|
|
||||||
// To try and improve performance, stack layout changed,
|
// To try and improve performance, stack layout changed,
|
||||||
// i.e., not keeping the stack looking like users expect
|
// i.e., not keeping the stack looking like users expect
|
||||||
@ -185,7 +175,7 @@ ENTRY_PRIVATE(MEMCPY_BASE_ALIGNED)
|
|||||||
strd r6, r7, [sp, #-8]!
|
strd r6, r7, [sp, #-8]!
|
||||||
.cfi_adjust_cfa_offset 8
|
.cfi_adjust_cfa_offset 8
|
||||||
.cfi_rel_offset r6, 0
|
.cfi_rel_offset r6, 0
|
||||||
.cfi_rel_offset r7, 0
|
.cfi_rel_offset r7, 4
|
||||||
strd r8, r9, [sp, #-8]!
|
strd r8, r9, [sp, #-8]!
|
||||||
.cfi_adjust_cfa_offset 8
|
.cfi_adjust_cfa_offset 8
|
||||||
.cfi_rel_offset r8, 0
|
.cfi_rel_offset r8, 0
|
||||||
@ -291,10 +281,28 @@ ENTRY_PRIVATE(MEMCPY_BASE_ALIGNED)
|
|||||||
|
|
||||||
// Restore registers: optimized pop {r0, pc}
|
// Restore registers: optimized pop {r0, pc}
|
||||||
ldrd r8, r9, [sp], #8
|
ldrd r8, r9, [sp], #8
|
||||||
|
.cfi_adjust_cfa_offset -8
|
||||||
|
.cfi_restore r8
|
||||||
|
.cfi_restore r9
|
||||||
ldrd r6, r7, [sp], #8
|
ldrd r6, r7, [sp], #8
|
||||||
|
.cfi_adjust_cfa_offset -8
|
||||||
|
.cfi_restore r6
|
||||||
|
.cfi_restore r7
|
||||||
ldrd r4, r5, [sp], #8
|
ldrd r4, r5, [sp], #8
|
||||||
|
.cfi_adjust_cfa_offset -8
|
||||||
|
.cfi_restore r4
|
||||||
|
.cfi_restore r5
|
||||||
pop {r0, pc}
|
pop {r0, pc}
|
||||||
|
|
||||||
|
// Put the cfi directives back for the below instructions.
|
||||||
|
.cfi_adjust_cfa_offset 24
|
||||||
|
.cfi_rel_offset r4, 0
|
||||||
|
.cfi_rel_offset r5, 4
|
||||||
|
.cfi_rel_offset r6, 8
|
||||||
|
.cfi_rel_offset r7, 12
|
||||||
|
.cfi_rel_offset r8, 16
|
||||||
|
.cfi_rel_offset r9, 20
|
||||||
|
|
||||||
.L_dst_not_word_aligned:
|
.L_dst_not_word_aligned:
|
||||||
// Align dst to word.
|
// Align dst to word.
|
||||||
rsb ip, ip, #4
|
rsb ip, ip, #4
|
||||||
@ -315,4 +323,12 @@ ENTRY_PRIVATE(MEMCPY_BASE_ALIGNED)
|
|||||||
|
|
||||||
// Src is guaranteed to be at least word aligned by this point.
|
// Src is guaranteed to be at least word aligned by this point.
|
||||||
b .L_word_aligned
|
b .L_word_aligned
|
||||||
END(MEMCPY_BASE_ALIGNED)
|
|
||||||
|
// Undo any cfi directives from above.
|
||||||
|
.cfi_adjust_cfa_offset -24
|
||||||
|
.cfi_restore r4
|
||||||
|
.cfi_restore r5
|
||||||
|
.cfi_restore r6
|
||||||
|
.cfi_restore r7
|
||||||
|
.cfi_restore r8
|
||||||
|
.cfi_restore r9
|
||||||
|
103
libc/arch-arm/cortex-a15/bionic/memcpy_common.S
Normal file
103
libc/arch-arm/cortex-a15/bionic/memcpy_common.S
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2008 The Android Open Source Project
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in
|
||||||
|
* the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||||
|
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||||
|
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||||
|
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||||
|
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||||
|
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2013 ARM Ltd
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the company may not be used to endorse or promote
|
||||||
|
* products derived from this software without specific prior written
|
||||||
|
* permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||||
|
* IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <private/bionic_asm.h>
|
||||||
|
#include <private/libc_events.h>
|
||||||
|
|
||||||
|
.text
|
||||||
|
.syntax unified
|
||||||
|
.fpu neon
|
||||||
|
|
||||||
|
ENTRY(__memcpy_chk)
|
||||||
|
cmp r2, r3
|
||||||
|
bhi .L_memcpy_chk_fail
|
||||||
|
|
||||||
|
// Fall through to memcpy...
|
||||||
|
END(__memcpy_chk)
|
||||||
|
|
||||||
|
// Prototype: void *memcpy (void *dst, const void *src, size_t count).
|
||||||
|
ENTRY(memcpy)
|
||||||
|
pld [r1, #64]
|
||||||
|
push {r0, lr}
|
||||||
|
.cfi_def_cfa_offset 8
|
||||||
|
.cfi_rel_offset r0, 0
|
||||||
|
.cfi_rel_offset lr, 4
|
||||||
|
|
||||||
|
#include MEMCPY_BASE
|
||||||
|
|
||||||
|
// Undo the cfi instructions from above.
|
||||||
|
.cfi_def_cfa_offset 0
|
||||||
|
.cfi_restore r0
|
||||||
|
.cfi_restore lr
|
||||||
|
.L_memcpy_chk_fail:
|
||||||
|
// Preserve lr for backtrace.
|
||||||
|
push {lr}
|
||||||
|
.cfi_adjust_cfa_offset 4
|
||||||
|
.cfi_rel_offset lr, 0
|
||||||
|
|
||||||
|
ldr r0, error_message
|
||||||
|
ldr r1, error_code
|
||||||
|
1:
|
||||||
|
add r0, pc
|
||||||
|
bl __fortify_chk_fail
|
||||||
|
error_code:
|
||||||
|
.word BIONIC_EVENT_MEMCPY_BUFFER_OVERFLOW
|
||||||
|
error_message:
|
||||||
|
.word error_string-(1b+8)
|
||||||
|
END(memcpy)
|
||||||
|
|
||||||
|
.data
|
||||||
|
error_string:
|
||||||
|
.string "memcpy: prevented write past end of buffer"
|
32
libc/arch-arm/cortex-a53/bionic/__strcat_chk.S
Normal file
32
libc/arch-arm/cortex-a53/bionic/__strcat_chk.S
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2015 The Android Open Source Project
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in
|
||||||
|
* the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||||
|
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||||
|
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||||
|
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||||
|
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||||
|
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Indicate which memcpy base file to include.
|
||||||
|
#define MEMCPY_BASE "arch-arm/cortex-a53/bionic/memcpy_base.S"
|
||||||
|
|
||||||
|
#include "arch-arm/cortex-a15/bionic/__strcat_chk_common.S"
|
32
libc/arch-arm/cortex-a53/bionic/__strcpy_chk.S
Normal file
32
libc/arch-arm/cortex-a53/bionic/__strcpy_chk.S
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2015 The Android Open Source Project
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in
|
||||||
|
* the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||||
|
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||||
|
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||||
|
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||||
|
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||||
|
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Indicate which memcpy base file to include.
|
||||||
|
#define MEMCPY_BASE "arch-arm/cortex-a53/bionic/memcpy_base.S"
|
||||||
|
|
||||||
|
#include "arch-arm/cortex-a15/bionic/__strcpy_chk_common.S"
|
32
libc/arch-arm/cortex-a53/bionic/memcpy.S
Normal file
32
libc/arch-arm/cortex-a53/bionic/memcpy.S
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2015 The Android Open Source Project
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in
|
||||||
|
* the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||||
|
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||||
|
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||||
|
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||||
|
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||||
|
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Indicate which memcpy base file to include.
|
||||||
|
#define MEMCPY_BASE "arch-arm/cortex-a53/bionic/memcpy_base.S"
|
||||||
|
|
||||||
|
#include "arch-arm/cortex-a15/bionic/memcpy_common.S"
|
143
libc/arch-arm/cortex-a53/bionic/memcpy_base.S
Normal file
143
libc/arch-arm/cortex-a53/bionic/memcpy_base.S
Normal file
@ -0,0 +1,143 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2008 The Android Open Source Project
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in
|
||||||
|
* the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||||
|
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||||
|
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||||
|
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||||
|
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||||
|
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2013 ARM Ltd
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the company may not be used to endorse or promote
|
||||||
|
* products derived from this software without specific prior written
|
||||||
|
* permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||||
|
* IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
.L_memcpy_base:
|
||||||
|
// Assumes that n >= 0, and dst, src are valid pointers.
|
||||||
|
cmp r2, #16
|
||||||
|
blo .L_copy_less_than_16_unknown_align
|
||||||
|
|
||||||
|
.L_copy_unknown_alignment:
|
||||||
|
// Unknown alignment of src and dst.
|
||||||
|
// Assumes that the first few bytes have already been prefetched.
|
||||||
|
|
||||||
|
// Align destination to 128 bits. The mainloop store instructions
|
||||||
|
// require this alignment or they will throw an exception.
|
||||||
|
rsb r3, r0, #0
|
||||||
|
ands r3, r3, #0xF
|
||||||
|
beq 2f
|
||||||
|
|
||||||
|
// Copy up to 15 bytes (count in r3).
|
||||||
|
sub r2, r2, r3
|
||||||
|
movs ip, r3, lsl #31
|
||||||
|
|
||||||
|
itt mi
|
||||||
|
ldrbmi lr, [r1], #1
|
||||||
|
strbmi lr, [r0], #1
|
||||||
|
itttt cs
|
||||||
|
ldrbcs ip, [r1], #1
|
||||||
|
ldrbcs lr, [r1], #1
|
||||||
|
strbcs ip, [r0], #1
|
||||||
|
strbcs lr, [r0], #1
|
||||||
|
|
||||||
|
movs ip, r3, lsl #29
|
||||||
|
bge 1f
|
||||||
|
// Copies 4 bytes, dst 32 bits aligned before, at least 64 bits after.
|
||||||
|
vld4.8 {d0[0], d1[0], d2[0], d3[0]}, [r1]!
|
||||||
|
vst4.8 {d0[0], d1[0], d2[0], d3[0]}, [r0, :32]!
|
||||||
|
1: bcc 2f
|
||||||
|
// Copies 8 bytes, dst 64 bits aligned before, at least 128 bits after.
|
||||||
|
vld1.8 {d0}, [r1]!
|
||||||
|
vst1.8 {d0}, [r0, :64]!
|
||||||
|
|
||||||
|
2: // Make sure we have at least 64 bytes to copy.
|
||||||
|
subs r2, r2, #64
|
||||||
|
blo 2f
|
||||||
|
|
||||||
|
1: // The main loop copies 64 bytes at a time.
|
||||||
|
vld1.8 {d0 - d3}, [r1]!
|
||||||
|
vld1.8 {d4 - d7}, [r1]!
|
||||||
|
subs r2, r2, #64
|
||||||
|
vstmia r0!, {d0 - d7}
|
||||||
|
pld [r1, #(64*10)]
|
||||||
|
bhs 1b
|
||||||
|
|
||||||
|
2: // Fix-up the remaining count and make sure we have >= 32 bytes left.
|
||||||
|
adds r2, r2, #32
|
||||||
|
blo 3f
|
||||||
|
|
||||||
|
// 32 bytes. These cache lines were already preloaded.
|
||||||
|
vld1.8 {d0 - d3}, [r1]!
|
||||||
|
sub r2, r2, #32
|
||||||
|
vst1.8 {d0 - d3}, [r0, :128]!
|
||||||
|
3: // Less than 32 left.
|
||||||
|
add r2, r2, #32
|
||||||
|
tst r2, #0x10
|
||||||
|
beq .L_copy_less_than_16_unknown_align
|
||||||
|
// Copies 16 bytes, destination 128 bits aligned.
|
||||||
|
vld1.8 {d0, d1}, [r1]!
|
||||||
|
vst1.8 {d0, d1}, [r0, :128]!
|
||||||
|
|
||||||
|
.L_copy_less_than_16_unknown_align:
|
||||||
|
// Copy up to 15 bytes (count in r2).
|
||||||
|
movs ip, r2, lsl #29
|
||||||
|
bcc 1f
|
||||||
|
vld1.8 {d0}, [r1]!
|
||||||
|
vst1.8 {d0}, [r0]!
|
||||||
|
1: bge 2f
|
||||||
|
vld4.8 {d0[0], d1[0], d2[0], d3[0]}, [r1]!
|
||||||
|
vst4.8 {d0[0], d1[0], d2[0], d3[0]}, [r0]!
|
||||||
|
|
||||||
|
2: // Copy 0 to 4 bytes.
|
||||||
|
lsls r2, r2, #31
|
||||||
|
itt ne
|
||||||
|
ldrbne lr, [r1], #1
|
||||||
|
strbne lr, [r0], #1
|
||||||
|
itttt cs
|
||||||
|
ldrbcs ip, [r1], #1
|
||||||
|
ldrbcs lr, [r1]
|
||||||
|
strbcs ip, [r0], #1
|
||||||
|
strbcs lr, [r0]
|
||||||
|
|
||||||
|
pop {r0, pc}
|
@ -1 +1,20 @@
|
|||||||
include bionic/libc/arch-arm/cortex-a7/cortex-a7.mk
|
libc_bionic_src_files_arm += \
|
||||||
|
arch-arm/cortex-a53/bionic/memcpy.S \
|
||||||
|
arch-arm/cortex-a53/bionic/__strcat_chk.S \
|
||||||
|
arch-arm/cortex-a53/bionic/__strcpy_chk.S \
|
||||||
|
|
||||||
|
libc_bionic_src_files_arm += \
|
||||||
|
arch-arm/cortex-a7/bionic/memset.S \
|
||||||
|
|
||||||
|
libc_bionic_src_files_arm += \
|
||||||
|
arch-arm/cortex-a15/bionic/stpcpy.S \
|
||||||
|
arch-arm/cortex-a15/bionic/strcat.S \
|
||||||
|
arch-arm/cortex-a15/bionic/strcmp.S \
|
||||||
|
arch-arm/cortex-a15/bionic/strcpy.S \
|
||||||
|
arch-arm/cortex-a15/bionic/strlen.S \
|
||||||
|
|
||||||
|
libc_bionic_src_files_arm += \
|
||||||
|
arch-arm/generic/bionic/memcmp.S \
|
||||||
|
|
||||||
|
libc_bionic_src_files_arm += \
|
||||||
|
arch-arm/denver/bionic/memmove.S \
|
||||||
|
180
libc/arch-arm/cortex-a7/bionic/memset.S
Normal file
180
libc/arch-arm/cortex-a7/bionic/memset.S
Normal file
@ -0,0 +1,180 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2013 The Android Open Source Project
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in
|
||||||
|
* the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||||
|
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||||
|
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||||
|
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||||
|
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||||
|
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <machine/cpu-features.h>
|
||||||
|
#include <private/bionic_asm.h>
|
||||||
|
#include <private/libc_events.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Optimized memset() for ARM.
|
||||||
|
*
|
||||||
|
* memset() returns its first argument.
|
||||||
|
*/
|
||||||
|
|
||||||
|
.fpu neon
|
||||||
|
.syntax unified
|
||||||
|
|
||||||
|
ENTRY(__memset_chk)
|
||||||
|
cmp r2, r3
|
||||||
|
bls .L_done
|
||||||
|
|
||||||
|
// Preserve lr for backtrace.
|
||||||
|
push {lr}
|
||||||
|
.cfi_def_cfa_offset 4
|
||||||
|
.cfi_rel_offset lr, 0
|
||||||
|
|
||||||
|
ldr r0, error_message
|
||||||
|
ldr r1, error_code
|
||||||
|
1:
|
||||||
|
add r0, pc
|
||||||
|
bl __fortify_chk_fail
|
||||||
|
error_code:
|
||||||
|
.word BIONIC_EVENT_MEMSET_BUFFER_OVERFLOW
|
||||||
|
error_message:
|
||||||
|
.word error_string-(1b+8)
|
||||||
|
END(__memset_chk)
|
||||||
|
|
||||||
|
ENTRY(bzero)
|
||||||
|
mov r2, r1
|
||||||
|
mov r1, #0
|
||||||
|
.L_done:
|
||||||
|
// Fall through to memset...
|
||||||
|
END(bzero)
|
||||||
|
|
||||||
|
ENTRY(memset)
|
||||||
|
mov r3, r0
|
||||||
|
// At this point only d0, d1 are going to be used below.
|
||||||
|
vdup.8 q0, r1
|
||||||
|
cmp r2, #16
|
||||||
|
blo .L_set_less_than_16_unknown_align
|
||||||
|
|
||||||
|
.L_check_alignment:
|
||||||
|
// Align destination to a double word to avoid the store crossing
|
||||||
|
// a cache line boundary.
|
||||||
|
ands ip, r3, #7
|
||||||
|
bne .L_do_double_word_align
|
||||||
|
|
||||||
|
.L_double_word_aligned:
|
||||||
|
// Duplicate since the less than 64 can use d2, d3.
|
||||||
|
vmov q1, q0
|
||||||
|
subs r2, #64
|
||||||
|
blo .L_set_less_than_64
|
||||||
|
|
||||||
|
// Duplicate the copy value so that we can store 64 bytes at a time.
|
||||||
|
vmov q2, q0
|
||||||
|
vmov q3, q0
|
||||||
|
|
||||||
|
1: // Main loop stores 64 bytes at a time.
|
||||||
|
subs r2, #64
|
||||||
|
vstmia r3!, {d0 - d7}
|
||||||
|
bge 1b
|
||||||
|
|
||||||
|
.L_set_less_than_64:
|
||||||
|
// Restore r2 to the count of bytes left to set.
|
||||||
|
add r2, #64
|
||||||
|
lsls ip, r2, #27
|
||||||
|
bcc .L_set_less_than_32
|
||||||
|
// Set 32 bytes.
|
||||||
|
vstmia r3!, {d0 - d3}
|
||||||
|
|
||||||
|
.L_set_less_than_32:
|
||||||
|
bpl .L_set_less_than_16
|
||||||
|
// Set 16 bytes.
|
||||||
|
vstmia r3!, {d0, d1}
|
||||||
|
|
||||||
|
.L_set_less_than_16:
|
||||||
|
// Less than 16 bytes to set.
|
||||||
|
lsls ip, r2, #29
|
||||||
|
bcc .L_set_less_than_8
|
||||||
|
|
||||||
|
// Set 8 bytes.
|
||||||
|
vstmia r3!, {d0}
|
||||||
|
|
||||||
|
.L_set_less_than_8:
|
||||||
|
bpl .L_set_less_than_4
|
||||||
|
// Set 4 bytes
|
||||||
|
vst1.32 {d0[0]}, [r3]!
|
||||||
|
|
||||||
|
.L_set_less_than_4:
|
||||||
|
lsls ip, r2, #31
|
||||||
|
it ne
|
||||||
|
strbne r1, [r3], #1
|
||||||
|
itt cs
|
||||||
|
strbcs r1, [r3], #1
|
||||||
|
strbcs r1, [r3]
|
||||||
|
bx lr
|
||||||
|
|
||||||
|
.L_do_double_word_align:
|
||||||
|
rsb ip, ip, #8
|
||||||
|
sub r2, r2, ip
|
||||||
|
|
||||||
|
// Do this comparison now, otherwise we'll need to save a
|
||||||
|
// register to the stack since we've used all available
|
||||||
|
// registers.
|
||||||
|
cmp ip, #4
|
||||||
|
blo 1f
|
||||||
|
|
||||||
|
// Need to do a four byte copy.
|
||||||
|
movs ip, ip, lsl #31
|
||||||
|
it mi
|
||||||
|
strbmi r1, [r3], #1
|
||||||
|
itt cs
|
||||||
|
strbcs r1, [r3], #1
|
||||||
|
strbcs r1, [r3], #1
|
||||||
|
vst1.32 {d0[0]}, [r3]!
|
||||||
|
b .L_double_word_aligned
|
||||||
|
|
||||||
|
1:
|
||||||
|
// No four byte copy.
|
||||||
|
movs ip, ip, lsl #31
|
||||||
|
it mi
|
||||||
|
strbmi r1, [r3], #1
|
||||||
|
itt cs
|
||||||
|
strbcs r1, [r3], #1
|
||||||
|
strbcs r1, [r3], #1
|
||||||
|
b .L_double_word_aligned
|
||||||
|
|
||||||
|
.L_set_less_than_16_unknown_align:
|
||||||
|
// Set up to 15 bytes.
|
||||||
|
movs ip, r2, lsl #29
|
||||||
|
bcc 1f
|
||||||
|
vst1.8 {d0}, [r3]!
|
||||||
|
1: bge 2f
|
||||||
|
vst1.32 {d0[0]}, [r3]!
|
||||||
|
2: movs ip, r2, lsl #31
|
||||||
|
it mi
|
||||||
|
strbmi r1, [r3], #1
|
||||||
|
itt cs
|
||||||
|
strbcs r1, [r3], #1
|
||||||
|
strbcs r1, [r3], #1
|
||||||
|
bx lr
|
||||||
|
END(memset)
|
||||||
|
|
||||||
|
.data
|
||||||
|
error_string:
|
||||||
|
.string "memset: prevented write past end of buffer"
|
@ -1 +1,18 @@
|
|||||||
include bionic/libc/arch-arm/cortex-a15/cortex-a15.mk
|
libc_bionic_src_files_arm += \
|
||||||
|
arch-arm/cortex-a7/bionic/memset.S \
|
||||||
|
|
||||||
|
libc_bionic_src_files_arm += \
|
||||||
|
arch-arm/cortex-a15/bionic/memcpy.S \
|
||||||
|
arch-arm/cortex-a15/bionic/stpcpy.S \
|
||||||
|
arch-arm/cortex-a15/bionic/strcat.S \
|
||||||
|
arch-arm/cortex-a15/bionic/__strcat_chk.S \
|
||||||
|
arch-arm/cortex-a15/bionic/strcmp.S \
|
||||||
|
arch-arm/cortex-a15/bionic/strcpy.S \
|
||||||
|
arch-arm/cortex-a15/bionic/__strcpy_chk.S \
|
||||||
|
arch-arm/cortex-a15/bionic/strlen.S \
|
||||||
|
|
||||||
|
libc_bionic_src_files_arm += \
|
||||||
|
arch-arm/generic/bionic/memcmp.S \
|
||||||
|
|
||||||
|
libc_bionic_src_files_arm += \
|
||||||
|
arch-arm/denver/bionic/memmove.S \
|
||||||
|
Loading…
x
Reference in New Issue
Block a user