target/xtensa: avoid IHI for writes to non-executable memory
[openocd.git] / src / target / semihosting_common.h
index b83464ed5a49a19915f49905c1204089fec18e9b..a1848b4881fb3d08b3a5b7f1b1d3d57bc369aeab 100644 (file)
@@ -1,22 +1,11 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+
 /***************************************************************************
  *   Copyright (C) 2018 by Liviu Ionescu                                   *
  *   <ilg@livius.net>                                                      *
  *                                                                         *
  *   Copyright (C) 2009 by Marvell Technology Group Ltd.                   *
  *   Written by Nicolas Pitre <nico@marvell.com>                           *
- *                                                                         *
- *   This program is free software; you can redistribute it and/or modify  *
- *   it under the terms of the GNU General Public License as published by  *
- *   the Free Software Foundation; either version 2 of the License, or     *
- *   (at your option) any later version.                                   *
- *                                                                         *
- *   This program is distributed in the hope that it will be useful,       *
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
- *   GNU General Public License for more details.                          *
- *                                                                         *
- *   You should have received a copy of the GNU General Public License     *
- *   along with this program.  If not, see <http://www.gnu.org/licenses/>. *
  ***************************************************************************/
 
 #ifndef OPENOCD_TARGET_SEMIHOSTING_COMMON_H
@@ -26,6 +15,7 @@
 #include <stdbool.h>
 #include <time.h>
 #include "helper/replacements.h"
+#include <server/server.h>
 
 /*
  * According to:
@@ -75,8 +65,16 @@ 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 */
 };
 
+/** Maximum allowed Tcl command segment length in bytes*/
+#define SEMIHOSTING_MAX_TCL_COMMAND_FIELD_LENGTH (1024 * 1024)
+
 /*
  * Codes used by SEMIHOSTING_SYS_EXIT (formerly
  * SEMIHOSTING_REPORT_EXCEPTION).
@@ -89,6 +87,20 @@ enum semihosting_reported_exceptions {
        ADP_STOPPED_RUN_TIME_ERROR = ((2 << 16) + 35),
 };
 
+enum semihosting_redirect_config {
+       SEMIHOSTING_REDIRECT_CFG_NONE,
+       SEMIHOSTING_REDIRECT_CFG_DEBUG,
+       SEMIHOSTING_REDIRECT_CFG_STDIO,
+       SEMIHOSTING_REDIRECT_CFG_ALL,
+};
+
+enum semihosting_result {
+       SEMIHOSTING_NONE,               /* Not halted for a semihosting call. */
+       SEMIHOSTING_HANDLED,    /* Call handled, and target was resumed. */
+       SEMIHOSTING_WAITING,    /* Call handled, target is halted waiting until we can resume. */
+       SEMIHOSTING_ERROR               /* Something went wrong. */
+};
+
 struct target;
 
 /*
@@ -99,6 +111,15 @@ struct semihosting {
        /** A flag reporting whether semihosting is active. */
        bool is_active;
 
+       /** Semihosting STDIO file descriptors */
+       int stdin_fd, stdout_fd, stderr_fd;
+
+       /** redirection configuration, NONE by default */
+       enum semihosting_redirect_config redirect_cfg;
+
+       /** Handle to redirect semihosting print via tcp */
+       struct connection *tcp_connection;
+
        /** A flag reporting whether semihosting fileio is active. */
        bool is_fileio;
 
@@ -153,12 +174,42 @@ struct semihosting {
        /** The current time when 'execution starts' */
        clock_t setup_time;
 
+       /** Base directory for semihosting I/O operations. */
+       char *basedir;
+
+       /**
+        * Target's extension of semihosting user commands.
+        * @returns ERROR_NOT_IMPLEMENTED when user command is not handled, otherwise
+        * sets semihosting->result and semihosting->sys_errno and returns ERROR_OK.
+        */
+       int (*user_command_extension)(struct target *target);
+
        int (*setup)(struct target *target, int enable);
        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);
 
+/* utility functions which may also be used by semihosting extensions (custom vendor-defined syscalls) */
+int semihosting_read_fields(struct target *target, size_t number,
+       uint8_t *fields);
+int semihosting_write_fields(struct target *target, size_t number,
+       uint8_t *fields);
+uint64_t semihosting_get_field(struct target *target, size_t index,
+       uint8_t *fields);
+void semihosting_set_field(struct target *target, uint64_t value,
+       size_t index,
+       uint8_t *fields);
+
+extern const struct command_registration semihosting_common_handlers[];
+
 #endif /* OPENOCD_TARGET_SEMIHOSTING_COMMON_H */

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)