• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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