1*d83cc019SAndroid Build Coastguard Worker /*
2*d83cc019SAndroid Build Coastguard Worker * Copyright (c) 2013 Intel Corporation
3*d83cc019SAndroid Build Coastguard Worker *
4*d83cc019SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
5*d83cc019SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"),
6*d83cc019SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation
7*d83cc019SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*d83cc019SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the
9*d83cc019SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions:
10*d83cc019SAndroid Build Coastguard Worker *
11*d83cc019SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the next
12*d83cc019SAndroid Build Coastguard Worker * paragraph) shall be included in all copies or substantial portions of the
13*d83cc019SAndroid Build Coastguard Worker * Software.
14*d83cc019SAndroid Build Coastguard Worker *
15*d83cc019SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*d83cc019SAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*d83cc019SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18*d83cc019SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*d83cc019SAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20*d83cc019SAndroid Build Coastguard Worker * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21*d83cc019SAndroid Build Coastguard Worker * SOFTWARE.
22*d83cc019SAndroid Build Coastguard Worker *
23*d83cc019SAndroid Build Coastguard Worker * Authors:
24*d83cc019SAndroid Build Coastguard Worker * Chris Wilson <[email protected]>
25*d83cc019SAndroid Build Coastguard Worker *
26*d83cc019SAndroid Build Coastguard Worker */
27*d83cc019SAndroid Build Coastguard Worker
28*d83cc019SAndroid Build Coastguard Worker #include "config.h"
29*d83cc019SAndroid Build Coastguard Worker
30*d83cc019SAndroid Build Coastguard Worker #ifdef HAVE_CPUID_H
31*d83cc019SAndroid Build Coastguard Worker #include <cpuid.h>
32*d83cc019SAndroid Build Coastguard Worker #else
33*d83cc019SAndroid Build Coastguard Worker #define __get_cpuid_max(x, y) 0
34*d83cc019SAndroid Build Coastguard Worker #define __cpuid(level, a, b, c, d) a = b = c = d = 0
35*d83cc019SAndroid Build Coastguard Worker #define __cpuid_count(level, count, a, b, c, d) a = b = c = d = 0
36*d83cc019SAndroid Build Coastguard Worker #endif
37*d83cc019SAndroid Build Coastguard Worker
38*d83cc019SAndroid Build Coastguard Worker #include "igt_x86.h"
39*d83cc019SAndroid Build Coastguard Worker #include "igt_aux.h"
40*d83cc019SAndroid Build Coastguard Worker
41*d83cc019SAndroid Build Coastguard Worker #include <stdint.h>
42*d83cc019SAndroid Build Coastguard Worker #include <stdio.h>
43*d83cc019SAndroid Build Coastguard Worker #include <string.h>
44*d83cc019SAndroid Build Coastguard Worker
45*d83cc019SAndroid Build Coastguard Worker /**
46*d83cc019SAndroid Build Coastguard Worker * SECTION:igt_x86
47*d83cc019SAndroid Build Coastguard Worker * @short_description: x86 helper library
48*d83cc019SAndroid Build Coastguard Worker * @title: x86
49*d83cc019SAndroid Build Coastguard Worker * @include: igt_x86.h
50*d83cc019SAndroid Build Coastguard Worker */
51*d83cc019SAndroid Build Coastguard Worker
52*d83cc019SAndroid Build Coastguard Worker #define BASIC_CPUID 0x0
53*d83cc019SAndroid Build Coastguard Worker #define EXTENDED_CPUID 0x80000000
54*d83cc019SAndroid Build Coastguard Worker
55*d83cc019SAndroid Build Coastguard Worker #ifndef bit_MMX
56*d83cc019SAndroid Build Coastguard Worker #define bit_MMX (1 << 23)
57*d83cc019SAndroid Build Coastguard Worker #endif
58*d83cc019SAndroid Build Coastguard Worker
59*d83cc019SAndroid Build Coastguard Worker #ifndef bit_SSE
60*d83cc019SAndroid Build Coastguard Worker #define bit_SSE (1 << 25)
61*d83cc019SAndroid Build Coastguard Worker #endif
62*d83cc019SAndroid Build Coastguard Worker
63*d83cc019SAndroid Build Coastguard Worker #ifndef bit_SSE2
64*d83cc019SAndroid Build Coastguard Worker #define bit_SSE2 (1 << 26)
65*d83cc019SAndroid Build Coastguard Worker #endif
66*d83cc019SAndroid Build Coastguard Worker
67*d83cc019SAndroid Build Coastguard Worker #ifndef bit_SSE3
68*d83cc019SAndroid Build Coastguard Worker #define bit_SSE3 (1 << 0)
69*d83cc019SAndroid Build Coastguard Worker #endif
70*d83cc019SAndroid Build Coastguard Worker
71*d83cc019SAndroid Build Coastguard Worker #ifndef bit_SSSE3
72*d83cc019SAndroid Build Coastguard Worker #define bit_SSSE3 (1 << 9)
73*d83cc019SAndroid Build Coastguard Worker #endif
74*d83cc019SAndroid Build Coastguard Worker
75*d83cc019SAndroid Build Coastguard Worker #ifndef bit_SSE4_1
76*d83cc019SAndroid Build Coastguard Worker #define bit_SSE4_1 (1 << 19)
77*d83cc019SAndroid Build Coastguard Worker #endif
78*d83cc019SAndroid Build Coastguard Worker
79*d83cc019SAndroid Build Coastguard Worker #ifndef bit_SSE4_2
80*d83cc019SAndroid Build Coastguard Worker #define bit_SSE4_2 (1 << 20)
81*d83cc019SAndroid Build Coastguard Worker #endif
82*d83cc019SAndroid Build Coastguard Worker
83*d83cc019SAndroid Build Coastguard Worker #ifndef bit_OSXSAVE
84*d83cc019SAndroid Build Coastguard Worker #define bit_OSXSAVE (1 << 27)
85*d83cc019SAndroid Build Coastguard Worker #endif
86*d83cc019SAndroid Build Coastguard Worker
87*d83cc019SAndroid Build Coastguard Worker #ifndef bit_AVX
88*d83cc019SAndroid Build Coastguard Worker #define bit_AVX (1 << 28)
89*d83cc019SAndroid Build Coastguard Worker #endif
90*d83cc019SAndroid Build Coastguard Worker
91*d83cc019SAndroid Build Coastguard Worker #ifndef bit_F16C
92*d83cc019SAndroid Build Coastguard Worker #define bit_F16C (1 << 29)
93*d83cc019SAndroid Build Coastguard Worker #endif
94*d83cc019SAndroid Build Coastguard Worker
95*d83cc019SAndroid Build Coastguard Worker #ifndef bit_AVX2
96*d83cc019SAndroid Build Coastguard Worker #define bit_AVX2 (1<<5)
97*d83cc019SAndroid Build Coastguard Worker #endif
98*d83cc019SAndroid Build Coastguard Worker
99*d83cc019SAndroid Build Coastguard Worker #define xgetbv(index,eax,edx) \
100*d83cc019SAndroid Build Coastguard Worker __asm__ ("xgetbv" : "=a"(eax), "=d"(edx) : "c" (index))
101*d83cc019SAndroid Build Coastguard Worker
102*d83cc019SAndroid Build Coastguard Worker #define has_YMM 0x1
103*d83cc019SAndroid Build Coastguard Worker
104*d83cc019SAndroid Build Coastguard Worker #if defined(__x86_64__) || defined(__i386__)
igt_x86_features(void)105*d83cc019SAndroid Build Coastguard Worker unsigned igt_x86_features(void)
106*d83cc019SAndroid Build Coastguard Worker {
107*d83cc019SAndroid Build Coastguard Worker unsigned max = __get_cpuid_max(BASIC_CPUID, 0);
108*d83cc019SAndroid Build Coastguard Worker unsigned eax, ebx, ecx, edx;
109*d83cc019SAndroid Build Coastguard Worker unsigned features = 0;
110*d83cc019SAndroid Build Coastguard Worker unsigned extra = 0;
111*d83cc019SAndroid Build Coastguard Worker
112*d83cc019SAndroid Build Coastguard Worker if (max >= 1) {
113*d83cc019SAndroid Build Coastguard Worker __cpuid(1, eax, ebx, ecx, edx);
114*d83cc019SAndroid Build Coastguard Worker
115*d83cc019SAndroid Build Coastguard Worker if (ecx & bit_SSE3)
116*d83cc019SAndroid Build Coastguard Worker features |= SSE3;
117*d83cc019SAndroid Build Coastguard Worker
118*d83cc019SAndroid Build Coastguard Worker if (ecx & bit_SSSE3)
119*d83cc019SAndroid Build Coastguard Worker features |= SSSE3;
120*d83cc019SAndroid Build Coastguard Worker
121*d83cc019SAndroid Build Coastguard Worker if (ecx & bit_SSE4_1)
122*d83cc019SAndroid Build Coastguard Worker features |= SSE4_1;
123*d83cc019SAndroid Build Coastguard Worker
124*d83cc019SAndroid Build Coastguard Worker if (ecx & bit_SSE4_2)
125*d83cc019SAndroid Build Coastguard Worker features |= SSE4_2;
126*d83cc019SAndroid Build Coastguard Worker
127*d83cc019SAndroid Build Coastguard Worker if (ecx & bit_OSXSAVE) {
128*d83cc019SAndroid Build Coastguard Worker unsigned int bv_eax, bv_ecx;
129*d83cc019SAndroid Build Coastguard Worker xgetbv(0, bv_eax, bv_ecx);
130*d83cc019SAndroid Build Coastguard Worker if ((bv_eax & 6) == 6)
131*d83cc019SAndroid Build Coastguard Worker extra |= has_YMM;
132*d83cc019SAndroid Build Coastguard Worker }
133*d83cc019SAndroid Build Coastguard Worker
134*d83cc019SAndroid Build Coastguard Worker if ((extra & has_YMM) && (ecx & bit_AVX))
135*d83cc019SAndroid Build Coastguard Worker features |= AVX;
136*d83cc019SAndroid Build Coastguard Worker
137*d83cc019SAndroid Build Coastguard Worker if (edx & bit_MMX)
138*d83cc019SAndroid Build Coastguard Worker features |= MMX;
139*d83cc019SAndroid Build Coastguard Worker
140*d83cc019SAndroid Build Coastguard Worker if (edx & bit_SSE)
141*d83cc019SAndroid Build Coastguard Worker features |= SSE;
142*d83cc019SAndroid Build Coastguard Worker
143*d83cc019SAndroid Build Coastguard Worker if (edx & bit_SSE2)
144*d83cc019SAndroid Build Coastguard Worker features |= SSE2;
145*d83cc019SAndroid Build Coastguard Worker
146*d83cc019SAndroid Build Coastguard Worker if (ecx & bit_F16C)
147*d83cc019SAndroid Build Coastguard Worker features |= F16C;
148*d83cc019SAndroid Build Coastguard Worker }
149*d83cc019SAndroid Build Coastguard Worker
150*d83cc019SAndroid Build Coastguard Worker if (max >= 7) {
151*d83cc019SAndroid Build Coastguard Worker __cpuid_count(7, 0, eax, ebx, ecx, edx);
152*d83cc019SAndroid Build Coastguard Worker
153*d83cc019SAndroid Build Coastguard Worker if ((extra & has_YMM) && (ebx & bit_AVX2))
154*d83cc019SAndroid Build Coastguard Worker features |= AVX2;
155*d83cc019SAndroid Build Coastguard Worker }
156*d83cc019SAndroid Build Coastguard Worker
157*d83cc019SAndroid Build Coastguard Worker return features;
158*d83cc019SAndroid Build Coastguard Worker }
159*d83cc019SAndroid Build Coastguard Worker
igt_x86_features_to_string(unsigned features,char * line)160*d83cc019SAndroid Build Coastguard Worker char *igt_x86_features_to_string(unsigned features, char *line)
161*d83cc019SAndroid Build Coastguard Worker {
162*d83cc019SAndroid Build Coastguard Worker char *ret = line;
163*d83cc019SAndroid Build Coastguard Worker
164*d83cc019SAndroid Build Coastguard Worker #ifdef __x86_64__
165*d83cc019SAndroid Build Coastguard Worker line += sprintf(line, "x86-64");
166*d83cc019SAndroid Build Coastguard Worker #else
167*d83cc019SAndroid Build Coastguard Worker line += sprintf(line, "x86");
168*d83cc019SAndroid Build Coastguard Worker #endif
169*d83cc019SAndroid Build Coastguard Worker
170*d83cc019SAndroid Build Coastguard Worker if (features & SSE2)
171*d83cc019SAndroid Build Coastguard Worker line += sprintf(line, ", sse2");
172*d83cc019SAndroid Build Coastguard Worker if (features & SSE3)
173*d83cc019SAndroid Build Coastguard Worker line += sprintf(line, ", sse3");
174*d83cc019SAndroid Build Coastguard Worker if (features & SSSE3)
175*d83cc019SAndroid Build Coastguard Worker line += sprintf(line, ", ssse3");
176*d83cc019SAndroid Build Coastguard Worker if (features & SSE4_1)
177*d83cc019SAndroid Build Coastguard Worker line += sprintf(line, ", sse4.1");
178*d83cc019SAndroid Build Coastguard Worker if (features & SSE4_2)
179*d83cc019SAndroid Build Coastguard Worker line += sprintf(line, ", sse4.2");
180*d83cc019SAndroid Build Coastguard Worker if (features & AVX)
181*d83cc019SAndroid Build Coastguard Worker line += sprintf(line, ", avx");
182*d83cc019SAndroid Build Coastguard Worker if (features & AVX2)
183*d83cc019SAndroid Build Coastguard Worker line += sprintf(line, ", avx2");
184*d83cc019SAndroid Build Coastguard Worker if (features & F16C)
185*d83cc019SAndroid Build Coastguard Worker line += sprintf(line, ", f16c");
186*d83cc019SAndroid Build Coastguard Worker
187*d83cc019SAndroid Build Coastguard Worker (void)line;
188*d83cc019SAndroid Build Coastguard Worker
189*d83cc019SAndroid Build Coastguard Worker return ret;
190*d83cc019SAndroid Build Coastguard Worker }
191*d83cc019SAndroid Build Coastguard Worker #endif
192*d83cc019SAndroid Build Coastguard Worker
193*d83cc019SAndroid Build Coastguard Worker #if defined(__x86_64__) && !defined(__clang__)
194*d83cc019SAndroid Build Coastguard Worker #pragma GCC push_options
195*d83cc019SAndroid Build Coastguard Worker #pragma GCC target("sse4.1")
196*d83cc019SAndroid Build Coastguard Worker #pragma GCC diagnostic ignored "-Wpointer-arith"
197*d83cc019SAndroid Build Coastguard Worker
198*d83cc019SAndroid Build Coastguard Worker #include <smmintrin.h>
memcpy_from_wc_sse41(void * dst,const void * src,unsigned long len)199*d83cc019SAndroid Build Coastguard Worker static void memcpy_from_wc_sse41(void *dst, const void *src, unsigned long len)
200*d83cc019SAndroid Build Coastguard Worker {
201*d83cc019SAndroid Build Coastguard Worker char buf[16];
202*d83cc019SAndroid Build Coastguard Worker
203*d83cc019SAndroid Build Coastguard Worker /* Flush the internal buffer of potential stale gfx data */
204*d83cc019SAndroid Build Coastguard Worker _mm_mfence();
205*d83cc019SAndroid Build Coastguard Worker
206*d83cc019SAndroid Build Coastguard Worker if ((uintptr_t)src & 15) {
207*d83cc019SAndroid Build Coastguard Worker __m128i *S = (__m128i *)((uintptr_t)src & ~15);
208*d83cc019SAndroid Build Coastguard Worker unsigned long misalign = (uintptr_t)src & 15;
209*d83cc019SAndroid Build Coastguard Worker unsigned long copy = min(len, 16 - misalign);
210*d83cc019SAndroid Build Coastguard Worker
211*d83cc019SAndroid Build Coastguard Worker _mm_storeu_si128((__m128i *)buf,
212*d83cc019SAndroid Build Coastguard Worker _mm_stream_load_si128(S));
213*d83cc019SAndroid Build Coastguard Worker
214*d83cc019SAndroid Build Coastguard Worker memcpy(dst, buf + misalign, copy);
215*d83cc019SAndroid Build Coastguard Worker
216*d83cc019SAndroid Build Coastguard Worker dst += copy;
217*d83cc019SAndroid Build Coastguard Worker src += copy;
218*d83cc019SAndroid Build Coastguard Worker len -= copy;
219*d83cc019SAndroid Build Coastguard Worker }
220*d83cc019SAndroid Build Coastguard Worker
221*d83cc019SAndroid Build Coastguard Worker /* We assume we are doing bulk transfers, so prefer aligned moves */
222*d83cc019SAndroid Build Coastguard Worker if (((uintptr_t)dst & 15) == 0) {
223*d83cc019SAndroid Build Coastguard Worker while (len >= 64) {
224*d83cc019SAndroid Build Coastguard Worker __m128i *S = (__m128i *)src;
225*d83cc019SAndroid Build Coastguard Worker __m128i *D = (__m128i *)dst;
226*d83cc019SAndroid Build Coastguard Worker __m128i tmp[4];
227*d83cc019SAndroid Build Coastguard Worker
228*d83cc019SAndroid Build Coastguard Worker tmp[0] = _mm_stream_load_si128(S + 0);
229*d83cc019SAndroid Build Coastguard Worker tmp[1] = _mm_stream_load_si128(S + 1);
230*d83cc019SAndroid Build Coastguard Worker tmp[2] = _mm_stream_load_si128(S + 2);
231*d83cc019SAndroid Build Coastguard Worker tmp[3] = _mm_stream_load_si128(S + 3);
232*d83cc019SAndroid Build Coastguard Worker
233*d83cc019SAndroid Build Coastguard Worker _mm_store_si128(D + 0, tmp[0]);
234*d83cc019SAndroid Build Coastguard Worker _mm_store_si128(D + 1, tmp[1]);
235*d83cc019SAndroid Build Coastguard Worker _mm_store_si128(D + 2, tmp[2]);
236*d83cc019SAndroid Build Coastguard Worker _mm_store_si128(D + 3, tmp[3]);
237*d83cc019SAndroid Build Coastguard Worker
238*d83cc019SAndroid Build Coastguard Worker src += 64;
239*d83cc019SAndroid Build Coastguard Worker dst += 64;
240*d83cc019SAndroid Build Coastguard Worker len -= 64;
241*d83cc019SAndroid Build Coastguard Worker }
242*d83cc019SAndroid Build Coastguard Worker } else {
243*d83cc019SAndroid Build Coastguard Worker while (len >= 64) {
244*d83cc019SAndroid Build Coastguard Worker __m128i *S = (__m128i *)src;
245*d83cc019SAndroid Build Coastguard Worker __m128i *D = (__m128i *)dst;
246*d83cc019SAndroid Build Coastguard Worker __m128i tmp[4];
247*d83cc019SAndroid Build Coastguard Worker
248*d83cc019SAndroid Build Coastguard Worker tmp[0] = _mm_stream_load_si128(S + 0);
249*d83cc019SAndroid Build Coastguard Worker tmp[1] = _mm_stream_load_si128(S + 1);
250*d83cc019SAndroid Build Coastguard Worker tmp[2] = _mm_stream_load_si128(S + 2);
251*d83cc019SAndroid Build Coastguard Worker tmp[3] = _mm_stream_load_si128(S + 3);
252*d83cc019SAndroid Build Coastguard Worker
253*d83cc019SAndroid Build Coastguard Worker _mm_storeu_si128(D + 0, tmp[0]);
254*d83cc019SAndroid Build Coastguard Worker _mm_storeu_si128(D + 1, tmp[1]);
255*d83cc019SAndroid Build Coastguard Worker _mm_storeu_si128(D + 2, tmp[2]);
256*d83cc019SAndroid Build Coastguard Worker _mm_storeu_si128(D + 3, tmp[3]);
257*d83cc019SAndroid Build Coastguard Worker
258*d83cc019SAndroid Build Coastguard Worker src += 64;
259*d83cc019SAndroid Build Coastguard Worker dst += 64;
260*d83cc019SAndroid Build Coastguard Worker len -= 64;
261*d83cc019SAndroid Build Coastguard Worker }
262*d83cc019SAndroid Build Coastguard Worker }
263*d83cc019SAndroid Build Coastguard Worker
264*d83cc019SAndroid Build Coastguard Worker while (len >= 16) {
265*d83cc019SAndroid Build Coastguard Worker _mm_storeu_si128((__m128i *)dst,
266*d83cc019SAndroid Build Coastguard Worker _mm_stream_load_si128((__m128i *)src));
267*d83cc019SAndroid Build Coastguard Worker
268*d83cc019SAndroid Build Coastguard Worker src += 16;
269*d83cc019SAndroid Build Coastguard Worker dst += 16;
270*d83cc019SAndroid Build Coastguard Worker len -= 16;
271*d83cc019SAndroid Build Coastguard Worker }
272*d83cc019SAndroid Build Coastguard Worker
273*d83cc019SAndroid Build Coastguard Worker if (len) {
274*d83cc019SAndroid Build Coastguard Worker _mm_storeu_si128((__m128i *)buf,
275*d83cc019SAndroid Build Coastguard Worker _mm_stream_load_si128((__m128i *)src));
276*d83cc019SAndroid Build Coastguard Worker memcpy(dst, buf, len);
277*d83cc019SAndroid Build Coastguard Worker }
278*d83cc019SAndroid Build Coastguard Worker }
279*d83cc019SAndroid Build Coastguard Worker
280*d83cc019SAndroid Build Coastguard Worker #pragma GCC pop_options
281*d83cc019SAndroid Build Coastguard Worker
memcpy_from_wc(void * dst,const void * src,unsigned long len)282*d83cc019SAndroid Build Coastguard Worker static void memcpy_from_wc(void *dst, const void *src, unsigned long len)
283*d83cc019SAndroid Build Coastguard Worker {
284*d83cc019SAndroid Build Coastguard Worker memcpy(dst, src, len);
285*d83cc019SAndroid Build Coastguard Worker }
286*d83cc019SAndroid Build Coastguard Worker
resolve_memcpy_from_wc(void)287*d83cc019SAndroid Build Coastguard Worker static void (*resolve_memcpy_from_wc(void))(void *, const void *, unsigned long)
288*d83cc019SAndroid Build Coastguard Worker {
289*d83cc019SAndroid Build Coastguard Worker if (igt_x86_features() & SSE4_1)
290*d83cc019SAndroid Build Coastguard Worker return memcpy_from_wc_sse41;
291*d83cc019SAndroid Build Coastguard Worker
292*d83cc019SAndroid Build Coastguard Worker return memcpy_from_wc;
293*d83cc019SAndroid Build Coastguard Worker }
294*d83cc019SAndroid Build Coastguard Worker
295*d83cc019SAndroid Build Coastguard Worker void igt_memcpy_from_wc(void *dst, const void *src, unsigned long len)
296*d83cc019SAndroid Build Coastguard Worker __attribute__((ifunc("resolve_memcpy_from_wc")));
297*d83cc019SAndroid Build Coastguard Worker
298*d83cc019SAndroid Build Coastguard Worker #else
igt_memcpy_from_wc(void * dst,const void * src,unsigned long len)299*d83cc019SAndroid Build Coastguard Worker void igt_memcpy_from_wc(void *dst, const void *src, unsigned long len)
300*d83cc019SAndroid Build Coastguard Worker {
301*d83cc019SAndroid Build Coastguard Worker memcpy(dst, src, len);
302*d83cc019SAndroid Build Coastguard Worker }
303*d83cc019SAndroid Build Coastguard Worker #endif
304