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 | ||