#include #ifndef _SEMIHOSTING_H_ #define _SEMIHOSTING_H_ // ---------------------------------------------------------------------------- // Semihosting operations. enum Semihost_Sys_Op { // Regular operations SEMIHOST_SYS_CLOCK = 0x10, SEMIHOST_SYS_CLOSE = 0x02, SEMIHOST_SYS_ELAPSED = 0x30, SEMIHOST_SYS_ERRNO = 0x13, SEMIHOST_SYS_EXIT = 0x18, SEMIHOST_SYS_EXIT_EXTENDED = 0x20, SEMIHOST_SYS_FLEN = 0x0C, SEMIHOST_SYS_GET_CMDLINE = 0x15, SEMIHOST_SYS_HEAPINFO = 0x16, SEMIHOST_SYS_ISERROR = 0x08, SEMIHOST_SYS_ISTTY = 0x09, SEMIHOST_SYS_OPEN = 0x01, SEMIHOST_SYS_READ = 0x06, SEMIHOST_SYS_READC = 0x07, SEMIHOST_SYS_REMOVE = 0x0E, SEMIHOST_SYS_RENAME = 0x0F, SEMIHOST_SYS_SEEK = 0x0A, SEMIHOST_SYS_SYSTEM = 0x12, SEMIHOST_SYS_TICKFREQ = 0x31, SEMIHOST_SYS_TIME = 0x11, SEMIHOST_SYS_TMPNAM = 0x0D, SEMIHOST_SYS_WRITE = 0x05, SEMIHOST_SYS_WRITEC = 0x03, SEMIHOST_SYS_WRITE0 = 0x04, }; enum ADP_Code { ADP_Stopped_BranchThroughZero = 0x20000, ADP_Stopped_UndefinedInstr = 0x20001, ADP_Stopped_SoftwareInterrupt = 0x20002, ADP_Stopped_PrefetchAbort = 0x20003, ADP_Stopped_DataAbort = 0x20004, ADP_Stopped_AddressException = 0x20005, ADP_Stopped_IRQ = 0x20006, ADP_Stopped_FIQ = 0x20007, ADP_Stopped_BreakPoint = 0x20020, ADP_Stopped_WatchPoint = 0x20021, ADP_Stopped_StepComplete = 0x20022, ADP_Stopped_RunTimeErrorUnknown = 0x20023, ADP_Stopped_InternalError = 0x20024, ADP_Stopped_UserInterruption = 0x20025, ADP_Stopped_ApplicationExit = 0x20026, ADP_Stopped_StackOverflow = 0x20027, ADP_Stopped_DivisionByZero = 0x20028, ADP_Stopped_OSSpecific = 0x20029, }; typedef struct { uintptr_t param1; uintptr_t param2; uintptr_t param3; } semihostparam_t; static inline uintptr_t __attribute__((always_inline)) semihost_call_host(uintptr_t op, uintptr_t arg) { register uintptr_t r0 asm("a0") = op; register uintptr_t r1 asm("a1") = arg; asm volatile(".option push \n" ".option norvc \n" " slli zero,zero,0x1f \n" " ebreak \n" " srai zero,zero,0x7 \n" ".option pop \n" : "=r"(r0) /* Outputs */ : "r"(r0), "r"(r1) /* Inputs */ : "memory"); return r0; } #endif