semihosting: improve semihosting opcode debug messages 26/7726/3
authorMarek Vrbka <marek.vrbka@codasip.com>
Tue, 30 May 2023 13:36:12 +0000 (15:36 +0200)
committerAntonio Borneo <borneo.antonio@gmail.com>
Sat, 1 Jul 2023 15:03:30 +0000 (15:03 +0000)
This patch introduces function semihosting_opcode_to_str() which
converts semihosting opcodes to strings. This function is then
used in debug messages to improve log analysis and troubleshooting.

Change-Id: Iffea49dae13d6a626ae0db40d379cba3c9ea5bd3
Signed-off-by: Marek Vrbka <marek.vrbka@codasip.com>
Reviewed-on: https://review.openocd.org/c/openocd/+/7726
Tested-by: jenkins
Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com>
Reviewed-by: Jan Matyas <jan.matyas@codasip.com>
src/target/semihosting_common.c
src/target/semihosting_common.h

index 6c91876c7365d2ef92839728f947f83ee233814e..107b6d3edc1ab3f3dd3ffc3298a52d9f9a4f0c53 100644 (file)
@@ -294,6 +294,66 @@ static inline int semihosting_getchar(struct semihosting *semihosting, int fd)
  */
 static char *semihosting_user_op_params;
 
+const char *semihosting_opcode_to_str(const uint64_t opcode)
+{
+       switch (opcode) {
+               case SEMIHOSTING_SYS_CLOSE:
+                       return "CLOSE";
+               case SEMIHOSTING_SYS_CLOCK:
+                       return "CLOCK";
+               case SEMIHOSTING_SYS_ELAPSED:
+                       return "ELAPSED";
+               case SEMIHOSTING_SYS_ERRNO:
+                       return "ERRNO";
+               case SEMIHOSTING_SYS_EXIT:
+                       return "EXIT";
+               case SEMIHOSTING_SYS_EXIT_EXTENDED:
+                       return "EXIT_EXTENDED";
+               case SEMIHOSTING_SYS_FLEN:
+                       return "FLEN";
+               case SEMIHOSTING_SYS_GET_CMDLINE:
+                       return "GET_CMDLINE";
+               case SEMIHOSTING_SYS_HEAPINFO:
+                       return "HEAPINFO";
+               case SEMIHOSTING_SYS_ISERROR:
+                       return "ISERROR";
+               case SEMIHOSTING_SYS_ISTTY:
+                       return "ISTTY";
+               case SEMIHOSTING_SYS_OPEN:
+                       return "OPEN";
+               case SEMIHOSTING_SYS_READ:
+                       return "READ";
+               case SEMIHOSTING_SYS_READC:
+                       return "READC";
+               case SEMIHOSTING_SYS_REMOVE:
+                       return "REMOVE";
+               case SEMIHOSTING_SYS_RENAME:
+                       return "RENAME";
+               case SEMIHOSTING_SYS_SEEK:
+                       return "SEEK";
+               case SEMIHOSTING_SYS_SYSTEM:
+                       return "SYSTEM";
+               case SEMIHOSTING_SYS_TICKFREQ:
+                       return "TICKFREQ";
+               case SEMIHOSTING_SYS_TIME:
+                       return "TIME";
+               case SEMIHOSTING_SYS_TMPNAM:
+                       return "TMPNAM";
+               case SEMIHOSTING_SYS_WRITE:
+                       return "WRITE";
+               case SEMIHOSTING_SYS_WRITEC:
+                       return "WRITEC";
+               case SEMIHOSTING_SYS_WRITE0:
+                       return "WRITE0";
+               case SEMIHOSTING_USER_CMD_0X100 ... SEMIHOSTING_USER_CMD_0X1FF:
+                       return "USER_CMD";
+               case SEMIHOSTING_ARM_RESERVED_START ... SEMIHOSTING_ARM_RESERVED_END:
+                       return "ARM_RESERVED_CMD";
+               default:
+                       return "<unknown>";
+       }
+}
+
 /**
  * Portable implementation of ARM semihosting calls.
  * Performs the currently pending semihosting operation
@@ -323,8 +383,9 @@ int semihosting_common(struct target *target)
        /* Enough space to hold 4 long words. */
        uint8_t fields[4*8];
 
-       LOG_DEBUG("op=0x%x, param=0x%" PRIx64, semihosting->op,
-               semihosting->param);
+       LOG_DEBUG("op=0x%x (%s), param=0x%" PRIx64, semihosting->op,
+                         semihosting_opcode_to_str(semihosting->op),
+                         semihosting->param);
 
        switch (semihosting->op) {
 
@@ -1470,8 +1531,9 @@ int semihosting_common(struct target *target)
                        retval = target_read_buffer(target, addr, len,
                                        (uint8_t *)(semihosting_user_op_params));
                        if (retval != ERROR_OK) {
-                               LOG_ERROR("Failed to read from target, semihosting op=0x%x",
-                                               semihosting->op);
+                               LOG_ERROR("Failed to read from target, semihosting op=0x%x (%s)",
+                                               semihosting->op,
+                                               semihosting_opcode_to_str(semihosting->op));
                                free(semihosting_user_op_params);
                                semihosting_user_op_params = NULL;
                                return retval;
index 7c5f748f4336c4cfc03dd7509748f494a871eacf..a1848b4881fb3d08b3a5b7f1b1d3d57bc369aeab 100644 (file)
@@ -65,6 +65,8 @@ enum semihosting_operation_numbers {
        SEMIHOSTING_SYS_WRITE = 0x05,
        SEMIHOSTING_SYS_WRITEC = 0x03,
        SEMIHOSTING_SYS_WRITE0 = 0x04,
+       SEMIHOSTING_ARM_RESERVED_START = 0x32,
+       SEMIHOSTING_ARM_RESERVED_END = 0xFF,
        SEMIHOSTING_USER_CMD_0X100 = 0x100, /* First user cmd op code */
        SEMIHOSTING_USER_CMD_0X107 = 0x107, /* Last supported user cmd op code */
        SEMIHOSTING_USER_CMD_0X1FF = 0x1FF, /* Last user cmd op code */
@@ -186,6 +188,13 @@ struct semihosting {
        int (*post_result)(struct target *target);
 };
 
+/**
+ * @brief Convert the syscall opcode to a human-readable string
+ * @param[in] opcode Syscall opcode
+ * @return String representation of syscall opcode
+ */
+const char *semihosting_opcode_to_str(uint64_t opcode);
+
 int semihosting_common_init(struct target *target, void *setup,
        void *post_result);
 int semihosting_common(struct target *target);

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)