void * vmx_pcalloc(void) { char *pptr; kern_return_t ret; ret = kmem_alloc_kobject(kernel_map, (vm_offset_t *)&pptr, PAGE_SIZE, VM_KERN_MEMORY_OSFMK); if (ret != KERN_SUCCESS) return (NULL); bzero(pptr, PAGE_SIZE); return (pptr); }
/* Copy in an update */ static int copyin_update(uint64_t inaddr) { struct intel_ucupdate update_header; struct intel_ucupdate *update; vm_size_t size; kern_return_t ret; int error; /* Copy in enough header to peek at the size */ error = copyin((user_addr_t)inaddr, (void *)&update_header, sizeof(update_header)); if (error) return error; /* Get the actual, alleged size */ size = update_header.total_size; /* huge bogus piece of data that somehow made it through? */ if (size >= 1024 * 1024) return ENOMEM; /* Old microcodes? */ if (size == 0) size = 2048; /* default update size; see SDM */ /* * create the buffer for the update * It need only be aligned to 16-bytes, according to the SDM. * This also wires it down */ ret = kmem_alloc_kobject(kernel_map, (vm_offset_t *)&update, size, VM_KERN_MEMORY_OSFMK); if (ret != KERN_SUCCESS) return ENOMEM; /* Copy it in */ error = copyin((user_addr_t)inaddr, (void*)update, size); if (error) { kmem_free(kernel_map, (vm_offset_t)update, size); return error; } global_update = update; return 0; }
void bcopytest(void) { void *srcptr, *snkptr, *asrc, *asnk; int bsrc, bsnk, size, i, ret, n; volatile int dbg = 0; unsigned int *sink, *source; kern_return_t retr; db_printf("bcopy test\n"); retr = kmem_alloc_kobject(kernel_map, (vm_offset_t *)&sink, (1024*1024)+4096); /* Get sink area */ if(retr != KERN_SUCCESS) { /* Did we find any memory at all? */ panic("bcopytest: Whoops... no memory for sink\n"); } retr = kmem_alloc_kobject(kernel_map, (vm_offset_t *)&source, (1024*1024)+4096); /* Get source area */ if(retr != KERN_SUCCESS) { /* Did we find any memory at all? */ panic("bcopytest: Whoops... no memory for source\n"); } db_printf("Source at %08X; Sink at %08X\n", source, sink); srcptr = (void *)&source[0]; snkptr = (void *)&sink[0]; #if 1 db_printf("Testing non-overlap case; source bndry = 0 to 7F; sink bndry = 0 - 7F; lgn = 1 to 256\n"); for(bsrc = 0; bsrc < 128; bsrc++) { /* Step the source by 1 */ for(bsnk = 0; bsnk < 128; bsnk++) { /* Step the sink by 1 */ for(size = 1; size <= 256; size++) { /* Step the size by 1 */ clrarea(source, sink); /* Reset source and clear sink */ if(size == 255) { dbg = 99; } if(tstcopy((void *)((unsigned int)srcptr + bsrc), (void *)((unsigned int)snkptr + bsnk), size)) { db_printf("Test failed; source = %02X; sink = %02X; length = %d\n", bsrc, bsnk, size); db_printf("failed\n"); } } } } db_printf("Non-overlap test complete\n"); #endif #if 1 db_printf("Testing overlap\n"); for(bsrc = 1; bsrc < 128; bsrc++) { /* Step the source by 1 */ for(bsnk = 0; bsnk < 128; bsnk++) { /* Step the sink by 1 */ for(size = 1; size <= 256; size++) { /* Step the size by 1 */ clrarea2(source, sink); /* Reset source and clear sink */ if(bsrc < bsnk) { dbg = 88; } else { dbg = 99; } if(tstcopy2((void *)((unsigned int)srcptr + bsrc), (void *)((unsigned int)srcptr + bsnk), size)) { db_printf("Test failed; source = %02X; sink = %02X; length = %d\n", bsrc, bsnk, size); db_printf("failed\n"); } } } } db_printf("Overlap test complete\n"); #endif #if 1 db_printf("Starting exhaustive tests\n"); for(i = 0; i < 262144 * 4; i++) { /* Set all 1MB of source and dest to known pattern */ ((unsigned char *)srcptr)[i] = i % patper; /* Make a non-power-of-two length pattern */ ((unsigned char *)snkptr)[i] = i % patper; /* Make a non-power-of-two length pattern */ } db_printf("No overlap; source < sink, length = 0 to 1023\nSource ="); #if 1 for(bsrc = 0; bsrc < 128; bsrc++) { /* Step source by 1 */ db_printf(" %3d", bsrc); /* Show where we're at */ for(bsnk = 0; bsnk < 128; bsnk++) { /* Step sink by 1 */ for(size = 0; size < 1025; size++) { /* Step size from 0 to 1023 */ asrc = (void *)((unsigned int)srcptr + bsrc); /* Start byte address */ asnk = (void *)((unsigned int)srcptr + bsnk + 2048); /* End byte address */ ret = tstcopy5(asrc, asnk, size); /* Copy and validate */ if(ret) { db_printf("\nTest failed - source = %3d, sink = %3d size = %d\n", bsrc, bsnk, size); db_printf("failed\n"); } } } } #endif db_printf("\n"); db_printf("No overlap; source > sink, length = 0 to 1023\nSource ="); #if 1 for(bsrc = 0; bsrc < 128; bsrc++) { /* Step source by 1 */ db_printf(" %3d", bsrc); /* Show where we're at */ for(bsnk = 0; bsnk < 128; bsnk++) { /* Step sink by 1 */ for(size = 0; size < 1025; size++) { /* Step size from 0 to 1023 */ asrc = (void *)((unsigned int)srcptr + bsrc + 2048); /* Start byte address */ asnk = (void *)((unsigned int)srcptr + bsnk); /* End byte address */ ret = tstcopy5(asrc, asnk, size); /* Copy and validate */ if(ret) { db_printf("\nTest failed - source = %3d, sink = %3d size = %d\n", bsrc, bsnk, size); db_printf("failed\n"); } } } } #endif db_printf("\n"); db_printf("Overlap; source = sink + N (N = 0 to 127), length = 0 to 1023\nN ="); #if 1 for(n = 0; n < 128; n++) { /* Step n by 1 */ db_printf(" %3d", n); /* Show where we're at */ for(bsnk = 0; bsnk < 128; bsnk++) { /* Step sink by 1 */ for(size = 0; size < 1025; size++) { /* Step size from 0 to 1023 */ asrc = (void *)((unsigned int)srcptr + bsnk + n); /* Start byte address */ asnk = (void *)((unsigned int)srcptr + bsnk); /* End byte address */ ret = tstcopy5(asrc, asnk, size); /* Copy and validate */ if(ret) { db_printf("\nTest failed - source = %3d, sink = %3d size = %d\n", bsrc, bsnk, size); db_printf("failed\n"); } } } } #endif db_printf("\n"); db_printf("Overlap; source + N = sink (N = 0 to 127), length = 0 to 1023\nSource ="); #if 1 for(bsrc = 0; bsrc < 128; bsrc++) { /* Step source by 1 */ db_printf(" %3d", bsrc); /* Show where we're at */ for(n = 0; n < 128; n++) { /* Step N by 1 */ for(size = 0; size < 1025; size++) { /* Step size from 0 to 1023 */ asrc = (void *)((unsigned int)srcptr + bsnk); /* Start byte address */ asnk = (void *)((unsigned int)srcptr + bsnk + n); /* End byte address */ ret = tstcopy5(asrc, asnk, size); /* Copy and validate */ if(ret) { db_printf("\nTest failed - source = %3d, n = %3d size = %d\n", bsrc, n, size); db_printf("failed\n"); } } } } #endif db_printf("\n"); db_printf("Overlap; source = sink + N + 128 (N = 0 to 127), length = 0 to 1023\nN ="); #if 1 for(n = 0; n < 128; n++) { /* Step n by 1 */ db_printf(" %3d", n); /* Show where we're at */ for(bsnk = 0; bsnk < 128; bsnk++) { /* Step sink by 1 */ for(size = 0; size < 1025; size++) { /* Step size from 0 to 1023 */ asrc = (void *)((unsigned int)srcptr + bsnk + n + 128); /* Start byte address */ asnk = (void *)((unsigned int)srcptr + bsnk); /* End byte address */ ret = tstcopy5(asrc, asnk, size); /* Copy and validate */ if(ret) { db_printf("\nTest failed - source = %3d, sink = %3d size = %d\n", bsrc, bsnk, size); db_printf("failed\n"); } } } } #endif db_printf("\n"); db_printf("Overlap; source + N + 128 = sink (N = 0 to 127), length = 0 to 1023\nSource ="); #if 1 for(bsrc = 0; bsrc < 128; bsrc++) { /* Step source by 1 */ db_printf(" %3d", bsrc); /* Show where we're at */ for(n = 0; n < 128; n++) { /* Step N by 1 */ for(size = 0; size < 1025; size++) { /* Step size from 0 to 1023 */ asrc = (void *)((unsigned int)srcptr + bsnk); /* Start byte address */ asnk = (void *)((unsigned int)srcptr + bsnk + n + 128); /* End byte address */ ret = tstcopy5(asrc, asnk, size); /* Copy and validate */ if(ret) { db_printf("\nTest failed - source = %3d, n = %3d size = %d\n", bsrc, n, size); db_printf("failed\n"); } } } } #endif db_printf("\n"); db_printf("Overlap; source = sink + N + 256 (N = 0 to 127), length = 0 to 1023\nSource ="); #if 1 for(n = 0; n < 128; n++) { /* Step n by 1 */ db_printf(" %3d", n); /* Show where we're at */ for(bsnk = 0; bsnk < 128; bsnk++) { /* Step sink by 1 */ for(size = 0; size < 1025; size++) { /* Step size from 0 to 1023 */ asrc = (void *)((unsigned int)srcptr + bsnk + n + 256); /* Start byte address */ asnk = (void *)((unsigned int)srcptr + bsnk); /* End byte address */ ret = tstcopy5(asrc, asnk, size); /* Copy and validate */ if(ret) { db_printf("\nTest failed - source = %3d, sink = %3d size = %d\n", bsrc, bsnk, size); db_printf("failed\n"); } } } } #endif db_printf("\n"); db_printf("Overlap; source + N + 256 = sink (N = 0 to 127), length = 0 to 1023\nSource ="); #if 1 for(bsrc = 0; bsrc < 128; bsrc++) { /* Step source by 1 */ db_printf(" %3d", bsrc); /* Show where we're at */ for(n = 0; n < 128; n++) { /* Step N by 1 */ for(size = 0; size < 1025; size++) { /* Step size from 0 to 1023 */ asrc = (void *)((unsigned int)srcptr + bsnk); /* Start byte address */ asnk = (void *)((unsigned int)srcptr + bsnk + n + 256); /* End byte address */ ret = tstcopy5(asrc, asnk, size); /* Copy and validate */ if(ret) { db_printf("\nTest failed - source = %3d, n = %3d size = %d\n", bsrc, n, size); db_printf("failed\n"); } } } } #endif #endif #if 0 iterations = 1000; tottime = 0; totbytes = 0; db_printf("Random test starting; iterations = %d\n", iterations); for(i = 0; i < 262144 * 4; i++) { /* Clear all 2MB of source (and dest for this test) */ ((unsigned char *)srcptr)[i] = i & 255; } for(i = 0; i < iterations; i++) { /* Test until we are done */ makerand = rand() << 16 | (rand() & 0x0000FFFF); bsrc = makerand & 0x0007FFFF; /* Generate source */ makerand = rand() << 16 | (rand() & 0x0000FFFF); bsnk = makerand & 0x0007FFFF; /* Generate sink */ makerand = rand() << 16 | (rand() & 0x0000FFFF); size = makerand & 0x0007FFFF; /* Generate length */ #if 1 db_printf("rt %7d: src = %08X; sink = %08X; length = %7d\n", i, ((unsigned int)srcptr + bsrc), ((unsigned int)srcptr + bsnk), size); #endif asrc = (void *)((unsigned int)srcptr + bsrc); asnk = (void *)((unsigned int)srcptr + bsnk); timein = gtick(); ret = tstcopy3(asrc, asnk, size); timeout = gtick(); if(ret) { db_printf("Test failed; source = %02X; sink = %02X; length = %d\n", bsrc, bsnk, size); db_printf("failed\n"); } ticks = timeout - timein; /* Get time in ticks for copy */ tottime += ticks; totbytes += size; rate = (double) totbytes / (double)tottime; /* Get bytes per tick */ // rate = rate * (double)11250000.0; /* Bytes per second */ // rate = rate * (double)16500000.0; /* Bytes per second */ rate = rate * (double)tbfreq; /* Bytes per second */ rate = rate / (double)1000000.0; /* Get number of MBs */ db_printf("Total bytes = %lld; total time = %lld; rate = %f10\n", totbytes, tottime, rate); } #endif #if 0 iterations = 100; tottime = 0; totbytes = 0; db_printf("Random test starting; iterations = %d\n", iterations); for(i = 0; i < 262144 * 4; i++) { /* Clear all 2MB of source (and dest for this test) */ ((unsigned char *)srcptr)[i] = i & 255; } for(i = 0; i < iterations; i++) { /* Test until we are done */ makerand = rand() << 16 | (rand() & 0x0000FFFF); bsrc = makerand & 0x0007FFFF; /* Generate source */ makerand = rand() << 16 | (rand() & 0x0000FFFF); bsnk = makerand & 0x0007FFFF; /* Generate sink */ makerand = rand() << 16 | (rand() & 0x0000FFFF); size = makerand & 0x0007FFFF; /* Generate length */ #if 1 db_printf("rt %7d: src = %08X; sink = %08X; length = %7d\n", i, ((unsigned int)srcptr + bsrc), ((unsigned int)srcptr + bsnk), size); #endif asrc = (void *)((unsigned int)srcptr + bsrc); asnk = (void *)((unsigned int)srcptr + bsnk); timein = gtick(); ret = tstcopy4(asrc, asnk, size); timeout = gtick(); if(ret) { db_printf("Test failed; source = %02X; sink = %02X; length = %d\n", bsrc, bsnk, size); db_printf("failed\n"); } ticks = timeout - timein; /* Get time in ticks for copy */ tottime += ticks; totbytes += size; rate = (double) totbytes / (double)tottime; /* Get bytes per tick */ // rate = rate * (double)11250000.0; /* Bytes per second */ // rate = rate * (double)16500000.0; /* Bytes per second */ rate = rate * (double)tbfreq; /* Bytes per second */ rate = rate / (double)1000000.0; /* Get number of MBs */ db_printf("Total bytes = %lld; total time = %lld; rate = %f10\n", totbytes, tottime, rate); } #endif #if 0 iterations = 100; tottime = 0; totbytes = 0; db_printf("Random test starting; iterations = %d\n", iterations); for(i = 0; i < 262144 * 4; i++) { /* Clear all 2MB of source (and dest for this test) */ ((unsigned char *)srcptr)[i] = i & 255; } for(i = 0; i < iterations; i++) { /* Test until we are done */ makerand = rand() << 16 | (rand() & 0x0000FFFF); bsrc = makerand & 0x0007FFFF; /* Generate source */ makerand = rand() << 16 | (rand() & 0x0000FFFF); bsnk = makerand & 0x0007FFFF; /* Generate sink */ makerand = rand() << 16 | (rand() & 0x0000FFFF); size = makerand & 0x0007FFFF; /* Generate length */ #if 1 db_printf("rt %7d: src = %08X; sink = %08X; length = %7d\n", i, ((unsigned int)srcptr + bsrc), ((unsigned int)srcptr + bsnk), size); #endif asrc = (void *)((unsigned int)srcptr + bsrc); asnk = (void *)((unsigned int)srcptr + bsnk); timein = gtick(); ret = dumbcopy(asrc, asnk, size); timeout = gtick(); if(ret) { db_printf("Test failed; source = %02X; sink = %02X; length = %d\n", bsrc, bsnk, size); db_printf("failed\n"); } ticks = timeout - timein; /* Get time in ticks for copy */ tottime += ticks; totbytes += size; rate = (double) totbytes / (double)tottime; /* Get bytes per tick */ rate = rate * (double)tbfreq; /* Bytes per second */ rate = rate / (double)1000000.0; /* Get number of MBs */ db_printf("Total bytes = %lld; total time = %lld; rate = %f10\n", totbytes, tottime, rate); } #endif kmem_free(kernel_map, (vm_offset_t) sink, (1024*1024)+4096); /* Release this mapping block */ kmem_free(kernel_map, (vm_offset_t) source, (1024*1024)+4096); /* Release this mapping block */ if(dbg == 22) db_printf("Gabbagoogoo\n"); return; }