blob: 299f5a2d249ef893155cb274c382d2429764ecb6 [file] [log] [blame]
Christopher Ferris7c83a1e2013-02-26 01:30:00 -08001/*
2 * Copyright (C) 2008 The Android Open Source Project
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in
12 * the documentation and/or other materials provided with the
13 * distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
18 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
19 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
22 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
25 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 */
28
Elliott Hughes851e68a2014-02-19 16:53:20 -080029#include <private/bionic_asm.h>
30#include <private/libc_events.h>
Christopher Ferris7c83a1e2013-02-26 01:30:00 -080031
32/*
33 * This code assumes it is running on a processor that supports all arm v7
34 * instructions and that supports neon instructions.
35 */
36
37 .fpu neon
38
Christopher Ferris59a13c12013-08-01 13:13:33 -070039ENTRY(__memset_chk)
40 cmp r2, r3
Christopher Ferris5f45d582013-08-07 13:09:51 -070041 bls .L_done
42
43 // Preserve lr for backtrace.
44 push {lr}
45 .cfi_def_cfa_offset 4
46 .cfi_rel_offset lr, 0
Christopher Ferris59a13c12013-08-01 13:13:33 -070047
48 ldr r0, error_message
49 ldr r1, error_code
501:
51 add r0, pc
52 bl __fortify_chk_fail
53error_code:
54 .word BIONIC_EVENT_MEMSET_BUFFER_OVERFLOW
55error_message:
56 .word error_string-(1b+8)
Christopher Ferris59a13c12013-08-01 13:13:33 -070057END(__memset_chk)
58
Christopher Ferris7c83a1e2013-02-26 01:30:00 -080059ENTRY(bzero)
60 mov r2, r1
61 mov r1, #0
Christopher Ferris59a13c12013-08-01 13:13:33 -070062
Christopher Ferris5f45d582013-08-07 13:09:51 -070063.L_done:
Christopher Ferris59a13c12013-08-01 13:13:33 -070064 // Fall through to memset...
Christopher Ferris7c83a1e2013-02-26 01:30:00 -080065END(bzero)
66
67/* memset() returns its first argument. */
68ENTRY(memset)
Christopher Ferris507cfe22013-11-19 13:45:27 -080069 // The neon memset only wins for less than 132.
Christopher Ferris7c83a1e2013-02-26 01:30:00 -080070 cmp r2, #132
Christopher Ferrisa57c9c02013-08-21 09:41:12 -070071 bhi __memset_large_copy
Christopher Ferris7c83a1e2013-02-26 01:30:00 -080072
Christopher Ferris7c83a1e2013-02-26 01:30:00 -080073 stmfd sp!, {r0}
Christopher Ferris5f45d582013-08-07 13:09:51 -070074 .cfi_def_cfa_offset 4
75 .cfi_rel_offset r0, 0
Christopher Ferris7c83a1e2013-02-26 01:30:00 -080076
77 vdup.8 q0, r1
78
79 /* make sure we have at least 32 bytes to write */
80 subs r2, r2, #32
81 blo 2f
82 vmov q1, q0
83
841: /* The main loop writes 32 bytes at a time */
85 subs r2, r2, #32
86 vst1.8 {d0 - d3}, [r0]!
87 bhs 1b
88
892: /* less than 32 left */
90 add r2, r2, #32
91 tst r2, #0x10
92 beq 3f
93
94 // writes 16 bytes, 128-bits aligned
95 vst1.8 {d0, d1}, [r0]!
963: /* write up to 15-bytes (count in r2) */
97 movs ip, r2, lsl #29
98 bcc 1f
99 vst1.8 {d0}, [r0]!
1001: bge 2f
101 vst1.32 {d0[0]}, [r0]!
1022: movs ip, r2, lsl #31
103 strmib r1, [r0], #1
104 strcsb r1, [r0], #1
105 strcsb r1, [r0], #1
106 ldmfd sp!, {r0}
107 bx lr
Christopher Ferrisa57c9c02013-08-21 09:41:12 -0700108END(memset)
109
Nick Kralevich32bbf8a2013-10-02 16:54:58 -0700110ENTRY_PRIVATE(__memset_large_copy)
Christopher Ferris7c83a1e2013-02-26 01:30:00 -0800111 /* compute the offset to align the destination
112 * offset = (4-(src&3))&3 = -src & 3
113 */
Christopher Ferris7c83a1e2013-02-26 01:30:00 -0800114 stmfd sp!, {r0, r4-r7, lr}
Christopher Ferris5f45d582013-08-07 13:09:51 -0700115 .cfi_def_cfa_offset 24
116 .cfi_rel_offset r0, 0
117 .cfi_rel_offset r4, 4
118 .cfi_rel_offset r5, 8
119 .cfi_rel_offset r6, 12
120 .cfi_rel_offset r7, 16
121 .cfi_rel_offset lr, 20
122
Christopher Ferris7c83a1e2013-02-26 01:30:00 -0800123 rsb r3, r0, #0
124 ands r3, r3, #3
125 cmp r3, r2
126 movhi r3, r2
127
128 /* splat r1 */
129 mov r1, r1, lsl #24
130 orr r1, r1, r1, lsr #8
131 orr r1, r1, r1, lsr #16
132
133 movs r12, r3, lsl #31
134 strcsb r1, [r0], #1 /* can't use strh (alignment unknown) */
135 strcsb r1, [r0], #1
136 strmib r1, [r0], #1
137 subs r2, r2, r3
138 ldmlsfd sp!, {r0, r4-r7, lr} /* return */
139 bxls lr
140
141 /* align the destination to a cache-line */
142 mov r12, r1
143 mov lr, r1
144 mov r4, r1
145 mov r5, r1
146 mov r6, r1
147 mov r7, r1
148
149 rsb r3, r0, #0
150 ands r3, r3, #0x1C
151 beq 3f
152 cmp r3, r2
153 andhi r3, r2, #0x1C
154 sub r2, r2, r3
155
156 /* conditionally writes 0 to 7 words (length in r3) */
157 movs r3, r3, lsl #28
158 stmcsia r0!, {r1, lr}
159 stmcsia r0!, {r1, lr}
160 stmmiia r0!, {r1, lr}
161 movs r3, r3, lsl #2
162 strcs r1, [r0], #4
163
1643:
165 subs r2, r2, #32
166 mov r3, r1
167 bmi 2f
1681: subs r2, r2, #32
169 stmia r0!, {r1,r3,r4,r5,r6,r7,r12,lr}
170 bhs 1b
1712: add r2, r2, #32
172
173 /* conditionally stores 0 to 31 bytes */
174 movs r2, r2, lsl #28
175 stmcsia r0!, {r1,r3,r12,lr}
176 stmmiia r0!, {r1, lr}
177 movs r2, r2, lsl #2
178 strcs r1, [r0], #4
179 strmih r1, [r0], #2
180 movs r2, r2, lsl #2
181 strcsb r1, [r0]
182 ldmfd sp!, {r0, r4-r7, lr}
183 bx lr
Christopher Ferrisa57c9c02013-08-21 09:41:12 -0700184END(__memset_large_copy)
Christopher Ferris59a13c12013-08-01 13:13:33 -0700185
186 .data
187error_string:
Elliott Hughes68b67112013-10-15 17:17:05 -0700188 .string "memset: prevented write past end of buffer"