#ifndef SFRT_TYPES_H #define SFRT_TYPES_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define EXPORT __attribute__((visibility("default"))) #define IMPORT __attribute__((visibility("default"))) #define INLINE __attribute__((always_inline)) #define WEAK __attribute__((weak)) #ifndef PAGE_SIZE #define PAGE_SIZE (1 << 12) #endif #define PAGE_ALIGNED __attribute__((aligned(PAGE_SIZE))) /* For this family of macros, do NOT pass zero as the pow2 */ #define round_to_pow2(x, pow2) (((unsigned long)(x)) & (~((pow2)-1))) #define round_up_to_pow2(x, pow2) (round_to_pow2(((unsigned long)x) + (pow2)-1, (pow2))) #define round_to_page(x) round_to_pow2(x, PAGE_SIZE) #define round_up_to_page(x) round_up_to_pow2(x, PAGE_SIZE) // Type alias's so I don't have to write uint32_t a million times typedef signed char i8; typedef unsigned char u8; typedef int16_t i16; typedef uint16_t u16; typedef int32_t i32; typedef uint32_t u32; typedef int64_t i64; typedef uint64_t u64; // FIXME: per-module configuration? #define WASM_PAGE_SIZE (1024 * 64) // 64KB #define WASM_START_PAGES (1 << 8) // 16MB #define WASM_MAX_PAGES (1 << 15) // 4GB #define WASM_STACK_SIZE (1 << 19) // 512KB. #define SBOX_MAX_MEM (1L << 32) // 4GB // These are per module symbols and I'd need to dlsym for each module. instead just use global constants, see above // macros. The code generator compiles in the starting number of wasm pages, and the maximum number of pages If we try // and allocate more than max_pages, we should fault // extern u32 starting_pages; // extern u32 max_pages; // The code generator also compiles in stubs that populate the linear memory and function table void populate_memory(void); void populate_table(void); // memory/* also provides the table access functions #define INDIRECT_TABLE_SIZE (1 << 10) struct indirect_table_entry { u32 type_id; void *func_pointer; }; extern __thread struct indirect_table_entry *module_indirect_table; // for sandbox linear memory isolation extern __thread void *sandbox_lmbase; extern __thread u32 sandbox_lmbound; extern i32 runtime_log_file_descriptor; // TODO: LOG_TO_FILE logic is untested // functions in the module to lookup and call per sandbox. typedef i32 (*mod_main_fn_t)(i32 a, i32 b); typedef void (*mod_glb_fn_t)(void); typedef void (*mod_mem_fn_t)(void); typedef void (*mod_tbl_fn_t)(void); typedef void (*mod_libc_fn_t)(i32, i32); /** * debuglog is a macro that behaves based on the macros DEBUG and LOG_TO_FILE * If DEBUG is not set, debuglog does nothing * If DEBUG is set and LOG_TO_FILE is set, debuglog prints to the logfile defined in runtime_log_file_descriptor * If DEBUG is set adn LOG_TO_FILE is not set, debuglog prints to STDOUT **/ #ifdef DEBUG #ifdef LOG_TO_FILE #define debuglog(fmt, ...) \ dprintf(runtime_log_file_descriptor, "(%d,%lu) %s: " fmt, sched_getcpu(), pthread_self(), __func__, \ ##__VA_ARGS__) #else // !LOG_TO_FILE #define debuglog(fmt, ...) printf("(%d,%lu) %s: " fmt, sched_getcpu(), pthread_self(), __func__, ##__VA_ARGS__) #endif // LOG_TO_FILE #else // !DEBUG #define debuglog(fmt, ...) #endif // DEBUG #define HTTP_MAX_HEADER_COUNT 16 #define HTTP_MAX_HEADER_LENGTH 32 #define HTTP_MAX_HEADER_VALUE_LENGTH 64 #define HTTP_RESPONSE_200_OK "HTTP/1.1 200 OK\r\n" #define HTTP_RESPONSE_CONTENT_LENGTH "Content-length: \r\n\r\n" // content body follows this #define HTTP_RESPONSE_CONTENT_TYPE "Content-type: \r\n" #define HTTP_RESPONSE_CONTENT_TYPE_PLAIN "text/plain" #define JSON_MAX_ELEMENT_COUNT 16 // Max number of elements defined in JSON #define JSON_MAX_ELEMENT_SIZE 1024 // Max size of a single module in JSON #define LISTENER_THREAD_CORE_ID 0 // Dedicated Listener Core #define LISTENER_THREAD_MAX_EPOLL_EVENTS 1024 #define MODULE_DEFAULT_REQUEST_RESPONSE_SIZE (PAGE_SIZE) #define MODULE_INITIALIZE_GLOBALS "populate_globals" // From Silverfish #define MODULE_INITIALIZE_MEMORY "populate_memory" // From Silverfish #define MODULE_INITIALIZE_TABLE "populate_table" // From Silverfish #define MODULE_INITIALIZE_LIBC "wasmf___init_libc" // From Silverfish #define MODULE_MAIN "wasmf_main" // From Silverfish #define MODULE_MAX_ARGUMENT_COUNT 16 // Max number of arguments #define MODULE_MAX_ARGUMENT_SIZE 64 // Max size of a single argument #define MODULE_MAX_MODULE_COUNT 128 // Max number of modules #define MODULE_MAX_NAME_LENGTH 32 // Max module name length #define MODULE_MAX_PATH_LENGTH 256 // Max length of path string #define MODULE_MAX_PENDING_CLIENT_REQUESTS 1000 #define RUNTIME_LOG_FILE "awesome.log" #define RUNTIME_READ_WRITE_VECTOR_LENGTH 16 #define RUNTIME_MAX_SANDBOX_REQUEST_COUNT (1 << 19) // random! #define SANDBOX_FILE_DESCRIPTOR_PREOPEN_MAGIC (707707707) // reads lol lol lol upside down #define SANDBOX_MAX_IO_HANDLE_COUNT 32 #define SANDBOX_PULL_BATCH_SIZE 1 // Max # standboxes pulled onto the local runqueue in a single batch #define SOFTWARE_INTERRUPT_TIME_TO_START_IN_USEC (10 * 1000) // start timers 10 ms from now. #define SOFTWARE_INTERRUPT_INTERVAL_DURATION_IN_USEC (1000 * 5) // and execute every 5ms // If multicore, use all but the dedicated listener core // If there are fewer cores than this, main dynamically overrides this and uses all available #define WORKER_THREAD_CORE_COUNT (NCORES > 1 ? NCORES - 1 : NCORES) #endif /* SFRT_TYPES_H */