summaryrefslogtreecommitdiff
path: root/sys/inc/arch/amd64
diff options
context:
space:
mode:
Diffstat (limited to 'sys/inc/arch/amd64')
-rw-r--r--sys/inc/arch/amd64/lapic.h65
1 files changed, 65 insertions, 0 deletions
diff --git a/sys/inc/arch/amd64/lapic.h b/sys/inc/arch/amd64/lapic.h
index 4f82681..ba3b333 100644
--- a/sys/inc/arch/amd64/lapic.h
+++ b/sys/inc/arch/amd64/lapic.h
@@ -30,9 +30,74 @@
#ifndef _MACHINE_LAPIC_H_
#define _MACHINE_LAPIC_H_ 1
+#include <sys/types.h>
+#include <mu/cpu.h>
+
#define LAPIC_TMR_VEC 0x81
/*
+ * Represents possible values of the destination shorthand
+ * field for inter-processor interrupts
+ *
+ * @IPI_SHAND_NONE: No shorthand
+ * @IPI_SHAND_SELF: Address self
+ * @IPI_SHAND_AIS: All including self
+ * @IPIS_HAND_AXS: All excluding self
+ */
+typedef enum {
+ IPI_SHAND_NONE,
+ IPI_SHAND_SELF,
+ IPI_SHAND_AIS,
+ IPI_SHAND_AXS
+} ipi_shand_t;
+
+/*
+ * Represents possible values of the delivery mode
+ * field for inter-processor interrupts
+ *
+ * @IPI_DELMOD_FIXED: Deliver vector to processor target(s)
+ * @IPI_DELMOD_LOPRI: Lowest priority [SDM advises against its use]
+ * @IPI_DELMOD_SMI: Reserved
+ * @IPI_DELMOD_RESERVED: Reserved
+ * @IPI_DELMOD_NMI: Deliver a non-maskable interrupt [vector unused]
+ * @IPI_DELMOD_INIT: Park a processor to the reset vector
+ * @IPI_DELMOD_STARTUP: Bring a processor up into real mode
+ */
+typedef enum {
+ IPI_DELMOD_FIXED,
+ IPI_DELMOD_LOPRI,
+ IPI_DELMOD_SMI,
+ IPI_DELMOD_RESERVED,
+ IPI_DELMOD_NMI,
+ IPI_DELMOD_INIT,
+ IPI_DELMOD_STARTUP
+} ipi_delmod_t;
+
+/*
+ * Represents an inter-processor interrupt descriptor
+ *
+ * @dest_id: APIC ID of destination processor
+ * @vector: Interrupt vector to send
+ * @delmod: Delivery mode
+ * @shorthand: Destination shorthand
+ * @logical_dest: Set if destination mode should be logical
+ */
+struct lapic_ipi {
+ uint64_t dest_id;
+ uint8_t vector;
+ ipi_delmod_t delmod : 3;
+ ipi_shand_t shorthand : 2;
+ uint8_t logical_dest : 1;
+};
+
+/*
+ * Send an interprocessor interrupt
+ *
+ * Returns zero on success
+ */
+int lapic_send_ipi(struct mcb *mcb, struct lapic_ipi *ipi);
+
+/*
* Initialize the Local APIC on-board the
* processor for the current core
*/