Messages with delivery mode Apic_Delivery_Mode_Ext_INT needs to be
acknowledged. They are acknowledged at the object pointed to by the apic's
"pic" attribute via the interrupt_cpu interface.
SIM_INTERFACE(apic_bus) {
apic_bus_status_t (*interrupt)(conf_object_t *obj,
apic_destination_mode_t dest_mode,
apic_delivery_mode_t delivery_mode,
int level_assert,
apic_trigger_mode_t trigger_mode,
uint8 vector,
uint8 destination);
};
#define APIC_BUS_INTERFACE "apic_bus"
typedef enum {
Apic_Destination_Mode_Physical = 0,
Apic_Destination_Mode_Logical = 1
} apic_destination_mode_t;
typedef enum {
Apic_Delivery_Mode_Fixed = 0,
Apic_Delivery_Mode_Lowest_Priority = 1,
Apic_Delivery_Mode_SMI = 2,
Apic_Delivery_Mode_Remote_Read = 3,
Apic_Delivery_Mode_NMI = 4,
Apic_Delivery_Mode_INIT = 5,
Apic_Delivery_Mode_Start_Up = 6,
Apic_Delivery_Mode_Ext_INT = 7
} apic_delivery_mode_t;
typedef enum {
Apic_Trigger_Mode_Edge = 0,
Apic_Trigger_Mode_Level = 1
} apic_trigger_mode_t;
typedef enum {
Apic_Bus_Accepted = 0,
Apic_Bus_Retry = 1,
Apic_Bus_No_Target = 2,
Apic_Bus_Invalid = 3
} apic_bus_status_t;
See the architecture software developer's manual for more information about the parameters. For IPIs, the sender is responsible for filtering out reserved vectors (vectors 0 through 15) and flagging the appropriate error on the sending side. For I/O-APIC initiated interrupts, reserved vectors can be sent and will flag errors in the receiving APICs.