summaryrefslogtreecommitdiffstats
path: root/sys/contrib/octeon-sdk/cvmx-debug.h
diff options
context:
space:
mode:
Diffstat (limited to 'sys/contrib/octeon-sdk/cvmx-debug.h')
-rw-r--r--sys/contrib/octeon-sdk/cvmx-debug.h454
1 files changed, 454 insertions, 0 deletions
diff --git a/sys/contrib/octeon-sdk/cvmx-debug.h b/sys/contrib/octeon-sdk/cvmx-debug.h
new file mode 100644
index 0000000..b914e2b
--- /dev/null
+++ b/sys/contrib/octeon-sdk/cvmx-debug.h
@@ -0,0 +1,454 @@
+/***********************license start***************
+ * Copyright (c) 2003-2010 Cavium Inc. (support@cavium.com). All rights
+ * reserved.
+ *
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+
+ * * Neither the name of Cavium Inc. nor the names of
+ * its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written
+ * permission.
+
+ * This Software, including technical data, may be subject to U.S. export control
+ * laws, including the U.S. Export Administration Act and its associated
+ * regulations, and may be subject to export or import regulations in other
+ * countries.
+
+ * TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS"
+ * AND WITH ALL FAULTS AND CAVIUM INC. MAKES NO PROMISES, REPRESENTATIONS OR
+ * WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH RESPECT TO
+ * THE SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY REPRESENTATION OR
+ * DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT DEFECTS, AND CAVIUM
+ * SPECIFICALLY DISCLAIMS ALL IMPLIED (IF ANY) WARRANTIES OF TITLE,
+ * MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR PURPOSE, LACK OF
+ * VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET POSSESSION OR
+ * CORRESPONDENCE TO DESCRIPTION. THE ENTIRE RISK ARISING OUT OF USE OR
+ * PERFORMANCE OF THE SOFTWARE LIES WITH YOU.
+ ***********************license end**************************************/
+
+
+/**
+ * @file
+ *
+ * Interface to debug exception handler
+ *
+ * <hr>$Revision: $<hr>
+ */
+
+#ifndef __CVMX_DEBUG_H__
+#define __CVMX_DEBUG_H__
+
+#include "cvmx-core.h"
+#include "cvmx-spinlock.h"
+
+
+#define CVMX_DEBUG_MAX_REQUEST_SIZE 1024 + 34 /* Enough room for setting memory of 512 bytes. */
+#define CVMX_DEBUG_MAX_RESPONSE_SIZE 1024 + 5
+
+#define CVMX_DEBUG_GLOBALS_BLOCK_NAME "cvmx-debug-globals"
+#define CVMX_DEBUG_GLOBALS_VERSION 3
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void cvmx_debug_init(void);
+void cvmx_debug_finish(void);
+void cvmx_debug_trigger_exception(void);
+
+#ifdef CVMX_BUILD_FOR_TOOLCHAIN
+extern int __octeon_debug_booted;
+
+static inline int cvmx_debug_booted(void)
+{
+ return __octeon_debug_booted;
+}
+
+#else
+
+static inline int cvmx_debug_booted(void)
+{
+ return cvmx_sysinfo_get()->bootloader_config_flags & CVMX_BOOTINFO_CFG_FLAG_DEBUG;
+}
+#endif
+
+/* There are 64 TLB entries in CN5XXX and 32 TLB entries in CN3XXX and
+ 128 TLB entries in CN6XXX. */
+#define CVMX_DEBUG_N_TLB_ENTRIES 128
+
+/* Maximium number of hardware breakpoints/watchpoints allowed */
+#define CVMX_DEBUG_MAX_OCTEON_HW_BREAKPOINTS 4
+
+typedef struct
+{
+ volatile uint64_t remote_controlled;
+ uint64_t regs[32];
+ uint64_t lo;
+ uint64_t hi;
+
+#define CVMX_DEBUG_BASIC_CONTEXT \
+ F(remote_controlled); \
+ { int i; \
+ for (i = 0; i < 32; i++) \
+ F(regs[i]); \
+ } \
+ F(lo); \
+ F(hi);
+
+ struct {
+ uint64_t index;
+ uint64_t entrylo[2];
+ uint64_t entryhi;
+ uint64_t pagemask;
+ uint64_t status;
+ uint64_t badvaddr;
+ uint64_t cause;
+ uint64_t depc;
+ uint64_t desave;
+ uint64_t debug;
+ uint64_t multicoredebug;
+ uint64_t perfval[2];
+ uint64_t perfctrl[2];
+ } cop0;
+
+#define CVMX_DEBUG_COP0_CONTEXT \
+ F(cop0.index); \
+ F(cop0.entrylo[0]); \
+ F(cop0.entrylo[1]); \
+ F(cop0.entryhi); \
+ F(cop0.pagemask); \
+ F(cop0.status); \
+ F(cop0.badvaddr); \
+ F(cop0.cause); \
+ F(cop0.depc); \
+ F(cop0.desave); \
+ F(cop0.debug); \
+ F(cop0.multicoredebug); \
+ F(cop0.perfval[0]); \
+ F(cop0.perfval[1]); \
+ F(cop0.perfctrl[0]); \
+ F(cop0.perfctrl[1]);
+
+ struct
+ {
+ uint64_t status;
+ uint64_t address[4];
+ uint64_t address_mask[4];
+ uint64_t asid[4];
+ uint64_t control[4];
+ } hw_ibp, hw_dbp;
+
+/* Hardware Instruction Break Point */
+
+#define CVMX_DEBUG_HW_IBP_CONTEXT \
+ F(hw_ibp.status); \
+ F(hw_ibp.address[0]); \
+ F(hw_ibp.address[1]); \
+ F(hw_ibp.address[2]); \
+ F(hw_ibp.address[3]); \
+ F(hw_ibp.address_mask[0]); \
+ F(hw_ibp.address_mask[1]); \
+ F(hw_ibp.address_mask[2]); \
+ F(hw_ibp.address_mask[3]); \
+ F(hw_ibp.asid[0]); \
+ F(hw_ibp.asid[1]); \
+ F(hw_ibp.asid[2]); \
+ F(hw_ibp.asid[3]); \
+ F(hw_ibp.control[0]); \
+ F(hw_ibp.control[1]); \
+ F(hw_ibp.control[2]); \
+ F(hw_ibp.control[3]);
+
+/* Hardware Data Break Point */
+#define CVMX_DEBUG_HW_DBP_CONTEXT \
+ F(hw_dbp.status); \
+ F(hw_dbp.address[0]); \
+ F(hw_dbp.address[1]); \
+ F(hw_dbp.address[2]); \
+ F(hw_dbp.address[3]); \
+ F(hw_dbp.address_mask[0]); \
+ F(hw_dbp.address_mask[1]); \
+ F(hw_dbp.address_mask[2]); \
+ F(hw_dbp.address_mask[3]); \
+ F(hw_dbp.asid[0]); \
+ F(hw_dbp.asid[1]); \
+ F(hw_dbp.asid[2]); \
+ F(hw_dbp.asid[3]); \
+ F(hw_dbp.control[0]); \
+ F(hw_dbp.control[1]); \
+ F(hw_dbp.control[2]); \
+ F(hw_dbp.control[3]);
+
+
+ struct cvmx_debug_tlb_t
+ {
+ uint64_t entryhi;
+ uint64_t pagemask;
+ uint64_t entrylo[2];
+ uint64_t reserved;
+ } tlbs[CVMX_DEBUG_N_TLB_ENTRIES];
+
+#define CVMX_DEBUG_TLB_CONTEXT \
+ { int i; \
+ for (i = 0; i < CVMX_DEBUG_N_TLB_ENTRIES; i++) \
+ { \
+ F(tlbs[i].entryhi); \
+ F(tlbs[i].pagemask); \
+ F(tlbs[i].entrylo[0]); \
+ F(tlbs[i].entrylo[1]); \
+ } \
+ }
+
+} cvmx_debug_core_context_t;
+
+typedef struct cvmx_debug_tlb_t cvmx_debug_tlb_t;
+
+
+
+typedef enum cvmx_debug_comm_type_e
+{
+ COMM_UART,
+ COMM_REMOTE,
+ COMM_SIZE
+}cvmx_debug_comm_type_t;
+
+typedef enum
+{
+ COMMAND_NOP = 0, /**< Core doesn't need to do anything. Just stay in exception handler */
+ COMMAND_STEP, /**< Core needs to perform a single instruction step */
+ COMMAND_CONTINUE /**< Core need to start running. Doesn't return until some debug event occurs */
+} cvmx_debug_command_t;
+
+/* Every field in this struct has to be uint32_t. */
+typedef struct
+{
+ uint32_t known_cores;
+ uint32_t step_isr; /**< True if we are going to step into ISR's. */
+ uint32_t focus_switch; /**< Focus can be switched. */
+ uint32_t core_finished; /**< True if a core has finished and not been processed yet. */
+ uint32_t command; /**< Command for all cores (cvmx_debug_command_t) */
+ uint32_t step_all; /**< True if step and continue should affect all cores. False, only the focus core is affected */
+ uint32_t focus_core; /**< Core currently under control of the debugger */
+ uint32_t active_cores; /**< Bitmask of cores that should stop on a breakpoint */
+ uint32_t handler_cores; /**< Bitmask of cores currently running the exception handler */
+ uint32_t ever_been_in_debug; /**< True if we have been ever been in the debugger stub at all. */
+}__attribute__ ((aligned(sizeof(uint64_t)))) cvmx_debug_state_t;
+
+typedef int cvmx_debug_state_t_should_fit_inside_a_cache_block[sizeof(cvmx_debug_state_t)+sizeof(cvmx_spinlock_t)+4*sizeof(uint64_t) > 128 ? -1 : 1];
+
+typedef struct cvmx_debug_globals_s
+{
+ uint64_t version; /* This is always the first element of this struct */
+ uint64_t comm_type; /* cvmx_debug_comm_type_t */
+ volatile uint64_t comm_changed; /* cvmx_debug_comm_type_t+1 when someone wants to change it. */
+ volatile uint64_t init_complete;
+ uint32_t tlb_entries;
+ uint32_t state[sizeof(cvmx_debug_state_t)/sizeof(uint32_t)];
+ cvmx_spinlock_t lock;
+
+ volatile cvmx_debug_core_context_t contextes[CVMX_MAX_CORES];
+} cvmx_debug_globals_t;
+
+typedef union
+{
+ uint64_t u64;
+ struct
+ {
+ uint64_t rsrvd:32; /**< Unused */
+ uint64_t dbd:1; /**< Indicates whether the last debug exception or
+ exception in Debug Mode occurred in a branch or
+ jump delay slot */
+ uint64_t dm:1; /**< Indicates that the processor is operating in Debug
+ Mode: */
+ uint64_t nodcr:1; /**< Indicates whether the dseg segment is present */
+ uint64_t lsnm:1; /**< Controls access of loads/stores between the dseg
+ segment and remaining memory when the dseg
+ segment is present */
+ uint64_t doze:1; /**< Indicates that the processor was in a low-power mode
+ when a debug exception occurred */
+ uint64_t halt:1; /**< Indicates that the internal processor system bus clock
+ was stopped when the debug exception occurred */
+ uint64_t countdm:1; /**< Controls or indicates the Count register behavior in
+ Debug Mode. Implementations can have fixed
+ behavior, in which case this bit is read-only (R), or
+ the implementation can allow this bit to control the
+ behavior, in which case this bit is read/write (R/W).
+ The reset value of this bit indicates the behavior after
+ reset, and depends on the implementation.
+ Encoding of the bit is:
+ - 0 Count register stopped in Debug Mode Count register is running in Debug
+ - 1 Mode
+ This bit is read-only (R) and reads as zero if not implemented. */
+ uint64_t ibusep:1; /**< Indicates if a Bus Error exception is pending from an
+ instruction fetch. Set when an instruction fetch bus
+ error event occurs or a 1 is written to the bit by
+ software. Cleared when a Bus Error exception on an
+ instruction fetch is taken by the processor. If IBusEP
+ is set when IEXI is cleared, a Bus Error exception on
+ an instruction fetch is taken by the processor, and
+ IBusEP is cleared.
+ In Debug Mode, a Bus Error exception applies to a
+ Debug Mode Bus Error exception.
+ This bit is read-only (R) and reads as zero if not
+ implemented. */
+ uint64_t mcheckp:1; /**< Indicates if a Machine Check exception is pending.
+ Set when a machine check event occurs or a 1 is
+ written to the bit by software. Cleared when a
+ Machine Check exception is taken by the processor.
+ If MCheckP is set when IEXI is cleared, a Machine
+ Check exception is taken by the processor, and
+ MCheckP is cleared.
+ In Debug Mode, a Machine Check exception applies
+ to a Debug Mode Machine Check exception.
+ This bit is read-only (R) and reads as zero if not
+ implemented. */
+ uint64_t cacheep:1; /**< Indicates if a Cache Error is pending. Set when a
+ cache error event occurs or a 1 is written to the bit by
+ software. Cleared when a Cache Error exception is
+ taken by the processor. If CacheEP is set when IEXI
+ is cleared, a Cache Error exception is taken by the
+ processor, and CacheEP is cleared.
+ In Debug Mode, a Cache Error exception applies to a
+ Debug Mode Cache Error exception.
+ This bit is read-only (R) and reads as zero if not
+ implemented. */
+ uint64_t dbusep:1; /**< Indicates if a Data Access Bus Error exception is
+ pending. Set when a data access bus error event
+ occurs or a 1 is written to the bit by software. Cleared
+ when a Bus Error exception on data access is taken by
+ the processor. If DBusEP is set when IEXI is cleared,
+ a Bus Error exception on data access is taken by the
+ processor, and DBusEP is cleared.
+ In Debug Mode, a Bus Error exception applies to a
+ Debug Mode Bus Error exception.
+ This bit is read-only (R) and reads as zero if not
+ implemented. */
+ uint64_t iexi:1; /**< An Imprecise Error eXception Inhibit (IEXI) controls
+ exceptions taken due to imprecise error indications.
+ Set when the processor takes a debug exception or an
+ exception in Debug Mode occurs. Cleared by
+ execution of the DERET instruction. Otherwise
+ modifiable by Debug Mode software.
+ When IEXI is set, then the imprecise error exceptions
+ from bus errors on instruction fetches or data
+ accesses, cache errors, or machine checks are
+ inhibited and deferred until the bit is cleared.
+ This bit is read-only (R) and reads as zero if not
+ implemented. */
+ uint64_t ddbsimpr:1; /**< Indicates that a Debug Data Break Store Imprecise
+ exception due to a store was the cause of the debug
+ exception, or that an imprecise data hardware break
+ due to a store was indicated after another debug
+ exception occurred. Cleared on exception in Debug
+ Mode.
+ - 0 No match of an imprecise data hardware breakpoint on store
+ - 1 Match of imprecise data hardware breakpoint on store
+ This bit is read-only (R) and reads as zero if not
+ implemented. */
+ uint64_t ddblimpr:1; /**< Indicates that a Debug Data Break Load Imprecise
+ exception due to a load was the cause of the debug
+ exception, or that an imprecise data hardware break
+ due to a load was indicated after another debug
+ exception occurred. Cleared on exception in Debug
+ Mode.
+ - 0 No match of an imprecise data hardware breakpoint on load
+ - 1 Match of imprecise data hardware breakpoint on load
+ This bit is read-only (R) and reads as zero if not
+ implemented. */
+ uint64_t ejtagver:3; /**< Provides the EJTAG version.
+ - 0 Version 1 and 2.0
+ - 1 Version 2.5
+ - 2 Version 2.6
+ - 3-7 Reserved */
+ uint64_t dexccode:5; /**< Indicates the cause of the latest exception in Debug
+ Mode.
+ The field is encoded as the ExcCode field in the
+ Cause register for those exceptions that can occur in
+ Debug Mode (the encoding is shown in MIPS32 and
+ MIPS64 specifications), with addition of code 30
+ with the mnemonic CacheErr for cache errors and the
+ use of code 9 with mnemonic Bp for the SDBBP
+ instruction.
+ This value is undefined after a debug exception. */
+ uint64_t nosst:1; /**< Indicates whether the single-step feature controllable
+ by the SSt bit is available in this implementation:
+ - 0 Single-step feature available
+ - 1 No single-step feature available
+ A minimum number of hardware instruction
+ breakpoints must be available if no single-step
+ feature is implemented in hardware. Refer to Section
+ 4.8.1 on page 69 for more information. */
+ uint64_t sst:1; /**< Controls whether single-step feature is enabled:
+ - 0 No enable of single-step feature
+ - 1 Single-step feature enabled
+ This bit is read-only (R) and reads as zero if not
+ implemented due to no single-step feature (NoSSt is
+ 1). */
+ uint64_t rsrvd2:2; /**< Must be zero */
+ uint64_t dint:1; /**< Indicates that a Debug Interrupt exception occurred.
+ Cleared on exception in Debug Mode.
+ - 0 No Debug Interrupt exception
+ - 1 Debug Interrupt exception
+ This bit is read-only (R) and reads as zero if not
+ implemented. */
+ uint64_t dib:1; /**< Indicates that a Debug Instruction Break exception
+ occurred. Cleared on exception in Debug Mode.
+ - 0 No Debug Instruction Break exception
+ - 1 Debug Instruction Break exception
+ This bit is read-only (R) and reads as zero if not
+ implemented. */
+ uint64_t ddbs:1; /**< Indicates that a Debug Data Break Store exception
+ occurred on a store due to a precise data hardware
+ break. Cleared on exception in Debug Mode.
+ - 0 No Debug Data Break Store Exception
+ - 1 Debug Data Break Store Exception
+ This bit is read-only (R) and reads as zero if not
+ implemented. */
+ uint64_t ddbl:1; /**< Indicates that a Debug Data Break Load exception
+ occurred on a load due to a precise data hardware
+ break. Cleared on exception in Debug Mode.
+ - 0 No Debug Data Break Store Exception
+ - 1 Debug Data Break Store Exception
+ This bit is read-only (R) and reads as zero if not
+ implemented. */
+ uint64_t dbp:1; /**< Indicates that a Debug Breakpoint exception
+ occurred. Cleared on exception in Debug Mode.
+ - 0 No Debug Breakpoint exception
+ - 1 Debug Breakpoint exception */
+ uint64_t dss:1; /**< Indicates that a Debug Single Step exception
+ occurred. Cleared on exception in Debug Mode.
+ - 0 No debug single-step exception
+ - 1 Debug single-step exception
+ This bit is read-only (R) and reads as zero if not
+ implemented. */
+ } s;
+} cvmx_debug_register_t;
+
+
+typedef struct
+{
+ void (*init)(void);
+ void (*install_break_handler)(void);
+ int needs_proxy;
+ int (*getpacket)(char *, size_t);
+ int (*putpacket)(char *);
+ void (*wait_for_resume)(volatile cvmx_debug_core_context_t *, cvmx_debug_state_t);
+ void (*change_core)(int, int);
+} cvmx_debug_comm_t;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __CVMX_DEBUG_H__ */
OpenPOWER on IntegriCloud