313 lines
14 KiB
C
313 lines
14 KiB
C
#include <stdint.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <time.h>
|
|
#include <stdarg.h>
|
|
|
|
#include <spslr_list_link.h>
|
|
#include <spslr_randomizer.h>
|
|
|
|
void *spslr_env_malloc(spslr_u32 size) {
|
|
return malloc(size);
|
|
}
|
|
|
|
void spslr_env_free(void *ptr) {
|
|
free(ptr);
|
|
}
|
|
|
|
spslr_u32 spslr_env_random_u32(void) {
|
|
return ((spslr_u32)rand() << 16) ^ (spslr_u32)rand();
|
|
}
|
|
|
|
void __init spslr_env_debug(const char* fmt, ...) {
|
|
va_list args;
|
|
va_start(args, fmt);
|
|
|
|
fprintf(stdout, "[spslr_debug] ");
|
|
vfprintf(stdout, fmt, args);
|
|
fprintf(stdout, "\n");
|
|
|
|
va_end(args);
|
|
}
|
|
|
|
const spslr_u32 spslr_target_cnt = 1;
|
|
const spslr_u32 spslr_target_field_cnt = 196;
|
|
|
|
const struct spslr_target spslr_targets[] = {
|
|
{
|
|
.size = 2880,
|
|
.fieldcnt = 196,
|
|
.fieldoff = 0,
|
|
},
|
|
};
|
|
|
|
const struct spslr_target_field spslr_target_fields[] = {
|
|
{ .offset = 0, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 8, .size = 4, .alignment = 4, .flags = 0 },
|
|
{ .offset = 12, .size = 4, .alignment = 4, .flags = 0 },
|
|
{ .offset = 16, .size = 4, .alignment = 4, .flags = 0 },
|
|
{ .offset = 20, .size = 4, .alignment = 4, .flags = 0 },
|
|
{ .offset = 24, .size = 16, .alignment = 8, .flags = 0 },
|
|
{ .offset = 40, .size = 4, .alignment = 4, .flags = 0 },
|
|
{ .offset = 48, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 56, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 64, .size = 4, .alignment = 4, .flags = 0 },
|
|
{ .offset = 68, .size = 4, .alignment = 4, .flags = 0 },
|
|
{ .offset = 72, .size = 4, .alignment = 4, .flags = 0 },
|
|
{ .offset = 76, .size = 4, .alignment = 4, .flags = 0 },
|
|
{ .offset = 80, .size = 4, .alignment = 4, .flags = 0 },
|
|
{ .offset = 84, .size = 4, .alignment = 4, .flags = 0 },
|
|
{ .offset = 88, .size = 4, .alignment = 4, .flags = 0 },
|
|
{ .offset = 128, .size = 256, .alignment = 64, .flags = 1 },
|
|
{ .offset = 384, .size = 48, .alignment = 8, .flags = 1 },
|
|
{ .offset = 432, .size = 248, .alignment = 8, .flags = 0 },
|
|
{ .offset = 680, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 688, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 696, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 704, .size = 256, .alignment = 64, .flags = 0 },
|
|
{ .offset = 960, .size = 4, .alignment = 4, .flags = 0 },
|
|
{ .offset = 964, .size = 4, .alignment = 4, .flags = 0 },
|
|
{ .offset = 968, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 976, .size = 4, .alignment = 4, .flags = 0 },
|
|
{ .offset = 984, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 992, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 1000, .size = 8, .alignment = 8, .flags = 1 },
|
|
{ .offset = 1008, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 1016, .size = 2, .alignment = 2, .flags = 0 },
|
|
{ .offset = 1018, .size = 2, .alignment = 2, .flags = 0 },
|
|
{ .offset = 1020, .size = 4, .alignment = 4, .flags = 0 },
|
|
{ .offset = 1024, .size = 4, .alignment = 4, .flags = 0 },
|
|
{ .offset = 1032, .size = 16, .alignment = 8, .flags = 1 },
|
|
{ .offset = 1048, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 1056, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 1064, .size = 1, .alignment = 1, .flags = 0 },
|
|
{ .offset = 1065, .size = 1, .alignment = 1, .flags = 0 },
|
|
{ .offset = 1068, .size = 4, .alignment = 4, .flags = 0 },
|
|
{ .offset = 1072, .size = 16, .alignment = 8, .flags = 1 },
|
|
{ .offset = 1088, .size = 4, .alignment = 4, .flags = 0 },
|
|
{ .offset = 1096, .size = 16, .alignment = 8, .flags = 1 },
|
|
{ .offset = 1112, .size = 32, .alignment = 8, .flags = 0 },
|
|
{ .offset = 1144, .size = 16, .alignment = 8, .flags = 1 },
|
|
{ .offset = 1160, .size = 40, .alignment = 8, .flags = 1 },
|
|
{ .offset = 1200, .size = 24, .alignment = 8, .flags = 0 },
|
|
{ .offset = 1224, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 1232, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 1240, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 1248, .size = 4, .alignment = 4, .flags = 0 },
|
|
{ .offset = 1252, .size = 4, .alignment = 4, .flags = 0 },
|
|
{ .offset = 1256, .size = 4, .alignment = 4, .flags = 0 },
|
|
{ .offset = 1260, .size = 4, .alignment = 4, .flags = 0 },
|
|
{ .offset = 1264, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 1272, .size = 4, .alignment = 4, .flags = 0 },
|
|
{ .offset = 1276, .size = 1, .alignment = 1, .flags = 1 },
|
|
{ .offset = 1280, .size = 1, .alignment = 1, .flags = 1 },
|
|
{ .offset = 1281, .size = 1, .alignment = 1, .flags = 1 },
|
|
{ .offset = 1288, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 1296, .size = 56, .alignment = 8, .flags = 0 },
|
|
{ .offset = 1352, .size = 4, .alignment = 4, .flags = 0 },
|
|
{ .offset = 1356, .size = 4, .alignment = 4, .flags = 0 },
|
|
{ .offset = 1360, .size = 8, .alignment = 8, .flags = 1 },
|
|
{ .offset = 1368, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 1376, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 1384, .size = 16, .alignment = 8, .flags = 1 },
|
|
{ .offset = 1400, .size = 16, .alignment = 8, .flags = 1 },
|
|
{ .offset = 1416, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 1424, .size = 16, .alignment = 8, .flags = 1 },
|
|
{ .offset = 1440, .size = 16, .alignment = 8, .flags = 1 },
|
|
{ .offset = 1456, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 1464, .size = 64, .alignment = 8, .flags = 0 },
|
|
{ .offset = 1528, .size = 16, .alignment = 8, .flags = 1 },
|
|
{ .offset = 1544, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 1552, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 1560, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 1568, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 1576, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 1584, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 1592, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 1600, .size = 24, .alignment = 8, .flags = 0 },
|
|
{ .offset = 1624, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 1632, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 1640, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 1648, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 1656, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 1664, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 1672, .size = 80, .alignment = 8, .flags = 0 },
|
|
{ .offset = 1752, .size = 56, .alignment = 8, .flags = 0 },
|
|
{ .offset = 1808, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 1816, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 1824, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 1832, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 1840, .size = 16, .alignment = 1, .flags = 0 },
|
|
{ .offset = 1856, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 1864, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 1872, .size = 16, .alignment = 8, .flags = 0 },
|
|
{ .offset = 1888, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 1896, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 1904, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 1912, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 1920, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 1928, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 1936, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 1944, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 1952, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 1960, .size = 24, .alignment = 8, .flags = 1 },
|
|
{ .offset = 1984, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 1992, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2000, .size = 4, .alignment = 4, .flags = 0 },
|
|
{ .offset = 2008, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2016, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2024, .size = 4, .alignment = 4, .flags = 0 },
|
|
{ .offset = 2028, .size = 4, .alignment = 4, .flags = 0 },
|
|
{ .offset = 2032, .size = 16, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2048, .size = 32, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2080, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2088, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2096, .size = 4, .alignment = 4, .flags = 0 },
|
|
{ .offset = 2100, .size = 4, .alignment = 4, .flags = 0 },
|
|
{ .offset = 2104, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2112, .size = 16, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2128, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2136, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2144, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2152, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2160, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2168, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2176, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2184, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2192, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2200, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2208, .size = 56, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2264, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2272, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2280, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2288, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2296, .size = 4, .alignment = 4, .flags = 0 },
|
|
{ .offset = 2300, .size = 4, .alignment = 4, .flags = 0 },
|
|
{ .offset = 2304, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2312, .size = 16, .alignment = 8, .flags = 1 },
|
|
{ .offset = 2328, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2336, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2344, .size = 16, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2360, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2368, .size = 32, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2400, .size = 4, .alignment = 4, .flags = 0 },
|
|
{ .offset = 2404, .size = 4, .alignment = 1, .flags = 0 },
|
|
{ .offset = 2408, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2416, .size = 32, .alignment = 8, .flags = 1 },
|
|
{ .offset = 2448, .size = 16, .alignment = 8, .flags = 1 },
|
|
{ .offset = 2464, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2472, .size = 2, .alignment = 2, .flags = 0 },
|
|
{ .offset = 2474, .size = 1, .alignment = 1, .flags = 0 },
|
|
{ .offset = 2476, .size = 2, .alignment = 2, .flags = 0 },
|
|
{ .offset = 2480, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2488, .size = 4, .alignment = 4, .flags = 0 },
|
|
{ .offset = 2492, .size = 4, .alignment = 4, .flags = 0 },
|
|
{ .offset = 2496, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2504, .size = 4, .alignment = 4, .flags = 0 },
|
|
{ .offset = 2508, .size = 4, .alignment = 4, .flags = 0 },
|
|
{ .offset = 2512, .size = 4, .alignment = 4, .flags = 0 },
|
|
{ .offset = 2516, .size = 4, .alignment = 4, .flags = 0 },
|
|
{ .offset = 2520, .size = 16, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2536, .size = 16, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2552, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2560, .size = 16, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2576, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2584, .size = 4, .alignment = 4, .flags = 0 },
|
|
{ .offset = 2588, .size = 4, .alignment = 4, .flags = 0 },
|
|
{ .offset = 2592, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2600, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2608, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2616, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2624, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2632, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2640, .size = 16, .alignment = 1, .flags = 1 },
|
|
{ .offset = 2656, .size = 4, .alignment = 4, .flags = 0 },
|
|
{ .offset = 2660, .size = 4, .alignment = 4, .flags = 0 },
|
|
{ .offset = 2664, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2672, .size = 40, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2712, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2720, .size = 4, .alignment = 4, .flags = 0 },
|
|
{ .offset = 2728, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2736, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2744, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2752, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2760, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2768, .size = 8, .alignment = 1, .flags = 1 },
|
|
{ .offset = 2776, .size = 16, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2792, .size = 4, .alignment = 4, .flags = 0 },
|
|
{ .offset = 2800, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2808, .size = 8, .alignment = 8, .flags = 0 },
|
|
{ .offset = 2816, .size = 16, .alignment = 8, .flags = 0 }
|
|
};
|
|
|
|
static int check_target(spslr_u32 tidx) {
|
|
spslr_u32 tsize, fieldcnt;
|
|
|
|
if (spslr_randomizer_get_target(tidx, &tsize, &fieldcnt) < 0)
|
|
return -1;
|
|
|
|
spslr_u32 cur_end = 0;
|
|
|
|
for (spslr_u32 i = 0; i < fieldcnt; i++) {
|
|
struct spslr_randomizer_field_info finfo;
|
|
if (spslr_randomizer_get_field(tidx, i, SPSLR_RANDOMIZER_FIELD_IDX_MODE_FINAL, &finfo) < 0) {
|
|
fprintf(stderr, "failed to get field from randomizer\n");
|
|
return -1;
|
|
}
|
|
|
|
if (finfo.offset < cur_end) {
|
|
fprintf(stderr, "field overlaps with predecessor (begins at %u, pred ends at %u)\n", finfo.offset, cur_end);
|
|
return -1;
|
|
}
|
|
|
|
if (finfo.offset % finfo.alignment != 0) {
|
|
fprintf(stderr, "field is misaligned at %u\n (alignment is %u)", finfo.offset, finfo.alignment);
|
|
return -1;
|
|
}
|
|
|
|
if ((finfo.flags & SPSLR_FLAG_FIELD_FIXED) && finfo.offset != finfo.initial_offset) {
|
|
fprintf(stderr, "fixed field moved\n");
|
|
return -1;
|
|
}
|
|
|
|
if (finfo.offset + finfo.size > tsize) {
|
|
fprintf(stderr, "field resides beyond target bounds");
|
|
return -1;
|
|
}
|
|
|
|
cur_end = finfo.offset + finfo.size;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int main(void) {
|
|
srand((unsigned)time(NULL));
|
|
|
|
spslr_u32 rounds = 1000;
|
|
|
|
for (spslr_u32 iter = 0; iter < rounds; iter++) {
|
|
if (spslr_randomizer_init() < 0) {
|
|
fprintf(stderr, "init failed\n");
|
|
return 1;
|
|
}
|
|
|
|
if (spslr_randomize() < 0) {
|
|
fprintf(stderr, "randomize failed at iter %u\n", iter);
|
|
return 1;
|
|
}
|
|
|
|
for (spslr_u32 tidx = 0; tidx < spslr_target_cnt; tidx++) {
|
|
if (check_target(tidx) < 0) {
|
|
fprintf(stderr, "check failed at iter %u target %u\n", iter, tidx);
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
spslr_randomizer_clear();
|
|
}
|
|
|
|
printf("ok: %u iterations\n", rounds);
|
|
return 0;
|
|
}
|