|
@@ -321,8 +321,11 @@
|
|
/** hv_console_set_ipi */
|
|
/** hv_console_set_ipi */
|
|
#define HV_DISPATCH_CONSOLE_SET_IPI 63
|
|
#define HV_DISPATCH_CONSOLE_SET_IPI 63
|
|
|
|
|
|
|
|
+/** hv_send_nmi */
|
|
|
|
+#define HV_DISPATCH_SEND_NMI 65
|
|
|
|
+
|
|
/** One more than the largest dispatch value */
|
|
/** One more than the largest dispatch value */
|
|
-#define _HV_DISPATCH_END 64
|
|
|
|
|
|
+#define _HV_DISPATCH_END 66
|
|
|
|
|
|
|
|
|
|
#ifndef __ASSEMBLER__
|
|
#ifndef __ASSEMBLER__
|
|
@@ -1253,6 +1256,11 @@ void hv_downcall_dispatch(void);
|
|
#define INT_DMATLB_ACCESS_DWNCL INT_DMA_CPL
|
|
#define INT_DMATLB_ACCESS_DWNCL INT_DMA_CPL
|
|
/** Device interrupt downcall interrupt vector */
|
|
/** Device interrupt downcall interrupt vector */
|
|
#define INT_DEV_INTR_DWNCL INT_WORLD_ACCESS
|
|
#define INT_DEV_INTR_DWNCL INT_WORLD_ACCESS
|
|
|
|
+/** NMI downcall interrupt vector */
|
|
|
|
+#define INT_NMI_DWNCL 64
|
|
|
|
+
|
|
|
|
+#define HV_NMI_FLAG_FORCE 0x1 /**< Force an NMI downcall regardless of
|
|
|
|
+ the ICS bit of the client. */
|
|
|
|
|
|
#ifndef __ASSEMBLER__
|
|
#ifndef __ASSEMBLER__
|
|
|
|
|
|
@@ -1780,6 +1788,56 @@ int hv_dev_poll(int devhdl, __hv32 events, HV_IntArg intarg);
|
|
int hv_dev_poll_cancel(int devhdl);
|
|
int hv_dev_poll_cancel(int devhdl);
|
|
|
|
|
|
|
|
|
|
|
|
+/** NMI information */
|
|
|
|
+typedef struct
|
|
|
|
+{
|
|
|
|
+ /** Result: negative error, or HV_NMI_RESULT_xxx. */
|
|
|
|
+ int result;
|
|
|
|
+
|
|
|
|
+ /** PC from interrupted remote core (if result != HV_NMI_RESULT_FAIL_HV). */
|
|
|
|
+ HV_VirtAddr pc;
|
|
|
|
+
|
|
|
|
+} HV_NMI_Info;
|
|
|
|
+
|
|
|
|
+/** NMI issued successfully. */
|
|
|
|
+#define HV_NMI_RESULT_OK 0
|
|
|
|
+
|
|
|
|
+/** NMI not issued: remote tile running at client PL with ICS set. */
|
|
|
|
+#define HV_NMI_RESULT_FAIL_ICS 1
|
|
|
|
+
|
|
|
|
+/** NMI not issued: remote tile waiting in hypervisor. */
|
|
|
|
+#define HV_NMI_RESULT_FAIL_HV 2
|
|
|
|
+
|
|
|
|
+/** Force an NMI downcall regardless of the ICS bit of the client. */
|
|
|
|
+#define HV_NMI_FLAG_FORCE 0x1
|
|
|
|
+
|
|
|
|
+/** Send an NMI interrupt request to a particular tile.
|
|
|
|
+ *
|
|
|
|
+ * This will cause the NMI to be issued on the remote tile regardless
|
|
|
|
+ * of the state of the client interrupt mask. However, if the remote
|
|
|
|
+ * tile is in the hypervisor, it will not execute the NMI, and
|
|
|
|
+ * HV_NMI_RESULT_FAIL_HV will be returned. Similarly, if the remote
|
|
|
|
+ * tile is in a client interrupt critical section at the time of the
|
|
|
|
+ * NMI, it will not execute the NMI, and HV_NMI_RESULT_FAIL_ICS will
|
|
|
|
+ * be returned. In this second case, however, if HV_NMI_FLAG_FORCE
|
|
|
|
+ * is set in flags, then the remote tile will enter its NMI interrupt
|
|
|
|
+ * vector regardless. Forcing the NMI vector during an interrupt
|
|
|
|
+ * critical section will mean that the client can not safely continue
|
|
|
|
+ * execution after handling the interrupt.
|
|
|
|
+ *
|
|
|
|
+ * @param tile Tile to which the NMI request is sent.
|
|
|
|
+ * @param info NMI information which is defined by and interpreted by the
|
|
|
|
+ * supervisor, is passed to the specified tile, and is
|
|
|
|
+ * stored in the SPR register SYSTEM_SAVE_{CLIENT_PL}_2 on the
|
|
|
|
+ * specified tile when entering the NMI handler routine.
|
|
|
|
+ * Typically, this parameter stores the NMI type, or an aligned
|
|
|
|
+ * VA plus some special bits, etc.
|
|
|
|
+ * @param flags Flags (HV_NMI_FLAG_xxx).
|
|
|
|
+ * @return Information about the requested NMI.
|
|
|
|
+ */
|
|
|
|
+HV_NMI_Info hv_send_nmi(HV_Coord tile, unsigned long info, __hv64 flags);
|
|
|
|
+
|
|
|
|
+
|
|
/** Scatter-gather list for preada/pwritea calls. */
|
|
/** Scatter-gather list for preada/pwritea calls. */
|
|
typedef struct
|
|
typedef struct
|
|
#if CHIP_VA_WIDTH() <= 32
|
|
#if CHIP_VA_WIDTH() <= 32
|