1#include <debug.h> 2#include <mach_kgdb.h> 3#include <mach_vm_debug.h> 4#include <db_machine_commands.h> 5 6#include <kern/thread.h> 7#include <mach/vm_attributes.h> 8#include <mach/vm_param.h> 9#include <vm/vm_kern.h> 10#include <vm/vm_map.h> 11#include <vm/vm_page.h> 12#include <kern/spl.h> 13 14#include <kern/misc_protos.h> 15#include <ppc/exception.h> 16#include <ppc/misc_protos.h> 17#include <ppc/proc_reg.h> 18 19#include <vm/pmap.h> 20#include <ppc/pmap.h> 21#include <ppc/mem.h> 22 23#include <ppc/new_screen.h> 24#include <ppc/Firmware.h> 25#include <ppc/mappings.h> 26#include <ddb/db_output.h> 27 28#include <console/video_console.h> /* (TEST/DEBUG) */ 29 30#define patper 253 31 32 33int main(void); 34void clrarea(unsigned int *source, unsigned int *sink); 35int tstcopy(void *src, void *snk, unsigned int lgn); 36void clrarea2(unsigned int *source, unsigned int *sink); 37int tstcopy2(void *src, void *snk, unsigned int lgn); 38int tstcopy3(void *src, void *snk, unsigned int lgn); 39int tstcopy4(void *src, void *snk, unsigned int lgn); 40int tstcopy5(void *src, void *snk, unsigned int lgn); 41int dumbcopy(void *src, void *snk, unsigned int lgn); 42 43 44unsigned int gtick(void); 45 46 47void bcopytest(void); 48void bcopytest(void) { 49 50 void *srcptr, *snkptr, *asrc, *asnk; 51 int bsrc, bsnk, size, i, ret, n; 52 volatile int dbg = 0; 53 unsigned int *sink, *source; 54 55 kern_return_t retr; 56 57 db_printf("bcopy test\n"); 58 59 retr = kmem_alloc_wired(kernel_map, (vm_offset_t *)&sink, (1024*1024)+4096); /* Get sink area */ 60 if(retr != KERN_SUCCESS) { /* Did we find any memory at all? */ 61 panic("bcopytest: Whoops... no memory for sink\n"); 62 } 63 64 retr = kmem_alloc_wired(kernel_map, (vm_offset_t *)&source, (1024*1024)+4096); /* Get source area */ 65 if(retr != KERN_SUCCESS) { /* Did we find any memory at all? */ 66 panic("bcopytest: Whoops... no memory for source\n"); 67 } 68 69 db_printf("Source at %08X; Sink at %08X\n", source, sink); 70 71 srcptr = (void *)&source[0]; 72 snkptr = (void *)&sink[0]; 73 74#if 1 75 db_printf("Testing non-overlap case; source bndry = 0 to 7F; sink bndry = 0 - 7F; lgn = 1 to 256\n"); 76 for(bsrc = 0; bsrc < 128; bsrc++) { /* Step the source by 1 */ 77 for(bsnk = 0; bsnk < 128; bsnk++) { /* Step the sink by 1 */ 78 for(size = 1; size <= 256; size++) { /* Step the size by 1 */ 79 80 clrarea(source, sink); /* Reset source and clear sink */ 81 if(size == 255) { 82 dbg = 99; 83 } 84 if(tstcopy((void *)((unsigned int)srcptr + bsrc), (void *)((unsigned int)snkptr + bsnk), size)) { 85 db_printf("Test failed; source = %02X; sink = %02X; length = %d\n", bsrc, bsnk, size); 86 db_printf("failed\n"); 87 } 88 } 89 } 90 } 91 db_printf("Non-overlap test complete\n"); 92#endif 93 94 95#if 1 96 db_printf("Testing overlap\n"); 97 for(bsrc = 1; bsrc < 128; bsrc++) { /* Step the source by 1 */ 98 for(bsnk = 0; bsnk < 128; bsnk++) { /* Step the sink by 1 */ 99 for(size = 1; size <= 256; size++) { /* Step the size by 1 */ 100 101 clrarea2(source, sink); /* Reset source and clear sink */ 102 if(bsrc < bsnk) { 103 dbg = 88; 104 } 105 else { 106 dbg = 99; 107 } 108 if(tstcopy2((void *)((unsigned int)srcptr + bsrc), (void *)((unsigned int)srcptr + bsnk), size)) { 109 db_printf("Test failed; source = %02X; sink = %02X; length = %d\n", bsrc, bsnk, size); 110 db_printf("failed\n"); 111 } 112 } 113 } 114 } 115 db_printf("Overlap test complete\n"); 116#endif 117 118#if 1 119 db_printf("Starting exhaustive tests\n"); 120 for(i = 0; i < 262144 * 4; i++) { /* Set all 1MB of source and dest to known pattern */ 121 ((unsigned char *)srcptr)[i] = i % patper; /* Make a non-power-of-two length pattern */ 122 ((unsigned char *)snkptr)[i] = i % patper; /* Make a non-power-of-two length pattern */ 123 } 124 125 db_printf("No overlap; source < sink, length = 0 to 1023\nSource ="); 126 127#if 1 128 for(bsrc = 0; bsrc < 128; bsrc++) { /* Step source by 1 */ 129 db_printf(" %3d", bsrc); /* Show where we're at */ 130 for(bsnk = 0; bsnk < 128; bsnk++) { /* Step sink by 1 */ 131 for(size = 0; size < 1025; size++) { /* Step size from 0 to 1023 */ 132 asrc = (void *)((unsigned int)srcptr + bsrc); /* Start byte address */ 133 asnk = (void *)((unsigned int)srcptr + bsnk + 2048); /* End byte address */ 134 ret = tstcopy5(asrc, asnk, size); /* Copy and validate */ 135 if(ret) { 136 db_printf("\nTest failed - source = %3d, sink = %3d size = %d\n", bsrc, bsnk, size); 137 db_printf("failed\n"); 138 } 139 } 140 } 141 } 142#endif 143 144 db_printf("\n"); 145 db_printf("No overlap; source > sink, length = 0 to 1023\nSource ="); 146 147#if 1 148 for(bsrc = 0; bsrc < 128; bsrc++) { /* Step source by 1 */ 149 db_printf(" %3d", bsrc); /* Show where we're at */ 150 for(bsnk = 0; bsnk < 128; bsnk++) { /* Step sink by 1 */ 151 for(size = 0; size < 1025; size++) { /* Step size from 0 to 1023 */ 152 asrc = (void *)((unsigned int)srcptr + bsrc + 2048); /* Start byte address */ 153 asnk = (void *)((unsigned int)srcptr + bsnk); /* End byte address */ 154 ret = tstcopy5(asrc, asnk, size); /* Copy and validate */ 155 if(ret) { 156 db_printf("\nTest failed - source = %3d, sink = %3d size = %d\n", bsrc, bsnk, size); 157 db_printf("failed\n"); 158 } 159 } 160 } 161 } 162#endif 163 164 db_printf("\n"); 165 db_printf("Overlap; source = sink + N (N = 0 to 127), length = 0 to 1023\nN ="); 166 167#if 1 168 for(n = 0; n < 128; n++) { /* Step n by 1 */ 169 db_printf(" %3d", n); /* Show where we're at */ 170 for(bsnk = 0; bsnk < 128; bsnk++) { /* Step sink by 1 */ 171 for(size = 0; size < 1025; size++) { /* Step size from 0 to 1023 */ 172 asrc = (void *)((unsigned int)srcptr + bsnk + n); /* Start byte address */ 173 asnk = (void *)((unsigned int)srcptr + bsnk); /* End byte address */ 174 ret = tstcopy5(asrc, asnk, size); /* Copy and validate */ 175 if(ret) { 176 db_printf("\nTest failed - source = %3d, sink = %3d size = %d\n", bsrc, bsnk, size); 177 db_printf("failed\n"); 178 } 179 } 180 } 181 } 182#endif 183 184 db_printf("\n"); 185 db_printf("Overlap; source + N = sink (N = 0 to 127), length = 0 to 1023\nSource ="); 186 187#if 1 188 for(bsrc = 0; bsrc < 128; bsrc++) { /* Step source by 1 */ 189 db_printf(" %3d", bsrc); /* Show where we're at */ 190 for(n = 0; n < 128; n++) { /* Step N by 1 */ 191 for(size = 0; size < 1025; size++) { /* Step size from 0 to 1023 */ 192 asrc = (void *)((unsigned int)srcptr + bsnk); /* Start byte address */ 193 asnk = (void *)((unsigned int)srcptr + bsnk + n); /* End byte address */ 194 ret = tstcopy5(asrc, asnk, size); /* Copy and validate */ 195 if(ret) { 196 db_printf("\nTest failed - source = %3d, n = %3d size = %d\n", bsrc, n, size); 197 db_printf("failed\n"); 198 } 199 } 200 } 201 } 202#endif 203 204 205 db_printf("\n"); 206 db_printf("Overlap; source = sink + N + 128 (N = 0 to 127), length = 0 to 1023\nN ="); 207 208#if 1 209 for(n = 0; n < 128; n++) { /* Step n by 1 */ 210 db_printf(" %3d", n); /* Show where we're at */ 211 for(bsnk = 0; bsnk < 128; bsnk++) { /* Step sink by 1 */ 212 for(size = 0; size < 1025; size++) { /* Step size from 0 to 1023 */ 213 asrc = (void *)((unsigned int)srcptr + bsnk + n + 128); /* Start byte address */ 214 asnk = (void *)((unsigned int)srcptr + bsnk); /* End byte address */ 215 ret = tstcopy5(asrc, asnk, size); /* Copy and validate */ 216 if(ret) { 217 db_printf("\nTest failed - source = %3d, sink = %3d size = %d\n", bsrc, bsnk, size); 218 db_printf("failed\n"); 219 } 220 } 221 } 222 } 223#endif 224 225 db_printf("\n"); 226 db_printf("Overlap; source + N + 128 = sink (N = 0 to 127), length = 0 to 1023\nSource ="); 227 228#if 1 229 for(bsrc = 0; bsrc < 128; bsrc++) { /* Step source by 1 */ 230 db_printf(" %3d", bsrc); /* Show where we're at */ 231 for(n = 0; n < 128; n++) { /* Step N by 1 */ 232 for(size = 0; size < 1025; size++) { /* Step size from 0 to 1023 */ 233 asrc = (void *)((unsigned int)srcptr + bsnk); /* Start byte address */ 234 asnk = (void *)((unsigned int)srcptr + bsnk + n + 128); /* End byte address */ 235 ret = tstcopy5(asrc, asnk, size); /* Copy and validate */ 236 if(ret) { 237 db_printf("\nTest failed - source = %3d, n = %3d size = %d\n", bsrc, n, size); 238 db_printf("failed\n"); 239 } 240 } 241 } 242 } 243#endif 244 245 db_printf("\n"); 246 db_printf("Overlap; source = sink + N + 256 (N = 0 to 127), length = 0 to 1023\nSource ="); 247 248#if 1 249 for(n = 0; n < 128; n++) { /* Step n by 1 */ 250 db_printf(" %3d", n); /* Show where we're at */ 251 for(bsnk = 0; bsnk < 128; bsnk++) { /* Step sink by 1 */ 252 for(size = 0; size < 1025; size++) { /* Step size from 0 to 1023 */ 253 asrc = (void *)((unsigned int)srcptr + bsnk + n + 256); /* Start byte address */ 254 asnk = (void *)((unsigned int)srcptr + bsnk); /* End byte address */ 255 ret = tstcopy5(asrc, asnk, size); /* Copy and validate */ 256 if(ret) { 257 db_printf("\nTest failed - source = %3d, sink = %3d size = %d\n", bsrc, bsnk, size); 258 db_printf("failed\n"); 259 } 260 } 261 } 262 } 263#endif 264 265 db_printf("\n"); 266 db_printf("Overlap; source + N + 256 = sink (N = 0 to 127), length = 0 to 1023\nSource ="); 267#if 1 268 for(bsrc = 0; bsrc < 128; bsrc++) { /* Step source by 1 */ 269 db_printf(" %3d", bsrc); /* Show where we're at */ 270 for(n = 0; n < 128; n++) { /* Step N by 1 */ 271 for(size = 0; size < 1025; size++) { /* Step size from 0 to 1023 */ 272 asrc = (void *)((unsigned int)srcptr + bsnk); /* Start byte address */ 273 asnk = (void *)((unsigned int)srcptr + bsnk + n + 256); /* End byte address */ 274 ret = tstcopy5(asrc, asnk, size); /* Copy and validate */ 275 if(ret) { 276 db_printf("\nTest failed - source = %3d, n = %3d size = %d\n", bsrc, n, size); 277 db_printf("failed\n"); 278 } 279 } 280 } 281 } 282#endif 283 284 285 286 287 288 289#endif 290 291#if 0 292 iterations = 1000; 293 tottime = 0; 294 totbytes = 0; 295 296 db_printf("Random test starting; iterations = %d\n", iterations); 297 for(i = 0; i < 262144 * 4; i++) { /* Clear all 2MB of source (and dest for this test) */ 298 ((unsigned char *)srcptr)[i] = i & 255; 299 } 300 301 for(i = 0; i < iterations; i++) { /* Test until we are done */ 302 makerand = rand() << 16 | (rand() & 0x0000FFFF); 303 bsrc = makerand & 0x0007FFFF; /* Generate source */ 304 makerand = rand() << 16 | (rand() & 0x0000FFFF); 305 bsnk = makerand & 0x0007FFFF; /* Generate sink */ 306 makerand = rand() << 16 | (rand() & 0x0000FFFF); 307 size = makerand & 0x0007FFFF; /* Generate length */ 308#if 1 309 db_printf("rt %7d: src = %08X; sink = %08X; length = %7d\n", i, ((unsigned int)srcptr + bsrc), 310 ((unsigned int)srcptr + bsnk), size); 311#endif 312 313 asrc = (void *)((unsigned int)srcptr + bsrc); 314 asnk = (void *)((unsigned int)srcptr + bsnk); 315 timein = gtick(); 316 ret = tstcopy3(asrc, asnk, size); 317 timeout = gtick(); 318 if(ret) { 319 db_printf("Test failed; source = %02X; sink = %02X; length = %d\n", bsrc, bsnk, size); 320 db_printf("failed\n"); 321 322 } 323 ticks = timeout - timein; /* Get time in ticks for copy */ 324 tottime += ticks; 325 totbytes += size; 326 327 rate = (double) totbytes / (double)tottime; /* Get bytes per tick */ 328// rate = rate * (double)11250000.0; /* Bytes per second */ 329// rate = rate * (double)16500000.0; /* Bytes per second */ 330 rate = rate * (double)tbfreq; /* Bytes per second */ 331 rate = rate / (double)1000000.0; /* Get number of MBs */ 332 333 db_printf("Total bytes = %lld; total time = %lld; rate = %f10\n", totbytes, tottime, rate); 334 335 } 336#endif 337 338 339 340#if 0 341 iterations = 100; 342 tottime = 0; 343 totbytes = 0; 344 345 db_printf("Random test starting; iterations = %d\n", iterations); 346 for(i = 0; i < 262144 * 4; i++) { /* Clear all 2MB of source (and dest for this test) */ 347 ((unsigned char *)srcptr)[i] = i & 255; 348 } 349 350 for(i = 0; i < iterations; i++) { /* Test until we are done */ 351 makerand = rand() << 16 | (rand() & 0x0000FFFF); 352 bsrc = makerand & 0x0007FFFF; /* Generate source */ 353 makerand = rand() << 16 | (rand() & 0x0000FFFF); 354 bsnk = makerand & 0x0007FFFF; /* Generate sink */ 355 makerand = rand() << 16 | (rand() & 0x0000FFFF); 356 size = makerand & 0x0007FFFF; /* Generate length */ 357#if 1 358 db_printf("rt %7d: src = %08X; sink = %08X; length = %7d\n", i, ((unsigned int)srcptr + bsrc), 359 ((unsigned int)srcptr + bsnk), size); 360#endif 361 362 asrc = (void *)((unsigned int)srcptr + bsrc); 363 asnk = (void *)((unsigned int)srcptr + bsnk); 364 timein = gtick(); 365 ret = tstcopy4(asrc, asnk, size); 366 timeout = gtick(); 367 if(ret) { 368 db_printf("Test failed; source = %02X; sink = %02X; length = %d\n", bsrc, bsnk, size); 369 db_printf("failed\n"); 370 371 } 372 ticks = timeout - timein; /* Get time in ticks for copy */ 373 tottime += ticks; 374 totbytes += size; 375 376 rate = (double) totbytes / (double)tottime; /* Get bytes per tick */ 377// rate = rate * (double)11250000.0; /* Bytes per second */ 378// rate = rate * (double)16500000.0; /* Bytes per second */ 379 rate = rate * (double)tbfreq; /* Bytes per second */ 380 rate = rate / (double)1000000.0; /* Get number of MBs */ 381 382 db_printf("Total bytes = %lld; total time = %lld; rate = %f10\n", totbytes, tottime, rate); 383 384 } 385#endif 386 387#if 0 388 iterations = 100; 389 tottime = 0; 390 totbytes = 0; 391 392 db_printf("Random test starting; iterations = %d\n", iterations); 393 for(i = 0; i < 262144 * 4; i++) { /* Clear all 2MB of source (and dest for this test) */ 394 ((unsigned char *)srcptr)[i] = i & 255; 395 } 396 397 for(i = 0; i < iterations; i++) { /* Test until we are done */ 398 makerand = rand() << 16 | (rand() & 0x0000FFFF); 399 bsrc = makerand & 0x0007FFFF; /* Generate source */ 400 makerand = rand() << 16 | (rand() & 0x0000FFFF); 401 bsnk = makerand & 0x0007FFFF; /* Generate sink */ 402 makerand = rand() << 16 | (rand() & 0x0000FFFF); 403 size = makerand & 0x0007FFFF; /* Generate length */ 404#if 1 405 db_printf("rt %7d: src = %08X; sink = %08X; length = %7d\n", i, ((unsigned int)srcptr + bsrc), 406 ((unsigned int)srcptr + bsnk), size); 407#endif 408 409 asrc = (void *)((unsigned int)srcptr + bsrc); 410 asnk = (void *)((unsigned int)srcptr + bsnk); 411 timein = gtick(); 412 ret = dumbcopy(asrc, asnk, size); 413 timeout = gtick(); 414 if(ret) { 415 db_printf("Test failed; source = %02X; sink = %02X; length = %d\n", bsrc, bsnk, size); 416 db_printf("failed\n"); 417 418 } 419 ticks = timeout - timein; /* Get time in ticks for copy */ 420 tottime += ticks; 421 totbytes += size; 422 423 rate = (double) totbytes / (double)tottime; /* Get bytes per tick */ 424 rate = rate * (double)tbfreq; /* Bytes per second */ 425 rate = rate / (double)1000000.0; /* Get number of MBs */ 426 427 db_printf("Total bytes = %lld; total time = %lld; rate = %f10\n", totbytes, tottime, rate); 428 429 } 430#endif 431 432 kmem_free(kernel_map, (vm_offset_t) sink, (1024*1024)+4096); /* Release this mapping block */ 433 kmem_free(kernel_map, (vm_offset_t) source, (1024*1024)+4096); /* Release this mapping block */ 434 435 if(dbg == 22) db_printf("Gabbagoogoo\n"); 436 return; 437} 438 439void clrarea(unsigned int *source, unsigned int *sink) { 440 441 unsigned int i; 442 443 for(i=0; i < 1024; i++) { /* Init source & sink */ 444 source[i] = 0x55555555; /* Known pattern */ 445 sink[i] = 0xAAAAAAAA; /* Known pattern */ 446 } 447 return; 448} 449 450void 451clrarea2(unsigned int *source, __unused unsigned int *sink) 452{ 453 unsigned int i; 454 unsigned char *ss; 455 456 ss = (unsigned char *)&source[0]; 457 458 for(i=0; i < 1024 * 4; i++) { /* Init source/sink */ 459 ss[i] = i & 0xFF; /* Known pattern */ 460 } 461 return; 462} 463 464int tstcopy(void *src, void *snk, unsigned int lgn) { 465 466 unsigned int i, crap; 467 468 bcopy(src, snk, lgn); 469 470 for(i = 0; i < lgn; i++) { 471 if(((unsigned char *)snk)[i] != 0x55) { 472 crap = (unsigned int)&((unsigned char *)snk)[i]; 473 db_printf("bad copy at sink[%d] (%08X) it is %02X\n", i,crap, ((unsigned char *)snk)[i]); 474 return 1; 475 } 476 } 477 if(((unsigned char *)snk)[lgn] != 0xAA) { /* Is it right? */ 478 crap = (unsigned int)&((unsigned char *)snk)[i]; 479 db_printf("Copied too far at sink[%d] (%08X) it is %02X\n", i, crap, ((unsigned char *)snk)[lgn]); 480 return 1; 481 } 482 return 0; 483 484} 485 486int tstcopy2(void *src, void *snk, unsigned int lgn) { 487 488 unsigned int i, crap; 489 unsigned char ic, ec; 490 491 ic = ((unsigned char *)src)[0]; 492 ec = ((unsigned char *)snk)[lgn]; 493 494 bcopy(src, snk, lgn); 495 496 for(i = 0; i < lgn; i++) { 497 if(((unsigned char *)snk)[i] != ic) { 498 crap = (unsigned int)&((unsigned char *)snk)[i]; 499 db_printf("bad copy at sink[%d] (%08X) it is %02X\n", i,crap, ((unsigned char *)snk)[i]); 500 return 1; 501 } 502 ic = (ic + 1) & 0xFF; 503 } 504 505 if(((unsigned char *)snk)[lgn] != ec) { /* Is it right? */ 506 crap = (unsigned int)&((unsigned char *)snk)[i]; 507 db_printf("Copied too far at sink[%d] (%08X) it is %02X\n", i, crap, ((unsigned char *)snk)[lgn]); 508 return 1; 509 } 510 return 0; 511 512} 513 514int tstcopy3(void *src, void *snk, unsigned int lgn) { 515 516 unsigned int i, crap; 517 unsigned char ic, ec, oic; 518 519 oic = ((unsigned char *)snk)[0]; 520 ic = ((unsigned char *)src)[0]; 521 ec = ((unsigned char *)snk)[lgn]; 522 523 bcopy(src, snk, lgn); 524 525 for(i = 0; i < lgn; i++) { 526 if(((unsigned char *)snk)[i] != ic) { 527 crap = (unsigned int)&((unsigned char *)snk)[i]; 528 db_printf("bad copy at sink[%d] (%08X) it is %02X\n", i ,crap, ((unsigned char *)snk)[i]); 529 return 1; 530 } 531 ic = (ic + 1) & 0xFF; 532 } 533 534 if(((unsigned char *)snk)[lgn] != ec) { /* Is it right? */ 535 crap = (unsigned int)&((unsigned char *)snk)[i]; 536 db_printf("Copied too far at sink[%d] (%08X) it is %02X\n", i, crap, ((unsigned char *)snk)[lgn]); 537 return 1; 538 } 539 540 for(i=0; i < lgn; i++) { /* Restore pattern */ 541 ((unsigned char *)snk)[i] = oic; 542 oic = (oic + 1) & 0xFF; 543 } 544 545 return 0; 546 547} 548 549int tstcopy4(void *src, void *snk, unsigned int lgn) { 550 551 bcopy(src, snk, lgn); 552 return 0; 553 554} 555 556int tstcopy5(void *src, void *snk, unsigned int lgn) { 557 558 unsigned int i = 0, crap; 559 unsigned char ic, ec, oic, pc; 560 561 oic = ((unsigned char *)snk)[0]; /* Original first sink character */ 562 ic = ((unsigned char *)src)[0]; /* Original first source character */ 563 ec = ((unsigned char *)snk)[lgn]; /* Original character just after last sink character */ 564 pc = ((unsigned char *)snk)[-1]; /* Original character just before sink */ 565 566 bcopy(src, snk, lgn); 567 568 if(((unsigned char *)snk)[lgn] != ec) { /* Did we copy too far forward? */ 569 crap = (unsigned int)&((unsigned char *)snk)[i]; 570 db_printf("Copied too far at sink[%d] (%08X) it is %02X\n", i, crap, ((unsigned char *)snk)[lgn]); 571 return 1; 572 } 573 574 if(((unsigned char *)snk)[-1] != pc) { /* Did we copy too far backward? */ 575 crap = (unsigned int)&((unsigned char *)snk)[i]; 576 db_printf("Copied too far at sink[%d] (%08X) it is %02X\n", i, crap, ((unsigned char *)snk)[lgn]); 577 return 1; 578 } 579 580 for(i = 0; i < lgn; i++) { /* Check sink byte sequence */ 581 if(((unsigned char *)snk)[i] != ic) { 582 crap = (unsigned int)&((unsigned char *)snk)[i]; 583 db_printf("bad copy at sink[%d] (%08X) it is %02X\n", i ,crap, ((unsigned char *)snk)[i]); 584 return 1; 585 } 586 ic = (ic + 1) % patper; 587 } 588 589 for(i=0; i < lgn; i++) { /* Restore pattern */ 590 ((unsigned char *)snk)[i] = oic; 591 oic = (oic + 1) % patper; 592 } 593 594 return 0; 595 596} 597 598int dumbcopy(void *src, void *snk, unsigned int lgn) { 599 unsigned int i; 600 char *p = (char *)snk; 601 char *q = (char *)src; 602 603 for(i = 0; i < lgn; i++) { 604 *p++ = *q++; 605 } 606 return 0; 607 608} 609 610 611 612 613 614 615 616 617 618 619 620 621 622