Changeset 45f7449 in mainline
- Timestamp:
- 2013-03-31T19:46:19Z (12 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- a5057cc
- Parents:
- 582f4d28
- Files:
-
- 2 added
- 3 deleted
- 15 edited
Legend:
- Unmodified
- Added
- Removed
-
boot/arch/mips32/Makefile.inc
r582f4d28 r45f7449 50 50 endif 51 51 52 52 53 SOURCES = \ 53 54 arch/$(BARCH)/src/asm.S \ -
boot/arch/mips32/src/asm.S
r582f4d28 r45f7449 37 37 .global halt 38 38 .global jump_to_kernel 39 .global memset40 .global memcpy41 39 42 40 .section BOOTSTRAP … … 160 158 j $a0 161 159 nop 162 163 memset:164 move $v0, $a0165 beqz $a2, 0f166 addiu $t1, $a2, -1167 168 negu $t0, $a0169 andi $t0, $t0, 0x3170 sltu $v1, $a2, $t0171 bnez $v1, 1f172 andi $a1, $a1, 0xff173 174 7:175 sltiu $v1, $a2, 4176 beqz $v1, 2f177 move $v1, $v0178 179 move $t0, $a2180 181 3:182 sb $a1, 0($v1)183 addiu $v1, $v1, 1184 subu $a3, $v1, $v0185 sltu $a3, $a3, $t0186 bnez $a3, 3b187 addiu $t1, $t1, -1188 189 beq $a2, $t0, 0f190 subu $a2, $a2, $t0191 192 8:193 srl $a0, $a2, 0x2194 sll $t4, $a0, 0x2195 beqz $t4, 4f196 sll $t2, $a1, 0x10197 198 sll $t3, $a1, 0x8199 or $t3, $a1, $t3200 sll $a3, $a1, 0x18201 or $t3, $t3, $t2202 or $t3, $t3, $a3203 addu $t0, $v0, $t0204 move $a3, $zero205 206 5:207 addiu $a3, $a3, 1208 sltu $t2, $a3, $a0209 sw $t3, 0($t0)210 bnez $t2, 5b211 addiu $t0, $t0, 4212 213 addu $v1, $v1, $t4214 beq $a2, $t4, 0f215 subu $t1, $t1, $t4216 217 4:218 addiu $t1, $t1, 1219 addu $t1, $v1, $t1220 sb $a1, 0($v1)221 222 6:223 addiu $v1, $v1, 1224 bnel $v1, $t1, 6b225 sb $a1, 0($v1)226 227 0:228 jr $ra229 nop230 231 1:232 j 7b233 move $t0, $a2234 235 2:236 bnez $t0, 3b237 nop238 239 j 8b240 subu $a2, $a2, $t0241 242 memcpy:243 move $t2, $a0 /* save dst */244 245 addiu $v0, $a1, 3246 li $v1, -4 /* 0xfffffffffffffffc */247 and $v0, $v0, $v1248 beq $a1, $v0, 3f249 move $t0, $a0250 251 0:252 beq $a2, $zero, 2f253 move $a3, $zero254 255 1:256 addu $v0, $a1, $a3257 lbu $a0, 0($v0)258 addu $v1, $t0, $a3259 addiu $a3, $a3, 1260 bne $a3, $a2, 1b261 sb $a0, 0($v1)262 263 2:264 jr $ra265 move $v0, $t2266 267 3:268 addiu $v0, $a0, 3269 and $v0, $v0, $v1270 bne $a0, $v0, 0b271 srl $t1, $a2, 2272 273 beq $t1, $zero, 5f274 move $a3, $zero275 276 move $a3, $zero277 move $a0, $zero278 279 4:280 addu $v0, $a1, $a0281 lw $v1, 0($v0)282 addiu $a3, $a3, 1283 addu $v0, $t0, $a0284 sw $v1, 0($v0)285 bne $a3, $t1, 4b286 addiu $a0, $a0, 4287 288 5:289 andi $a2, $a2, 0x3290 beq $a2, $zero, 2b291 nop292 293 sll $v0, $a3, 2294 addu $t1, $v0, $t0295 move $a3, $zero296 addu $t0, $v0, $a1297 298 6:299 addu $v0, $t0, $a3300 lbu $a0, 0($v0)301 addu $v1, $t1, $a3302 addiu $a3, $a3, 1303 bne $a3, $a2, 6b304 sb $a0, 0($v1)305 306 jr $ra307 move $v0, $t2 -
boot/generic/include/memstr.h
r582f4d28 r45f7449 35 35 #include <typedefs.h> 36 36 37 #define memset(dst, val, cnt) __builtin_memset((dst), (val), (cnt)) 38 #define memcpy(dst, src, cnt) __builtin_memcpy((dst), (src), (cnt)) 39 37 extern void *memcpy(void *, const void *, size_t); 38 extern void *memset(void *, int, size_t); 40 39 extern void *memmove(void *, const void *, size_t); 41 40 -
boot/generic/src/memstr.c
r582f4d28 r45f7449 29 29 #include <memstr.h> 30 30 #include <typedefs.h> 31 32 /** Move memory block without overlapping. 33 * 34 * Copy cnt bytes from src address to dst address. The source 35 * and destination memory areas cannot overlap. 36 * 37 * @param dst Destination address to copy to. 38 * @param src Source address to copy from. 39 * @param cnt Number of bytes to copy. 40 * 41 * @return Destination address. 42 * 43 */ 44 void *memcpy(void *dst, const void *src, size_t cnt) 45 { 46 uint8_t *dp = (uint8_t *) dst; 47 const uint8_t *sp = (uint8_t *) src; 48 49 while (cnt-- != 0) 50 *dp++ = *sp++; 51 52 return dst; 53 } 54 55 /** Fill block of memory. 56 * 57 * Fill cnt bytes at dst address with the value val. 58 * 59 * @param dst Destination address to fill. 60 * @param val Value to fill. 61 * @param cnt Number of bytes to fill. 62 * 63 * @return Destination address. 64 * 65 */ 66 void *memset(void *dst, int val, size_t cnt) 67 { 68 uint8_t *dp = (uint8_t *) dst; 69 70 while (cnt-- != 0) 71 *dp++ = val; 72 73 return dst; 74 } 31 75 32 76 /** Move memory block with possible overlapping. -
kernel/Makefile
r582f4d28 r45f7449 228 228 generic/src/lib/func.c \ 229 229 generic/src/lib/memstr.c \ 230 generic/src/lib/memfnc.c \ 230 231 generic/src/lib/sort.c \ 231 232 generic/src/lib/str.c \ -
kernel/arch/amd64/src/asm.S
r582f4d28 r45f7449 37 37 .global read_efer_flag 38 38 .global set_efer_flag 39 .global memset40 .global memcpy41 39 .global memcpy_from_uspace 42 40 .global memcpy_to_uspace … … 45 43 .global early_putchar 46 44 47 #define MEMSET_DST %rdi48 #define MEMSET_VAL %rsi49 #define MEMSET_SIZE %rdx50 51 45 #define MEMCPY_DST %rdi 52 46 #define MEMCPY_SRC %rsi 53 47 #define MEMCPY_SIZE %rdx 54 48 55 /* Fill memory with byte pattern 56 * 57 * This is a conventional memset(). 58 * 59 * @param MEMSET_DST Destination address. 60 * @param MEMSET_VAL Value to fill. 61 * @param MEMSET_SIZE Size. 62 * 63 * @return MEMSET_DST. 64 * 65 */ 66 memset: 67 movq MEMSET_DST, %r8 /* save %rdi */ 68 69 /* Create byte pattern */ 70 movzbl %sil, %esi /* MEMSET_VAL */ 71 movabs $0x0101010101010101, %rax 72 imulq %rsi, %rax 73 74 movq MEMSET_SIZE, %rcx 75 shrq $3, %rcx /* size / 8 */ 76 77 rep stosq /* store as much as possible word by word */ 78 79 movq MEMSET_SIZE, %rcx 80 andq $7, %rcx /* size % 8 */ 81 jz 0f 82 83 rep stosb /* store the rest byte by byte */ 84 85 0: 86 movq %r8, %rax 87 ret /* return MEMCPY_SRC, success */ 88 89 /** Copy memory from/to userspace. 49 /** 50 * Copy memory from/to userspace. 90 51 * 91 52 * This is almost conventional memcpy(). … … 102 63 * 103 64 */ 104 memcpy:105 65 memcpy_from_uspace: 106 66 memcpy_to_uspace: -
kernel/arch/ia32/src/asm.S
r582f4d28 r45f7449 38 38 .global paging_on 39 39 .global enable_l_apic_in_msr 40 .global memset41 .global memcpy42 40 .global memcpy_from_uspace 43 41 .global memcpy_from_uspace_failover_address … … 46 44 .global early_putchar 47 45 48 #define MEMSET_DST 449 #define MEMSET_VAL 850 #define MEMSET_SIZE 1251 52 46 #define MEMCPY_DST 4 53 47 #define MEMCPY_SRC 8 54 48 #define MEMCPY_SIZE 12 55 56 /* Fill memory with byte pattern57 *58 * This is a conventional memset().59 *60 * @param MEMSET_DST(%esp) Destination address.61 * @param MEMSET_VAL(%esp) Value to fill.62 * @param MEMSET_SIZE(%esp) Size.63 *64 * @return MEMSET_DST(%esp).65 *66 */67 memset:68 movl %edi, %edx /* save %edi */69 70 movl MEMSET_DST(%esp), %edi71 movl MEMSET_VAL(%esp), %ecx72 73 /* Create byte pattern */74 movb %cl, %ch75 movw %cx, %ax76 shll $16, %eax77 orw %cx, %ax78 79 movl MEMSET_SIZE(%esp), %ecx80 shrl $2, %ecx /* size / 4 */81 82 /* Write whole words */83 rep stosl84 85 movl MEMSET_SIZE(%esp), %ecx86 andl $3, %ecx /* size % 4 */87 jz 0f88 89 /* Copy the rest byte by byte */90 rep stosb91 92 0:93 94 movl %edx, %edi95 96 /* MEMSET_DST(%esp), success */97 movl MEMSET_DST(%esp), %eax98 ret99 49 100 50 /** Copy memory to/from userspace. … … 113 63 * 114 64 */ 115 memcpy:116 65 memcpy_from_uspace: 117 66 memcpy_to_uspace: -
kernel/arch/mips32/src/asm.S
r582f4d28 r45f7449 57 57 nop 58 58 59 .global memset60 .global memcpy61 59 .global memcpy_from_uspace 62 60 .global memcpy_to_uspace 63 61 .global memcpy_from_uspace_failover_address 64 62 .global memcpy_to_uspace_failover_address 65 66 memset:67 move $v0, $a068 beqz $a2, 0f69 addiu $t1, $a2, -170 71 negu $t0, $a072 andi $t0, $t0, 0x373 sltu $v1, $a2, $t074 bnez $v1, 1f75 andi $a1, $a1, 0xff76 77 7:78 sltiu $v1, $a2, 479 beqz $v1, 2f80 move $v1, $v081 82 move $t0, $a283 84 3:85 sb $a1, 0($v1)86 addiu $v1, $v1, 187 subu $a3, $v1, $v088 sltu $a3, $a3, $t089 bnez $a3, 3b90 addiu $t1, $t1, -191 92 beq $a2, $t0, 0f93 subu $a2, $a2, $t094 95 8:96 srl $a0, $a2, 0x297 sll $t4, $a0, 0x298 beqz $t4, 4f99 sll $t2, $a1, 0x10100 101 sll $t3, $a1, 0x8102 or $t3, $a1, $t3103 sll $a3, $a1, 0x18104 or $t3, $t3, $t2105 or $t3, $t3, $a3106 addu $t0, $v0, $t0107 move $a3, $zero108 109 5:110 addiu $a3, $a3, 1111 sltu $t2, $a3, $a0112 sw $t3, 0($t0)113 bnez $t2, 5b114 addiu $t0, $t0, 4115 116 addu $v1, $v1, $t4117 beq $a2, $t4, 0f118 subu $t1, $t1, $t4119 120 4:121 addiu $t1, $t1, 1122 addu $t1, $v1, $t1123 sb $a1, 0($v1)124 125 6:126 addiu $v1, $v1, 1127 bnel $v1, $t1, 6b128 sb $a1, 0($v1)129 130 0:131 jr $ra132 nop133 134 1:135 j 7b136 move $t0, $a2137 138 2:139 bnez $t0, 3b140 nop141 142 j 8b143 subu $a2, $a2, $t0144 145 memcpy:146 63 memcpy_from_uspace: 147 64 memcpy_to_uspace: -
uspace/lib/c/arch/amd64/Makefile.inc
r582f4d28 r45f7449 28 28 29 29 ARCH_SOURCES = \ 30 arch/$(UARCH)/src/asm.S \31 30 arch/$(UARCH)/src/entry.s \ 32 31 arch/$(UARCH)/src/entryjmp.s \ -
uspace/lib/c/arch/ia32/Makefile.inc
r582f4d28 r45f7449 28 28 29 29 ARCH_SOURCES = \ 30 arch/$(UARCH)/src/asm.S \31 30 arch/$(UARCH)/src/entry.S \ 32 31 arch/$(UARCH)/src/entryjmp.s \ -
uspace/lib/c/arch/mips32/Makefile.inc
r582f4d28 r45f7449 28 28 29 29 ARCH_SOURCES = \ 30 arch/$(UARCH)/src/asm.S \31 30 arch/$(UARCH)/src/entry.S \ 32 31 arch/$(UARCH)/src/entryjmp.S \ -
uspace/lib/c/arch/mips32eb/Makefile.inc
r582f4d28 r45f7449 28 28 29 29 ARCH_SOURCES = \ 30 arch/$(UARCH)/src/asm.S \31 30 arch/$(UARCH)/src/entry.S \ 32 31 arch/$(UARCH)/src/entryjmp.S \ -
uspace/lib/c/generic/mem.c
r582f4d28 r45f7449 38 38 #include <sys/types.h> 39 39 40 /** Fill memory block with a constant value. */ 41 void *memset(void *dest, int b, size_t n) 42 { 43 char *pb; 44 unsigned long *pw; 45 size_t word_size; 46 size_t n_words; 47 48 unsigned long pattern; 49 size_t i; 50 size_t fill; 51 52 /* Fill initial segment. */ 53 word_size = sizeof(unsigned long); 54 fill = word_size - ((uintptr_t) dest & (word_size - 1)); 55 if (fill > n) fill = n; 56 57 pb = dest; 58 59 i = fill; 60 while (i-- != 0) 61 *pb++ = b; 62 63 /* Compute remaining size. */ 64 n -= fill; 65 if (n == 0) return dest; 66 67 n_words = n / word_size; 68 n = n % word_size; 69 pw = (unsigned long *) pb; 70 71 /* Create word-sized pattern for aligned segment. */ 72 pattern = 0; 73 i = word_size; 74 while (i-- != 0) 75 pattern = (pattern << 8) | (uint8_t) b; 76 77 /* Fill aligned segment. */ 78 i = n_words; 79 while (i-- != 0) 80 *pw++ = pattern; 81 82 pb = (char *) pw; 83 84 /* Fill final segment. */ 85 i = n; 86 while (i-- != 0) 87 *pb++ = b; 88 89 return dest; 90 } 91 92 struct along { 93 unsigned long n; 94 } __attribute__ ((packed)); 95 96 static void *unaligned_memcpy(void *dst, const void *src, size_t n) 97 { 98 size_t i, j; 99 struct along *adst = dst; 100 const struct along *asrc = src; 101 102 for (i = 0; i < n / sizeof(unsigned long); i++) 103 adst[i].n = asrc[i].n; 104 105 for (j = 0; j < n % sizeof(unsigned long); j++) 106 ((unsigned char *) (((unsigned long *) dst) + i))[j] = 107 ((unsigned char *) (((unsigned long *) src) + i))[j]; 108 109 return (char *) dst; 110 } 111 112 /** Copy memory block. */ 113 void *memcpy(void *dst, const void *src, size_t n) 114 { 115 size_t i; 116 size_t mod, fill; 117 size_t word_size; 118 size_t n_words; 119 120 const unsigned long *srcw; 121 unsigned long *dstw; 122 const uint8_t *srcb; 123 uint8_t *dstb; 124 125 word_size = sizeof(unsigned long); 126 127 /* 128 * Are source and destination addresses congruent modulo word_size? 129 * If not, use unaligned_memcpy(). 130 */ 131 132 if (((uintptr_t) dst & (word_size - 1)) != 133 ((uintptr_t) src & (word_size - 1))) 134 return unaligned_memcpy(dst, src, n); 135 136 /* 137 * mod is the address modulo word size. fill is the length of the 138 * initial buffer segment before the first word boundary. 139 * If the buffer is very short, use unaligned_memcpy(), too. 140 */ 141 142 mod = (uintptr_t) dst & (word_size - 1); 143 fill = word_size - mod; 144 if (fill > n) fill = n; 145 146 /* Copy the initial segment. */ 147 148 srcb = src; 149 dstb = dst; 150 151 i = fill; 152 while (i-- != 0) 153 *dstb++ = *srcb++; 154 155 /* Compute remaining length. */ 156 157 n -= fill; 158 if (n == 0) return dst; 159 160 /* Pointers to aligned segment. */ 161 162 dstw = (unsigned long *) dstb; 163 srcw = (const unsigned long *) srcb; 164 165 n_words = n / word_size; /* Number of whole words to copy. */ 166 n -= n_words * word_size; /* Remaining bytes at the end. */ 167 168 /* "Fast" copy. */ 169 i = n_words; 170 while (i-- != 0) 171 *dstw++ = *srcw++; 172 173 /* 174 * Copy the rest. 175 */ 176 177 srcb = (const uint8_t *) srcw; 178 dstb = (uint8_t *) dstw; 179 180 i = n; 181 while (i-- != 0) 182 *dstb++ = *srcb++; 183 184 return dst; 185 } 186 40 187 /** Move memory block with possible overlapping. */ 41 188 void *memmove(void *dst, const void *src, size_t n) -
uspace/lib/c/include/mem.h
r582f4d28 r45f7449 38 38 #include <sys/types.h> 39 39 40 #define memset(dst, val, cnt) __builtin_memset((dst), (val), (cnt))41 #define memcpy(dst, src, cnt) __builtin_memcpy((dst), (src), (cnt))42 43 40 #define bzero(ptr, len) memset((ptr), 0, (len)) 44 41 42 extern void *memset(void *, int, size_t); 43 extern void *memcpy(void *, const void *, size_t); 45 44 extern void *memmove(void *, const void *, size_t); 45 46 46 extern int bcmp(const void *, const void *, size_t); 47 47 -
uspace/lib/posix/include/posix/string.h
r582f4d28 r45f7449 60 60 * forward declarations ought to be enough. 61 61 */ 62 63 62 /* From str.h. */ 64 65 extern char *strtok_r(char *, const char *, char **); 66 extern char *strtok(char *, const char *); 63 extern char * strtok_r(char *, const char *, char **); 64 extern char * strtok(char *, const char *); 67 65 68 66 /* From mem.h */ 67 #define bzero(ptr, len) memset((ptr), 0, (len)) 68 extern void *memset(void *, int, size_t); 69 extern void *memcpy(void *, const void *, size_t); 70 extern void *memmove(void *, const void *, size_t); 69 71 70 #define memset(dst, val, cnt) __builtin_memset((dst), (val), (cnt))71 #define memcpy(dst, src, cnt) __builtin_memcpy((dst), (src), (cnt))72 73 #define bzero(ptr, len) memset((ptr), 0, (len))74 75 extern void *memmove(void *, const void *, size_t);76 extern int bcmp(const void *, const void *, size_t);77 72 78 73 /* Copying and Concatenation */
Note:
See TracChangeset
for help on using the changeset viewer.