+/* 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
#include <stdint.h>
#include <stdbool.h>
#include <time.h>
+#include "helper/replacements.h"
+#include <server/server.h>
/*
* According to:
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).
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;
/*
/** 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;
/** 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 */