1 #include <string.h>
2 #include <stdint.h>
3 #if defined(__LITEOS__) && defined(LOSCFG_BASE_MEM_NODE_SIZE_CHECK)
4 #include "los_memory.h"
__memset_check(void * dest,unsigned int nodeLength)5 static int __memset_check(void *dest, unsigned int nodeLength)
6 {
7 unsigned int ret;
8 unsigned int totalSize = 0;
9 unsigned int availSize = 0;
10 unsigned char *pool = m_aucSysMem1;
11
12 ret = LOS_MemNodeSizeCheck(pool, dest, &totalSize, &availSize);
13 if ((ret == 0) && (nodeLength > availSize)) {
14 return -1;
15 }
16
17 return 0;
18 }
19 #endif
20
memset(void * dest,int c,size_t n)21 void *memset(void *dest, int c, size_t n)
22 {
23 typedef uint32_t __attribute__((__may_alias__)) u32;
24 typedef uint64_t __attribute__((__may_alias__)) u64;
25
26 unsigned char *s = dest;
27
28 if (!n) {
29 return dest;
30 }
31
32 s[0] = c;
33 s[n-1] = c;
34
35 if (n <= 2) { // 2 bytes mem
36 return dest;
37 }
38
39 s[1] = c;
40 s[2] = c;
41 s[n-2] = c;
42 s[n-3] = c;
43
44 if (n <= 6) { // 6 bytes mem
45 return dest;
46 }
47
48 s[3] = c;
49 s[n-4] = c;
50
51 if (n <= 8) { // 8 bytes mem
52 return dest;
53 }
54
55 size_t k = -(uintptr_t)s & 3; // 3 : 4-byte boundary process
56 s += k;
57 n -= k;
58 n &= -4;
59
60 u32 c32 = ((u32)-1) / 255 * (unsigned char)c;
61
62 *(u32 *)(s + 0) = c32;
63 *(u32 *)(s + n - 4) = c32;
64 if (n <= 8) {
65 return dest;
66 }
67
68 *(u32 *)(s + 4) = c32;
69 *(u32 *)(s + 8) = c32;
70 *(u32 *)(s + n - 12) = c32;
71 *(u32 *)(s + n - 8) = c32;
72
73 if (n <= 24) { // 24 bytes mem
74 return dest;
75 }
76
77 *(u32 *)(s + 12) = c32;
78 *(u32 *)(s + 16) = c32;
79 *(u32 *)(s + 20) = c32;
80 *(u32 *)(s + 24) = c32;
81 *(u32 *)(s + n - 28) = c32;
82 *(u32 *)(s + n - 24) = c32;
83 *(u32 *)(s + n - 20) = c32;
84 *(u32 *)(s + n - 16) = c32;
85
86 k = 24 + ((uintptr_t)s & 4);
87 s += k;
88 n -= k;
89
90 u64 c64 = c32 | ((u64)c32 << 32);
91 for (; n >= 32; n -= 32, s += 32) {
92 *(u64 *)(s + 0) = c64;
93 *(u64 *)(s + 8) = c64;
94 *(u64 *)(s + 16) = c64;
95 *(u64 *)(s + 24) = c64;
96 }
97
98 return dest;
99 }
100