@@ -224,6 +224,32 @@ static int apic_compare_prio(struct APICCommonState *cpu1,
return apic_get_arb_pri(cpu1) - apic_get_arb_pri(cpu2);
}
+static bool apic_match_physical_dest(struct APICCommonState *apic, uint8_t dest)
+{
+ return (dest == 0xff || apic->id == dest);
+}
+
+static bool apic_match_logical_dest(struct APICCommonState *apic, uint8_t dest)
+{
+ if (apic->dest_mode == 0xf) {
+ return (dest & apic->log_dest) > 0;
+ } else if (apic->dest_mode == 0) {
+ return ((dest & 0xf0) == (apic->log_dest & 0xf0)) &&
+ (dest & apic->log_dest & 0x0f) > 0;
+ }
+ return false;
+}
+
+static bool apic_match_dest(struct APICCommonState *apic, uint8_t dest_mode,
+ uint8_t dest)
+{
+ if (dest_mode == 0) {
+ return apic_match_physical_dest(apic, dest);
+ } else {
+ return apic_match_logical_dest(apic, dest);
+ }
+}
+
static void apic_bus_deliver(const uint32_t *deliver_bitmask,
uint8_t delivery_mode, uint8_t vector_num,
uint8_t trigger_mode)
Added three helper functions apic_match_dest(), apic_match_physical_dest(), and apic_match_logical_dest() which can be used to determine if a logical or physical APIC ID match a given LAPIC under a given dest_mode. This does not account for shorthand. Signed-off-by: James Sullivan <sullivan.james.f@gmail.com> --- hw/intc/apic.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+)