diff options
Diffstat (limited to 'core/salis.c')
| -rw-r--r-- | core/salis.c | 146 |
1 files changed, 47 insertions, 99 deletions
diff --git a/core/salis.c b/core/salis.c index 6a42bb3..8777d2f 100644 --- a/core/salis.c +++ b/core/salis.c @@ -14,7 +14,7 @@ #define MALL_FLAG 0x80 #define UINT64_HALF 0x8000000000000000ul -#if defined(DATA_PUSH_PATH) +#if DATA_PUSH == 1 #define EVENT_ARRAYS \ EVENT_ARRAY(0, aev) /* allocation events array */ \ EVENT_ARRAY(1, eev) /* executions events array */ \ @@ -22,7 +22,7 @@ #define EVENT_ARRAYS_COUNT 3 #endif -#if defined(COMPRESS) || defined(DATA_PUSH_PATH) +#if COMPRESS == 1 || DATA_PUSH == 1 #include "compress.c" #endif @@ -51,7 +51,7 @@ struct Core { uint64_t *ivav; uint8_t *iviv; -#if defined(DATA_PUSH_PATH) +#if DATA_PUSH == 1 uint64_t emb0; // executions within mb0 counter uint64_t emb1; // executions within mb1 counter uint64_t eliv; // executions within not-owned live code counter (parasites) @@ -81,11 +81,11 @@ uint64_t g_steps; uint64_t g_syncs; const struct Proc g_dead_proc; -#if defined(COMMAND_LOAD) || defined(COMMAND_NEW) +#if defined(COMMAND_NEW) || defined(COMMAND_LOAD) char g_asav_pbuf[AUTOSAVE_NAME_LEN]; #endif -#if defined(DATA_PUSH_PATH) +#if DATA_PUSH == 1 sqlite3 *g_sim_data; thrd_t g_eva_thrds[CORES][EVENT_ARRAYS_COUNT]; struct DeflateParams g_eva_deflate_params[CORES][EVENT_ARRAYS_COUNT]; @@ -96,13 +96,13 @@ void (*g_info)(const char *fmt, ...); void (*g_warn)(const char *fmt, ...); // Each architecture must define these functions -#if defined(COMMAND_BENCH) || defined(COMMAND_NEW) +#if defined(COMMAND_NEW) void arch_core_init(struct Core *core); #endif void arch_core_free(struct Core *core); -#if defined(COMMAND_LOAD) || defined(COMMAND_NEW) +#if defined(COMMAND_NEW) || defined(COMMAND_LOAD) void arch_core_save(FILE *f, const struct Core *core); #endif @@ -127,7 +127,7 @@ void arch_validate_proc(const struct Core *core, uint64_t pix); wchar_t arch_symbol(uint8_t inst); const char *arch_mnemonic(uint8_t inst); -#if defined(DATA_PUSH_PATH) +#if DATA_PUSH == 1 #if defined(COMMAND_NEW) void arch_push_data_header(void); #endif @@ -137,7 +137,7 @@ void arch_push_data_line(void); // ---------------------------------------------------------------------------- // Memory vector functions // ---------------------------------------------------------------------------- -#if defined(MVEC_LOOP) +#if MVEC_LOOP == 1 uint64_t mvec_loop(uint64_t addr) { return addr % MVEC_SIZE; } @@ -146,7 +146,7 @@ uint64_t mvec_loop(uint64_t addr) { bool mvec_is_alloc(const struct Core *core, uint64_t addr) { assert(core); -#if defined(MVEC_LOOP) +#if MVEC_LOOP == 1 return core->mvec[mvec_loop(addr)] & MALL_FLAG ? true : false; #else if (addr < MVEC_SIZE) { @@ -161,16 +161,16 @@ void mvec_alloc(struct Core *core, uint64_t addr) { assert(core); assert(!mvec_is_alloc(core, addr)); -#if defined(MVEC_LOOP) +#if MVEC_LOOP == 1 core->mvec[mvec_loop(addr)] |= MALL_FLAG; -#if defined(DATA_PUSH_PATH) +#if DATA_PUSH == 1 // Record deallocation event ++core->aeva[mvec_loop(addr)]; #endif #else assert(addr < MVEC_SIZE); core->mvec[addr] |= MALL_FLAG; -#if defined(DATA_PUSH_PATH) +#if DATA_PUSH == 1 // Record deallocation event ++core->aeva[addr]; #endif @@ -182,16 +182,16 @@ void mvec_free(struct Core *core, uint64_t addr) { assert(core); assert(mvec_is_alloc(core, addr)); -#if defined(MVEC_LOOP) +#if MVEC_LOOP == 1 core->mvec[mvec_loop(addr)] ^= MALL_FLAG; -#if defined(DATA_PUSH_PATH) +#if DATA_PUSH == 1 // Record deallocation event ++core->aeva[mvec_loop(addr)]; #endif #else assert(addr < MVEC_SIZE); core->mvec[addr] ^= MALL_FLAG; -#if defined(DATA_PUSH_PATH) +#if DATA_PUSH == 1 // Record deallocation event ++core->aeva[addr]; #endif @@ -202,7 +202,7 @@ void mvec_free(struct Core *core, uint64_t addr) { uint8_t mvec_get_byte(const struct Core *core, uint64_t addr) { assert(core); -#if defined(MVEC_LOOP) +#if MVEC_LOOP == 1 return core->mvec[mvec_loop(addr)]; #else if (addr < MVEC_SIZE) { @@ -216,7 +216,7 @@ uint8_t mvec_get_byte(const struct Core *core, uint64_t addr) { uint8_t mvec_get_inst(const struct Core *core, uint64_t addr) { assert(core); -#if defined(MVEC_LOOP) +#if MVEC_LOOP == 1 return core->mvec[mvec_loop(addr)] & INST_MASK; #else if (addr < MVEC_SIZE) { @@ -231,7 +231,7 @@ void mvec_set_inst(struct Core *core, uint64_t addr, uint8_t inst) { assert(core); assert(inst < INST_CAP); -#if defined(MVEC_LOOP) +#if MVEC_LOOP == 1 core->mvec[mvec_loop(addr)] &= MALL_FLAG; core->mvec[mvec_loop(addr)] |= inst; #else @@ -241,7 +241,7 @@ void mvec_set_inst(struct Core *core, uint64_t addr, uint8_t inst) { #endif } -#if defined(MUTA_FLIP) +#if MUTA_FLIP == 1 void mvec_flip_bit(struct Core *core, uint64_t addr, int bit) { assert(core); assert(bit < 8); @@ -298,7 +298,7 @@ uint64_t mvec_get_owner(const struct Core *core, uint64_t addr) { // ---------------------------------------------------------------------------- // Mutator functions // ---------------------------------------------------------------------------- -#if defined(COMMAND_BENCH) || defined(COMMAND_NEW) +#if defined(COMMAND_NEW) uint64_t muta_smix(uint64_t *seed) { assert(seed); @@ -338,7 +338,7 @@ void muta_cosmic_ray(struct Core *core) { uint64_t b = muta_next(core); if (a < MVEC_SIZE) { -#if defined(MUTA_FLIP) +#if MUTA_FLIP == 1 mvec_flip_bit(core, a, (int)(b % 8)); #else mvec_set_inst(core, a, b & INST_MASK); @@ -373,14 +373,14 @@ void proc_new(struct Core *core, const struct Proc *proc) { core->plst++; memcpy(&core->pvec[core->plst % core->pcap], proc, sizeof(struct Proc)); -#if defined(DATA_PUSH_PATH) +#if DATA_PUSH == 1 // Store birth event in database uint64_t child_addr = arch_proc_mb0_addr(core, core->plst); uint64_t child_size = arch_proc_mb0_size(core, core->plst); for (uint64_t i = 0; i < child_size; i++) { uint64_t addr = child_addr + i; -#if defined(MVEC_LOOP) +#if MVEC_LOOP == 1 ++core->beva[mvec_loop(addr)]; #else ++core->beva[addr]; @@ -420,7 +420,7 @@ struct Proc *proc_fetch(struct Core *core, uint64_t pix) { // ---------------------------------------------------------------------------- // Core functions // ---------------------------------------------------------------------------- -#if defined(COMMAND_LOAD) || defined(COMMAND_NEW) +#if defined(COMMAND_NEW) || defined(COMMAND_LOAD) void core_save(FILE *f, const struct Core *core) { assert(f); assert(core); @@ -435,7 +435,7 @@ void core_save(FILE *f, const struct Core *core) { fwrite(&core->pcur, sizeof(uint64_t), 1, f); fwrite(&core->psli, sizeof(uint64_t), 1, f); fwrite(&core->ivpt, sizeof(uint64_t), 1, f); -#if defined(DATA_PUSH_PATH) +#if DATA_PUSH == 1 fwrite(&core->emb0, sizeof(uint64_t), 1, f); fwrite(&core->emb1, sizeof(uint64_t), 1, f); fwrite(&core->eliv, sizeof(uint64_t), 1, f); @@ -446,7 +446,7 @@ void core_save(FILE *f, const struct Core *core) { fwrite(core->ivav, sizeof(uint64_t), SYNC_INTERVAL, f); fwrite(core->pvec, sizeof(struct Proc), core->pcap, f); fwrite(core->mvec, sizeof(uint8_t), MVEC_SIZE, f); -#if defined(DATA_PUSH_PATH) +#if DATA_PUSH == 1 #define EVENT_ARRAY(_, ev) \ fwrite(core->ev##a, sizeof(uint64_t), MVEC_SIZE, f); EVENT_ARRAYS @@ -457,12 +457,12 @@ void core_save(FILE *f, const struct Core *core) { } #endif -#if defined(COMMAND_BENCH) || defined(COMMAND_NEW) +#if defined(COMMAND_NEW) #if defined(ANC_BYTES) void core_assemble_ancestor(struct Core *core) { assert(core); -#if defined(MVEC_LOOP) +#if MVEC_LOOP == 1 uint64_t addr = UINT64_HALF; #else uint64_t addr = 0; @@ -525,7 +525,7 @@ void core_load(FILE *f, struct Core *core) { fread(&core->pcur, sizeof(uint64_t), 1, f); fread(&core->psli, sizeof(uint64_t), 1, f); fread(&core->ivpt, sizeof(uint64_t), 1, f); -#if defined(DATA_PUSH_PATH) +#if DATA_PUSH == 1 fread(&core->emb0, sizeof(uint64_t), 1, f); fread(&core->emb1, sizeof(uint64_t), 1, f); fread(&core->eliv, sizeof(uint64_t), 1, f); @@ -544,7 +544,7 @@ void core_load(FILE *f, struct Core *core) { fread(core->ivav, sizeof(uint64_t), SYNC_INTERVAL, f); fread(core->pvec, sizeof(struct Proc), core->pcap, f); fread(core->mvec, sizeof(uint8_t), MVEC_SIZE, f); -#if defined(DATA_PUSH_PATH) +#if DATA_PUSH == 1 #define EVENT_ARRAY(_, ev) \ fread(core->ev##a, sizeof(uint64_t), MVEC_SIZE, f); EVENT_ARRAYS @@ -594,7 +594,7 @@ void core_step(struct Core *core) { if (core->psli != 0) { core_pull_ipcm(core); -#if defined(DATA_PUSH_PATH) +#if DATA_PUSH == 1 // Save execution event locations in database assert(mvec_proc_is_live(core, core->pcur)); @@ -610,7 +610,7 @@ void core_step(struct Core *core) { ++core->edea; } -#if defined(MVEC_LOOP) +#if MVEC_LOOP == 1 core->eeva[mvec_loop(pcur_ip)]++; #else if (pcur_ip < MVEC_SIZE) { @@ -649,9 +649,9 @@ void core_step(struct Core *core) { // ---------------------------------------------------------------------------- // Main salis functions // ---------------------------------------------------------------------------- -#if defined(COMMAND_LOAD) || defined(COMMAND_NEW) +#if defined(COMMAND_NEW) || defined(COMMAND_LOAD) void salis_save(const char *path) { -#if defined(COMPRESS) +#if COMPRESS == 1 size_t size = 0; char *in = NULL; FILE *f = open_memstream(&in, &size); @@ -669,7 +669,7 @@ void salis_save(const char *path) { fwrite(&g_syncs, sizeof(uint64_t), 1, f); fclose(f); -#if defined(COMPRESS) +#if COMPRESS == 1 assert(size); char *out = malloc(size); @@ -718,7 +718,7 @@ void salis_auto_save(void) { } #endif -#if defined(DATA_PUSH_PATH) +#if DATA_PUSH == 1 void salis_exec_sql(int blob_cnt, const void **blobs, const int *blob_sizes, const char *sql_format, ...) { assert(sql_format); @@ -770,7 +770,7 @@ void salis_exec_sql(int blob_cnt, const void **blobs, const int *blob_sizes, con } #endif -#if defined(DATA_PUSH_PATH) +#if DATA_PUSH == 1 #if defined(COMMAND_NEW) void salis_push_data_header(void) { assert(g_sim_data); @@ -981,7 +981,7 @@ void salis_push_data_line(void) { } #endif -#if defined(COMMAND_BENCH) || defined(COMMAND_NEW) +#if defined(COMMAND_NEW) void salis_init(void) { assert(g_info); assert(g_warn); @@ -996,7 +996,7 @@ void salis_init(void) { salis_auto_save(); #endif -#if defined(DATA_PUSH_PATH) +#if DATA_PUSH == 1 sqlite3_open(DATA_PUSH_PATH, &g_sim_data); assert(g_sim_data); @@ -1017,7 +1017,7 @@ void salis_init(void) { #if defined(COMMAND_LOAD) void salis_load(void) { -#if defined(COMPRESS) +#if COMPRESS == 1 FILE *fx = fopen(SIM_PATH, "rb"); assert(fx); @@ -1062,12 +1062,12 @@ void salis_load(void) { fread(&g_syncs, sizeof(uint64_t), 1, f); fclose(f); -#if defined(COMPRESS) +#if COMPRESS == 1 free(in); free(out); #endif -#if defined(DATA_PUSH_PATH) +#if DATA_PUSH == 1 sqlite3_open(DATA_PUSH_PATH, &g_sim_data); assert(g_sim_data); @@ -1135,13 +1135,13 @@ void salis_loop(uint64_t ns, uint64_t dt) { salis_run_thread(dt); salis_sync(); -#if defined(COMMAND_LOAD) || defined(COMMAND_NEW) +#if defined(COMMAND_NEW) || defined(COMMAND_LOAD) if (g_steps % AUTOSAVE_INTERVAL == 0) { salis_auto_save(); } #endif -#if defined(DATA_PUSH_PATH) +#if DATA_PUSH == 1 if (g_steps % DATA_PUSH_INTERVAL == 0) { salis_push_data_line(); } @@ -1203,7 +1203,7 @@ void salis_step(uint64_t ns) { } void salis_free(void) { -#if defined(DATA_PUSH_PATH) +#if DATA_PUSH == 1 assert(g_sim_data); sqlite3_close(g_sim_data); #endif @@ -1233,58 +1233,6 @@ void salis_free(void) { // ---------------------------------------------------------------------------- // UI // ---------------------------------------------------------------------------- -#if defined(COMMAND_LOAD) || defined(COMMAND_NEW) +#if defined(COMMAND_NEW) || defined(COMMAND_LOAD) #include "ui.c" #endif - -// ---------------------------------------------------------------------------- -// Benchmark -// ---------------------------------------------------------------------------- -#if defined(COMMAND_BENCH) -void log_impl(const char *format, ...) { - va_list args; - va_start(args, format); - vprintf(format, args); - va_end(args); -} - -int main(void) { - g_info = log_impl; - g_warn = log_impl; - - g_info("Salis Benchmark Test\n\n"); - - salis_init(); - salis_step(STEPS); - - g_info("seed => %#lx\n", SEED); - g_info("g_steps => %#lx\n", g_steps); - g_info("g_syncs => %#lx\n", g_syncs); - - for (int i = 0; i < CORES; ++i) { - g_info("\n"); - g_info("core %d mall => %#lx\n", i, g_cores[i].mall); - g_info("core %d mut0 => %#lx\n", i, g_cores[i].muta[0]); - g_info("core %d mut1 => %#lx\n", i, g_cores[i].muta[1]); - g_info("core %d mut2 => %#lx\n", i, g_cores[i].muta[2]); - g_info("core %d mut3 => %#lx\n", i, g_cores[i].muta[3]); - g_info("core %d pnum => %#lx\n", i, g_cores[i].pnum); - g_info("core %d pcap => %#lx\n", i, g_cores[i].pcap); - g_info("core %d pfst => %#lx\n", i, g_cores[i].pfst); - g_info("core %d plst => %#lx\n", i, g_cores[i].plst); - g_info("core %d pcur => %#lx\n", i, g_cores[i].pcur); - g_info("core %d psli => %#lx\n", i, g_cores[i].psli); - g_info("core %d cycl => %#lx\n", i, g_cores[i].cycl); - g_info("core %d ivpt => %#lx\n", i, g_cores[i].ivpt); - g_info("\n"); - - for (int j = 0; j < 32; ++j) { - g_info("%02x ", g_cores[i].mvec[j]); - } - - g_info("\n"); - } - - salis_free(); -} -#endif |
