Merge "Add optimized cortex-a7/cortex-a53 memset/memcpy."
This commit is contained in:
		| @@ -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 \ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Christopher Ferris
					Christopher Ferris