static int vfs_semihost_open(void* ctx, const char * path, int flags, int mode) { int fd = -1, host_err = 0; char *host_path; vfs_semihost_ctx_t *semi_ctx = ctx; ESP_LOGV(TAG, "%s: %p '%s 0x%x 0x%x'", __func__, semi_ctx, path, flags, mode); if (ctx_uses_abspath(semi_ctx)) { flags |= ESP_O_SEMIHOST_ABSPATH; host_path = malloc(strlen(semi_ctx->host_path)+strlen(path)+1); if(host_path == NULL) { errno = ENOMEM; return -1; } strcpy(host_path, semi_ctx->host_path); strcat(host_path, path); } else { host_path = (char *)path; } fd = generic_syscall(SYS_OPEN, (int)host_path, strlen(host_path), flags, mode, &host_err); if (ctx_uses_abspath(semi_ctx)) { free(host_path); } if (fd == -1) { errno = host_err; } return fd; }
static off_t vfs_semihost_lseek(void* ctx, int fd, off_t size, int mode) { int ret = -1, host_err = 0; ESP_LOGV(TAG, "%s: %d %ld %d", __func__, fd, size, mode); ret = generic_syscall(SYS_SEEK, fd, size, mode, 0, &host_err); if (ret == -1) { errno = host_err; } return (off_t)ret; }
static int vfs_semihost_close(void* ctx, int fd) { int ret = -1, host_err = 0; ESP_LOGV(TAG, "%s: %d", __func__, fd); ret = generic_syscall(SYS_CLOSE, fd, 0, 0, 0, &host_err); if (ret == -1) { errno = host_err; } return ret; }
static ssize_t vfs_semihost_read(void* ctx, int fd, void* data, size_t size) { int host_err = 0; size_t ret = -1; ESP_LOGV(TAG, "%s: %d %u bytes", __func__, fd, size); ret = generic_syscall(SYS_READ, fd, (int)data, size, 0, &host_err); if (ret == -1) { errno = host_err; } return (ssize_t)ret; }
int my_fork() { /* implement fork using generic_syscall function */ return generic_syscall(2); assert(0); }
int my_getppid() { /* implement getppid using generic_syscall function */ return generic_syscall(64); assert(0); }
int my_getppid(void){ return generic_syscall(64); }
int my_getpid(void){ return generic_syscall(20); }
int my_fork(void){ return generic_syscall(2); }