bool vsyscall_exec(const char * name, exception_t ** err, void * ret, va_list args) { // Sanity check if (exception_check(err)) { return false; } const syscall_t * syscall = syscall_get(name); if (syscall == NULL) { exception_set(err, EINVAL, "Syscall %s doesn't exist!", name); return false; } char array[SYSCALL_BUFFERMAX]; { exception_t * e = NULL; ssize_t wrote = vserialize_2array_wheader((void **)array, SYSCALL_BUFFERMAX, &e, method_params(syscall->signature), args); if (wrote <= 0 || exception_check(&e)) { exception_set(err, ENOMEM, "Could not pack '%s' syscall args: %s (SYSCALL_BUFSIZE = %d)", name, exception_message(e), SYSCALL_BUFFERMAX); return false; } } return asyscall_exec(name, err, ret, (void **)array); }
syscall_t * syscall_new(const char * name, const char * sig, syscall_f func, const char * desc, exception_t ** err) { // Sanity check { if (exception_check(err)) { return NULL; } if (name == NULL || sig == NULL) { exception_set(err, EINVAL, "Bad arguments!"); return NULL; } } syscall_t * syscall = kobj_new("Syscall", name, syscall_desc, syscall_destroy, sizeof(syscall_t)); syscall->name = strdup(name); syscall->signature = strdup(sig); syscall->func = func; syscall->description = (desc == NULL)? NULL : strdup(desc); syscall->ffi = function_build(syscall->func, syscall->signature, err); if (syscall->ffi == NULL || exception_check(err)) { return NULL; } hashtable_put(&syscalls, syscall->name, &syscall->global_entry); LOGK(LOG_DEBUG, "Registered syscall %s with sig %s", name, sig); return syscall; }
static bool cal_updatebacking(calentry_t * entry, const char * value) { exception_t * e = NULL; switch (entry->signature) { case T_INTEGER: { int v = parse_int(value, &e); if (!exception_check(&e)) *(int *)entry->backing = v; break; } case T_DOUBLE: { double v = parse_double(value, &e); if (!exception_check(&e)) *(double *)entry->backing = v; break; } default: { LOGK(LOG_ERR, "Unknown calibration entry type %s with sig %c", entry->name, entry->signature); return false; } } if (exception_check(&e)) { LOGK(LOG_ERR, "Could not set calibration entry %s: %s", entry->name, exception_message(e)); exception_free(e); return false; } return true; }
bool asyscall_exec(const char * name, exception_t ** err, void * ret, void ** args) { // Sanity check if (exception_check(err)) { return false; } syscall_t * syscall = syscall_get(name); if (syscall == NULL) { exception_set(err, EINVAL, "Syscall %s doesn't exist!", name); return false; } function_call(syscall->ffi, ret, args); return true; }
int main(void) { // copy vector table to SRAM1! #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wnonnull" memcpy((char *)0x20000000, (const char)0x00000000, 0x200); #pragma GCC diagnostic pop // remap SRAM1 to 0x00000000 SYSCFG->MEMRMP |= 0x03; halInit(); chSysInit(); sdcard_init(); sysmon_init(); #if ENABLE_SERIAL_DEBUG // SD2 for serial debug output palSetPadMode(GPIOA, 3, PAL_MODE_ALTERNATE(7) | PAL_MODE_INPUT); // RX palSetPadMode(GPIOA, 2, PAL_MODE_OUTPUT_PUSHPULL); // TX palSetPadMode(GPIOA, 2, PAL_MODE_ALTERNATE(7)); // TX // 115200 baud static const SerialConfig sd2Cfg = {115200, 0, 0, 0}; sdStart(&SD2, &sd2Cfg); chprintf((BaseSequentialStream * )&SD2,"Hello world!\r\n"); #endif exception_init(); InitPatch0(); InitPConnection(); InitPWM(); // display SPI CS? palSetPadMode(GPIOC, 1, PAL_MODE_OUTPUT_PUSHPULL); palSetPad(GPIOC, 1); chThdSleepMilliseconds(10); palSetPadMode(SW2_PORT, SW2_PIN, PAL_MODE_INPUT_PULLDOWN); axoloti_board_init(); codec_init(); if (!palReadPad(SW2_PORT, SW2_PIN)) { // button S2 not pressed // watchdog_init(); chThdSleepMilliseconds(1); } start_dsp_thread(); adc_init(); axoloti_math_init(); midi_init(); #if ((BOARD_AXOLOTI_V03)||(BOARD_AXOLOTI_V05)) axoloti_control_init(); #endif ui_init(); StartLoadPatchTread(); #if (BOARD_AXOLOTI_V05) configSDRAM(); //memTest(); #endif #ifdef ENABLE_USB_HOST MY_USBH_Init(); #endif if (!exception_check()) { // only try booting a patch when no exception is to be reported #if ((BOARD_AXOLOTI_V03)||(BOARD_AXOLOTI_V05)) sdcard_attemptMountIfUnmounted(); if (fs_ready && !palReadPad(SW2_PORT, SW2_PIN)){ // button S2 not pressed FRESULT res; // res = f_stat("/start.bin", NULL); // if (res == FR_OK) { LoadPatch("/start.bin"); // } } #endif // if no patch booting or running yet // try loading from flash if (patchStatus) { // patch in flash sector 11 memcpy((uint8_t *)PATCHMAINLOC, (uint8_t *)PATCHFLASHLOC, PATCHFLASHSIZE); if ((*(uint32_t *)PATCHMAINLOC != 0xFFFFFFFF) && (*(uint32_t *)PATCHMAINLOC != 0)) { if (!palReadPad(SW2_PORT, SW2_PIN)) // button S2 not pressed StartPatch(); } } } while (1) { chThdSleepMilliseconds(1000); } }