Rev 3727 | Rev 3729 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3727 | Rev 3728 | ||
---|---|---|---|
Line 40... | Line 40... | ||
40 | #include <limits.h> |
40 | #include <limits.h> |
41 | #include <align.h> |
41 | #include <align.h> |
42 | #include <sys/types.h> |
42 | #include <sys/types.h> |
43 | #include <malloc.h> |
43 | #include <malloc.h> |
44 | 44 | ||
45 | /* Dummy implementation of mem/ functions */ |
45 | /** Fill memory block with a constant value. */ |
46 | - | ||
47 | void *memset(void *s, int c, size_t n) |
46 | void *memset(void *dest, int b, size_t n) |
48 | { |
47 | { |
49 | char *os = s; |
48 | char *pb; |
- | 49 | unsigned long *pw; |
|
- | 50 | size_t word_size; |
|
- | 51 | size_t n_words; |
|
- | 52 | ||
- | 53 | unsigned long pattern; |
|
- | 54 | size_t i; |
|
- | 55 | size_t fill; |
|
- | 56 | ||
- | 57 | /* Fill initial segment. */ |
|
- | 58 | word_size = sizeof(unsigned long); |
|
- | 59 | fill = word_size - ((uintptr_t) dest & (word_size - 1)); |
|
- | 60 | if (fill > n) fill = n; |
|
- | 61 | ||
- | 62 | pb = dest; |
|
- | 63 | ||
- | 64 | i = fill; |
|
- | 65 | while (i-- != 0) |
|
- | 66 | *pb++ = b; |
|
- | 67 | ||
- | 68 | /* Compute remaining size. */ |
|
- | 69 | n -= fill; |
|
- | 70 | if (n == 0) return dest; |
|
- | 71 | ||
- | 72 | n_words = n / word_size; |
|
- | 73 | n = n % word_size; |
|
- | 74 | pw = (unsigned long *) pb; |
|
- | 75 | ||
- | 76 | /* Create word-sized pattern for aligned segment. */ |
|
- | 77 | pattern = 0; |
|
- | 78 | i = word_size; |
|
- | 79 | while (i-- != 0) |
|
- | 80 | pattern = (pattern << 8) | (uint8_t) b; |
|
- | 81 | ||
- | 82 | /* Fill aligned segment. */ |
|
- | 83 | i = n_words; |
|
- | 84 | while (i-- != 0) |
|
- | 85 | *pw++ = pattern; |
|
- | 86 | ||
- | 87 | pb = (char *) pw; |
|
50 | 88 | ||
- | 89 | /* Fill final segment. */ |
|
- | 90 | i = n; |
|
51 | while (n--) |
91 | while (i-- != 0) |
52 | *(os++) = c; |
92 | *pb++ = b; |
53 | 93 | ||
54 | return s; |
94 | return dest; |
55 | } |
95 | } |
56 | 96 | ||
57 | struct along { |
97 | struct along { |
58 | unsigned long n; |
98 | unsigned long n; |
59 | } __attribute__ ((packed)); |
99 | } __attribute__ ((packed)); |
Line 112... | Line 152... | ||
112 | 152 | ||
113 | srcb = src; |
153 | srcb = src; |
114 | dstb = dst; |
154 | dstb = dst; |
115 | 155 | ||
116 | i = fill; |
156 | i = fill; |
117 | while (i-- > 0) |
157 | while (i-- != 0) |
118 | *dstb++ = *srcb++; |
158 | *dstb++ = *srcb++; |
119 | 159 | ||
120 | /* Compute remaining length. */ |
160 | /* Compute remaining length. */ |
121 | 161 | ||
122 | n -= fill; |
162 | n -= fill; |
Line 130... | Line 170... | ||
130 | n_words = n / word_size; /* Number of whole words to copy. */ |
170 | n_words = n / word_size; /* Number of whole words to copy. */ |
131 | n -= n_words * word_size; /* Remaining bytes at the end. */ |
171 | n -= n_words * word_size; /* Remaining bytes at the end. */ |
132 | 172 | ||
133 | /* "Fast" copy. */ |
173 | /* "Fast" copy. */ |
134 | i = n_words; |
174 | i = n_words; |
135 | while (i-- > 0) |
175 | while (i-- != 0) |
136 | *dstw++ = *srcw++; |
176 | *dstw++ = *srcw++; |
137 | 177 | ||
138 | /* |
178 | /* |
139 | * Copy the rest. |
179 | * Copy the rest. |
140 | */ |
180 | */ |
141 | 181 | ||
142 | srcb = (const uint8_t *) srcw; |
182 | srcb = (const uint8_t *) srcw; |
143 | dstb = (uint8_t *) dstw; |
183 | dstb = (uint8_t *) dstw; |
144 | 184 | ||
145 | i = n; |
185 | i = n; |
146 | while (i-- > 0) |
186 | while (i-- != 0) |
147 | *dstb++ = *srcb++; |
187 | *dstb++ = *srcb++; |
148 | 188 | ||
149 | return dst; |
189 | return dst; |
150 | } |
190 | } |
151 | 191 |