diff options
author | Christopher Ferris <cferris@google.com> | 2013-08-01 13:13:33 -0700 |
---|---|---|
committer | Christopher Ferris <cferris@google.com> | 2013-08-14 18:14:43 -0700 |
commit | 59a13c122ebc4191583b67c846a95d690dcda5cf (patch) | |
tree | 70d47582d6e0c4c18847e3f74649b2bca0fef5c6 /libc/arch-arm/krait/bionic/memset.S | |
parent | c85e0dbb0b8d602f930cf7ae99901730c1c6a26a (diff) | |
download | bionic-59a13c122ebc4191583b67c846a95d690dcda5cf.zip bionic-59a13c122ebc4191583b67c846a95d690dcda5cf.tar.gz bionic-59a13c122ebc4191583b67c846a95d690dcda5cf.tar.bz2 |
Optimize __memset_chk, __memcpy_chk. DO NOT MERGE.
This change creates assembler versions of __memcpy_chk/__memset_chk
that is implemented in the memcpy/memset assembler code. This change
avoids an extra call to memcpy/memset, instead allowing a simple fall
through to occur from the chk code into the body of the real
implementation.
Testing:
- Ran the libc_test on __memcpy_chk/__memset_chk on all nexus devices.
- Wrote a small test executable that has three calls to __memcpy_chk and
three calls to __memset_chk. First call dest_len is length + 1. Second
call dest_len is length. Third call dest_len is length - 1.
Verified that the first two calls pass, and the third fails. Examined
the logcat output on all nexus devices to verify that the fortify
error message was sent properly.
- I benchmarked the new __memcpy_chk and __memset_chk on all systems. For
__memcpy_chk and large copies, the savings is relatively small (about 1%).
For small copies, the savings is large on cortex-a15/krait devices
(between 5% to 30%).
For cortex-a9 and small copies, the speed up is present, but relatively
small (about 3% to 5%).
For __memset_chk and large copies, the savings is also small (about 1%).
However, all processors show larger speed-ups on small copies (about 30% to
100%).
Bug: 9293744
Merge from internal master.
(cherry-picked from 7c860db0747f6276a6e43984d43f8fa5181ea936)
Change-Id: I916ad305e4001269460ca6ebd38aaa0be8ac7f52
Diffstat (limited to 'libc/arch-arm/krait/bionic/memset.S')
-rw-r--r-- | libc/arch-arm/krait/bionic/memset.S | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/libc/arch-arm/krait/bionic/memset.S b/libc/arch-arm/krait/bionic/memset.S index a2e2d80..4e4788b 100644 --- a/libc/arch-arm/krait/bionic/memset.S +++ b/libc/arch-arm/krait/bionic/memset.S @@ -28,6 +28,7 @@ #include <machine/cpu-features.h> #include <machine/asm.h> +#include "libc_events.h" /* * This code assumes it is running on a processor that supports all arm v7 @@ -37,9 +38,28 @@ .fpu neon +ENTRY(__memset_chk) + cmp r2, r3 + bls done + + 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 + +done: + // Fall through to memset... END(bzero) /* memset() returns its first argument. */ @@ -79,3 +99,7 @@ ENTRY(memset) ldmfd sp!, {r0} bx lr END(memset) + + .data +error_string: + .string "memset buffer overflow" |