aboutsummaryrefslogtreecommitdiff
path: root/src/target/esirisc_trace.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/target/esirisc_trace.h')
-rw-r--r--src/target/esirisc_trace.h105
1 files changed, 105 insertions, 0 deletions
diff --git a/src/target/esirisc_trace.h b/src/target/esirisc_trace.h
new file mode 100644
index 00000000..c3cc6e99
--- /dev/null
+++ b/src/target/esirisc_trace.h
@@ -0,0 +1,105 @@
+/***************************************************************************
+ * Copyright (C) 2018 by Square, Inc. *
+ * Steven Stallion <stallion@squareup.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_ESIRISC_TRACE_H
+#define OPENOCD_TARGET_ESIRISC_TRACE_H
+
+#include <helper/command.h>
+#include <helper/types.h>
+#include <target/target.h>
+
+enum esirisc_trace_delay {
+ ESIRISC_TRACE_DELAY_NONE,
+ ESIRISC_TRACE_DELAY_START,
+ ESIRISC_TRACE_DELAY_STOP,
+ ESIRISC_TRACE_DELAY_BOTH,
+};
+
+enum esirisc_trace_format {
+ ESIRISC_TRACE_FORMAT_FULL,
+ ESIRISC_TRACE_FORMAT_BRANCH,
+ ESIRISC_TRACE_FORMAT_ICACHE,
+};
+
+enum esirisc_trace_id {
+ ESIRISC_TRACE_ID_EXECUTE,
+ ESIRISC_TRACE_ID_STALL,
+ ESIRISC_TRACE_ID_BRANCH,
+ ESIRISC_TRACE_ID_EXTENDED,
+};
+
+enum esirisc_trace_ext_id {
+ ESIRISC_TRACE_EXT_ID_EXCEPTION = 1,
+ ESIRISC_TRACE_EXT_ID_ERET,
+ ESIRISC_TRACE_EXT_ID_STOP,
+ ESIRISC_TRACE_EXT_ID_WAIT,
+ ESIRISC_TRACE_EXT_ID_MULTICYCLE,
+ ESIRISC_TRACE_EXT_ID_COUNT,
+ ESIRISC_TRACE_EXT_ID_PC,
+ ESIRISC_TRACE_EXT_ID_INDIRECT,
+ ESIRISC_TRACE_EXT_ID_END,
+ ESIRISC_TRACE_EXT_ID_END_PC,
+};
+
+enum esirisc_trace_trigger {
+ ESIRISC_TRACE_TRIGGER_NONE,
+ ESIRISC_TRACE_TRIGGER_PC,
+ ESIRISC_TRACE_TRIGGER_LOAD,
+ ESIRISC_TRACE_TRIGGER_STORE,
+ ESIRISC_TRACE_TRIGGER_EXCEPTION,
+ ESIRISC_TRACE_TRIGGER_ERET,
+ ESIRISC_TRACE_TRIGGER_WAIT,
+ ESIRISC_TRACE_TRIGGER_STOP,
+ ESIRISC_TRACE_TRIGGER_HIGH,
+ ESIRISC_TRACE_TRIGGER_LOW,
+};
+
+struct esirisc_trace {
+ target_addr_t buffer_start;
+ target_addr_t buffer_end;
+ bool buffer_wrap;
+ bool flow_control;
+
+ enum esirisc_trace_format format;
+ int pc_bits;
+
+ enum esirisc_trace_trigger start_trigger;
+ uint32_t start_data;
+ uint32_t start_mask;
+
+ enum esirisc_trace_trigger stop_trigger;
+ uint32_t stop_data;
+ uint32_t stop_mask;
+
+ enum esirisc_trace_delay delay;
+ uint32_t delay_cycles;
+};
+
+extern const struct command_registration esirisc_trace_command_handlers[];
+
+static inline uint32_t esirisc_trace_buffer_size(struct esirisc_trace *trace_info)
+{
+ return trace_info->buffer_end - trace_info->buffer_start;
+}
+
+static inline bool esirisc_trace_is_fifo(struct esirisc_trace *trace_info)
+{
+ return trace_info->buffer_start == trace_info->buffer_end;
+}
+
+#endif /* OPENOCD_TARGET_ESIRISC_TRACE_H */