openocd: remove recently added CamelCase symbols
[fw/openocd] / src / target / semihosting_common.h
index b83464ed5a49a19915f49905c1204089fec18e9b..7c5f748f4336c4cfc03dd7509748f494a871eacf 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,14 @@ enum semihosting_operation_numbers {
        SEMIHOSTING_SYS_WRITE = 0x05,
        SEMIHOSTING_SYS_WRITEC = 0x03,
        SEMIHOSTING_SYS_WRITE0 = 0x04,
+       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 +85,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 +109,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,6 +172,16 @@ 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);
 };
@@ -161,4 +190,17 @@ 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 */