int semihosting_file_seek(int file_handle, unsigned int offset) { smh_file_seek_block seek_block; int result; seek_block.handle = file_handle; seek_block.location = offset; result = semihosting_call(SEMIHOSTING_SYS_SEEK, (void *) &seek_block); if (result) result = semihosting_call(SEMIHOSTING_SYS_ERRNO, 0); return result; }
long semihosting_file_seek(long file_handle, ssize_t offset) { smh_file_seek_block_t seek_block; long result; seek_block.handle = file_handle; seek_block.location = offset; result = semihosting_call(SEMIHOSTING_SYS_SEEK, (void *) &seek_block); if (result) result = semihosting_call(SEMIHOSTING_SYS_ERRNO, 0); return result; }
int semihosting_system(char *command_line) { smh_system_block system_block; system_block.command_line = command_line; system_block.command_length = strlen(command_line); return semihosting_call(SEMIHOSTING_SYS_SYSTEM, (void *) &system_block); }
int semihosting_file_open(const char *file_name, unsigned int mode) { smh_file_open_block open_block; open_block.file_name = file_name; open_block.mode = mode; open_block.name_length = strlen(file_name); return semihosting_call(SEMIHOSTING_SYS_OPEN, (void *) &open_block); }
int semihosting_file_write(int file_handle, int *length, void *buffer) { smh_file_read_write_block write_block; if ((length == NULL) || (buffer == NULL)) return -EINVAL; write_block.handle = file_handle; write_block.buffer = buffer; write_block.length = *length; *length = semihosting_call(SEMIHOSTING_SYS_WRITE, (void *) &write_block); return *length; }
long semihosting_file_write(long file_handle, size_t *length, const uintptr_t buffer) { smh_file_read_write_block_t write_block; if ((length == NULL) || (buffer == (uintptr_t)NULL)) return -EINVAL; write_block.handle = file_handle; write_block.buffer = (uintptr_t)buffer; /* cast away const */ write_block.length = *length; *length = semihosting_call(SEMIHOSTING_SYS_WRITE, (void *) &write_block); return *length; }
int semihosting_file_read(int file_handle, int *length, void *buffer) { smh_file_read_write_block read_block; int result = -EINVAL; if ((length == NULL) || (buffer == NULL)) return result; read_block.handle = file_handle; read_block.buffer = buffer; read_block.length = *length; result = semihosting_call(SEMIHOSTING_SYS_READ, (void *) &read_block); if (result == *length) { return -EINVAL; } else if (result < *length) { *length -= result; return 0; } else return result; }
long semihosting_file_read(long file_handle, size_t *length, uintptr_t buffer) { smh_file_read_write_block_t read_block; long result = -EINVAL; if ((length == NULL) || (buffer == (uintptr_t)NULL)) return result; read_block.handle = file_handle; read_block.buffer = buffer; read_block.length = *length; result = semihosting_call(SEMIHOSTING_SYS_READ, (void *) &read_block); if (result == *length) { return -EINVAL; } else if (result < *length) { *length -= result; return 0; } else return result; }
void semihosting_write_string(char *string) { semihosting_call(SEMIHOSTING_SYS_WRITE0, (void *) string); }
void semihosting_write_char(char character) { semihosting_call(SEMIHOSTING_SYS_WRITEC, (void *) &character); }
char semihosting_read_char(void) { return semihosting_call(SEMIHOSTING_SYS_READC, NULL); }
int semihosting_file_length(int file_handle) { return semihosting_call(SEMIHOSTING_SYS_FLEN, (void *) &file_handle); }
int semihosting_file_close(int file_handle) { return semihosting_call(SEMIHOSTING_SYS_CLOSE, (void *) &file_handle); }