Subversion Repositories HelenOS

Rev

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