diff options
Diffstat (limited to 'core')
| -rw-r--r-- | core/logger.c | 45 | ||||
| -rw-r--r-- | core/render.c | 91 | ||||
| -rw-r--r-- | core/salis.c | 159 |
3 files changed, 80 insertions, 215 deletions
diff --git a/core/logger.c b/core/logger.c index 38ac8ed..e088c55 100644 --- a/core/logger.c +++ b/core/logger.c @@ -3,35 +3,44 @@ enum LogLevel { LOG_INFO, LOG_WARN, - LOG_ERRO, }; char g_log_buff[LOG_LINE_SIZE]; -void log_msg_to_buff(char *out, int size, enum LogLevel level, const char *format, va_list args) { +void log_msg_to_buff(char *out, int size, enum LogLevel level, bool colored, const char *format, va_list args) { assert(out); assert(size); - assert(level == LOG_INFO || level == LOG_WARN || level == LOG_ERRO); + assert(level == LOG_INFO || level == LOG_WARN); assert(format); struct timespec ts; clock_gettime(CLOCK_REALTIME, &ts); long msec = ts.tv_nsec / 1000000; struct tm tm = *localtime(&ts.tv_sec); - int pid = getpid(); + pid_t pid = getpid(); char *level_str = NULL; switch (level) { case LOG_INFO: level_str = "INFO"; break; case LOG_WARN: level_str = "WARN"; break; - case LOG_ERRO: level_str = "ERRO"; break; default: assert(false); } + char *color_code = NULL; + if (colored) { + switch (level) { + case LOG_INFO: color_code = "\033[1;32m"; break; + case LOG_WARN: color_code = "\033[1;33m"; break; + default: assert(false); + } + } + + // Imitate formatting style configured in 'salis.py' int col = snprintf( out, size, - "%d-%02d-%02d %02d:%02d:%02d.%03ld %d [%s] ", + "%s%d-%02d-%02d %02d:%02d:%02d,%03ld %07d [%s]%s ", + colored ? color_code : "", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, @@ -40,17 +49,18 @@ void log_msg_to_buff(char *out, int size, enum LogLevel level, const char *forma tm.tm_sec, msec, pid, - level_str + level_str, + colored ? "\033[0m" : "" ); vsnprintf(out + col, size - col, format, args); } -void log_msg(enum LogLevel level, const char *format, va_list args) { - assert(level == LOG_INFO || level == LOG_WARN || level == LOG_ERRO); +void log_msg(enum LogLevel level, bool colored, const char *format, va_list args) { + assert(level == LOG_INFO || level == LOG_WARN); assert(format); - log_msg_to_buff(g_log_buff, LOG_LINE_SIZE, level, format, args); + log_msg_to_buff(g_log_buff, LOG_LINE_SIZE, level, colored, format, args); printf("\r%s\n", g_log_buff); } @@ -59,7 +69,7 @@ void log_info(const char *format, ...) { va_list args; va_start(args, format); - log_msg(LOG_INFO, format, args); + log_msg(LOG_INFO, true, format, args); va_end(args); } @@ -68,17 +78,6 @@ void log_warn(const char *format, ...) { va_list args; va_start(args, format); - log_msg(LOG_WARN, format, args); - va_end(args); -} - -void log_erro(const char *format, ...) { - assert(format); - - va_list args; - va_start(args, format); - log_msg(LOG_ERRO, format, args); + log_msg(LOG_WARN, true, format, args); va_end(args); - - exit(1); } diff --git a/core/render.c b/core/render.c deleted file mode 100644 index f42e821..0000000 --- a/core/render.c +++ /dev/null @@ -1,91 +0,0 @@ -#include <sqlite3ext.h> -SQLITE_EXTENSION_INIT1 - -#include <assert.h> -#include <stdint.h> -#include <stdio.h> -#include <zlib.h> - -#include "compress.c" - -void eva_render(sqlite3_context *context, int argc, sqlite3_value **argv) { - assert(context); - assert(argc == 4); - assert(argv); - - (void)argc; - - size_t left = (size_t)sqlite3_value_int(argv[0]); -#if defined(MVEC_LOOP) - left %= MVEC_SIZE; -#endif - - size_t px_count = (size_t)sqlite3_value_int(argv[1]); - size_t px_pow = (size_t)sqlite3_value_int(argv[2]); - size_t px_res = 1 << px_pow; -#if !defined(MVEC_LOOP) -#if !defined(NDEBUG) - size_t right = left + px_res * px_count; -#endif - assert(left < MVEC_SIZE); - assert(right <= MVEC_SIZE); -#endif - - const void *blob = sqlite3_value_blob(argv[3]); - size_t blob_size = (size_t)sqlite3_value_bytes(argv[3]); - - // Inflate blob - size_t out_size = sizeof(uint64_t) * px_count; - uint64_t *eva = sqlite3_malloc(EVA_SIZE); - uint64_t *out = sqlite3_malloc(out_size); - - struct InflateParams params = { - .avail_in = blob_size, - .size = EVA_SIZE, - .in = (Bytef *)blob, - .out = (Bytef *)eva, - }; - - salis_inflate(¶ms); - salis_inflate_end(¶ms); - - // Render image - for (size_t i = 0; i < px_count; i++) { - out[i] = 0; - - for (size_t j = 0; j < px_res; j++) { - size_t in_coord = left + i * px_res + j; -#if defined(MVEC_LOOP) - in_coord %= MVEC_SIZE; -#endif - out[i] += eva[in_coord]; - } - } - - sqlite3_free(eva); - - // Transform rendered image into textual representation - // A comma-separated list of hexadecimal integers - char *csv = sqlite3_malloc(px_count * 17 + 1); - char *ptr = csv; - - for (size_t i = 0; i < px_count; i++) { - ptr += sprintf(ptr, "%lx ", out[i]); - } - - *(--ptr) = '\0'; - sqlite3_free(out); - - sqlite3_result_text(context, csv, -1, sqlite3_free); -} - -int sqlite3_render_init(sqlite3 *db, char **pzErrMsg, const sqlite3_api_routines *pApi) { - assert(db); - assert(pzErrMsg); - assert(pApi); - - (void)pzErrMsg; - - SQLITE_EXTENSION_INIT2(pApi); - return sqlite3_create_function(db, "eva_render", 4, SQLITE_DETERMINISTIC | SQLITE_INNOCUOUS | SQLITE_UTF8, NULL, eva_render, NULL, NULL); -} diff --git a/core/salis.c b/core/salis.c index 6a42bb3..135fa4a 100644 --- a/core/salis.c +++ b/core/salis.c @@ -1,20 +1,32 @@ #include <assert.h> -#include <stdarg.h> #include <stdbool.h> -#include <stddef.h> #include <stdint.h> +#include <stdio.h> #include <stdlib.h> #include <string.h> #include <threads.h> -#define DATA_PUSH_BUSY_TIMEOUT 600000 +#if defined(DATA_PUSH) +#include <sqlite3.h> +#include <zlib.h> +#endif + +#if defined(COMPRESS) +#include <zlib.h> +#endif + +#if defined(COMPRESS) || defined(DATA_PUSH) +#include "compress.c" +#endif + #define INST_CAP 0x80 #define INST_MASK 0x7f #define IPC_FLAG 0x80 #define MALL_FLAG 0x80 #define UINT64_HALF 0x8000000000000000ul -#if defined(DATA_PUSH_PATH) +#if defined(DATA_PUSH) +#define DATA_PUSH_BUSY_TIMEOUT 600000 #define EVENT_ARRAYS \ EVENT_ARRAY(0, aev) /* allocation events array */ \ EVENT_ARRAY(1, eev) /* executions events array */ \ @@ -22,10 +34,6 @@ #define EVENT_ARRAYS_COUNT 3 #endif -#if defined(COMPRESS) || defined(DATA_PUSH_PATH) -#include "compress.c" -#endif - struct Proc { #define PROC_FIELD(type, name) type name; PROC_FIELDS @@ -51,7 +59,7 @@ struct Core { uint64_t *ivav; uint8_t *iviv; -#if defined(DATA_PUSH_PATH) +#if defined(DATA_PUSH) 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) @@ -61,12 +69,12 @@ struct Core { EVENT_ARRAYS #undef EVENT_ARRAY -#define CORE_DATA_FIELD(type, name, suff) type name suff; +#define CORE_DATA_FIELD(type, name) type name; CORE_DATA_FIELDS -#undef CORE_FIELD +#undef CORE_DATA_FIELD #endif -#define CORE_FIELD(type, name, suff) type name suff; +#define CORE_FIELD(type, name) type name; CORE_FIELDS #undef CORE_FIELD @@ -81,11 +89,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 defined(DATA_PUSH) 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 +104,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,12 +135,10 @@ 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 defined(COMMAND_NEW) void arch_push_data_header(void); #endif void arch_push_data_line(void); -#endif // ---------------------------------------------------------------------------- // Memory vector functions @@ -163,14 +169,15 @@ void mvec_alloc(struct Core *core, uint64_t addr) { #if defined(MVEC_LOOP) core->mvec[mvec_loop(addr)] |= MALL_FLAG; -#if defined(DATA_PUSH_PATH) +#if defined(DATA_PUSH) // 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 defined(DATA_PUSH) // Record deallocation event ++core->aeva[addr]; #endif @@ -184,14 +191,16 @@ void mvec_free(struct Core *core, uint64_t addr) { #if defined(MVEC_LOOP) core->mvec[mvec_loop(addr)] ^= MALL_FLAG; -#if defined(DATA_PUSH_PATH) + +#if defined(DATA_PUSH) // 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 defined(DATA_PUSH) // Record deallocation event ++core->aeva[addr]; #endif @@ -283,6 +292,9 @@ bool mvec_is_proc_owner(const struct Core *core, uint64_t addr, uint64_t pix) { uint64_t mvec_get_owner(const struct Core *core, uint64_t addr) { assert(core); +#if !defined(MVEC_LOOP) + assert(addr < MVEC_SIZE); +#endif assert(mvec_is_alloc(core, addr)); for (uint64_t pix = core->pfst; pix <= core->plst; ++pix) { @@ -298,7 +310,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); @@ -373,7 +385,7 @@ 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 defined(DATA_PUSH) // 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); @@ -420,7 +432,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 +447,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 defined(DATA_PUSH) 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 +458,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 defined(DATA_PUSH) #define EVENT_ARRAY(_, ev) \ fwrite(core->ev##a, sizeof(uint64_t), MVEC_SIZE, f); EVENT_ARRAYS @@ -457,7 +469,7 @@ 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); @@ -525,7 +537,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 defined(DATA_PUSH) 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 +556,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 defined(DATA_PUSH) #define EVENT_ARRAY(_, ev) \ fread(core->ev##a, sizeof(uint64_t), MVEC_SIZE, f); EVENT_ARRAYS @@ -594,7 +606,7 @@ void core_step(struct Core *core) { if (core->psli != 0) { core_pull_ipcm(core); -#if defined(DATA_PUSH_PATH) +#if defined(DATA_PUSH) // Save execution event locations in database assert(mvec_proc_is_live(core, core->pcur)); @@ -649,7 +661,7 @@ 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) size_t size = 0; @@ -671,7 +683,6 @@ void salis_save(const char *path) { #if defined(COMPRESS) assert(size); - char *out = malloc(size); assert(out); @@ -713,12 +724,12 @@ void salis_auto_save(void) { assert(rem >= 0); assert(rem < AUTOSAVE_NAME_LEN); - g_info("Saving simulation state on step '%#lx'", g_steps); + g_info("Saving simulation state on step %#lx", g_steps); salis_save(g_asav_pbuf); } #endif -#if defined(DATA_PUSH_PATH) +#if defined(DATA_PUSH) void salis_exec_sql(int blob_cnt, const void **blobs, const int *blob_sizes, const char *sql_format, ...) { assert(sql_format); @@ -755,7 +766,7 @@ void salis_exec_sql(int blob_cnt, const void **blobs, const int *blob_sizes, con break; } - g_warn("SQLite database returned error '%d' with message:", sql_res); + g_warn("SQLite database returned error %d with message:", sql_res); g_warn(sqlite3_errmsg(g_sim_data)); if (sql_res == SQLITE_BUSY) { @@ -768,14 +779,12 @@ void salis_exec_sql(int blob_cnt, const void **blobs, const int *blob_sizes, con sqlite3_finalize(sql_stmt); } -#endif -#if defined(DATA_PUSH_PATH) #if defined(COMMAND_NEW) void salis_push_data_header(void) { assert(g_sim_data); - g_info("Creating 'general' table in SQLite database"); + g_info("Creating general table in SQLite database"); salis_exec_sql( 0, NULL, NULL, "create table general (" @@ -810,7 +819,7 @@ void salis_push_data_header(void) { default: assert(false); } - g_info("Creating '%s_%d' table in SQLite database", pref, i); + g_info("Creating %s_%d table in SQLite database", pref, i); salis_exec_sql( 0, NULL, NULL, "create table %s_%d (" @@ -849,7 +858,7 @@ void salis_push_data_line(void) { amb1[i] /= core->pnum; } - g_info("Pushing row to 'general' table in SQLite database"); + g_info("Pushing row to general table in SQLite database"); salis_exec_sql( 0, NULL, NULL, "insert into general (" @@ -935,7 +944,7 @@ void salis_push_data_line(void) { const void *blob = params->out; int blob_size = params->strm.total_out; - g_info("Pushing row to '%s_%d' table in SQLite database", pref, i); + g_info("Pushing row to %s_%d table in SQLite database", pref, i); salis_exec_sql( 1, &blob, &blob_size, "insert into %s_%d (" @@ -981,7 +990,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 +1005,7 @@ void salis_init(void) { salis_auto_save(); #endif -#if defined(DATA_PUSH_PATH) +#if defined(DATA_PUSH) sqlite3_open(DATA_PUSH_PATH, &g_sim_data); assert(g_sim_data); @@ -1067,7 +1076,7 @@ void salis_load(void) { free(out); #endif -#if defined(DATA_PUSH_PATH) +#if defined(DATA_PUSH) sqlite3_open(DATA_PUSH_PATH, &g_sim_data); assert(g_sim_data); @@ -1135,13 +1144,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 defined(DATA_PUSH) if (g_steps % DATA_PUSH_INTERVAL == 0) { salis_push_data_line(); } @@ -1203,7 +1212,7 @@ void salis_step(uint64_t ns) { } void salis_free(void) { -#if defined(DATA_PUSH_PATH) +#if defined(DATA_PUSH) assert(g_sim_data); sqlite3_close(g_sim_data); #endif @@ -1233,58 +1242,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 |
