X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fdevices%2Fapic.c;h=306449007cc0533f420a3134ba5535813cd62c1b;hb=e531d13b53ac8b32bca19131dd7a2824cb17eff9;hp=ad684f1cb2b04839b0d79ab581f52ddeaea381ac;hpb=d25220596e7ceb6b06a4b715f722a47afd8b48bb;p=palacios.git diff --git a/palacios/src/devices/apic.c b/palacios/src/devices/apic.c index ad684f1..3064490 100644 --- a/palacios/src/devices/apic.c +++ b/palacios/src/devices/apic.c @@ -118,6 +118,8 @@ typedef enum { APIC_TMR_INT, APIC_THERM_INT, APIC_PERF_INT, + + struct apic_msr { union { uint64_t value; @@ -133,8 +135,6 @@ struct apic_msr { } __attribute__((packed)); - - struct apic_state { addr_t base_addr; @@ -188,6 +188,10 @@ struct apic_state { v3_lock_t lock; }; + + + + static int apic_read(struct guest_info * core, addr_t guest_addr, void * dst, uint_t length, void * priv_data); static int apic_write(struct guest_info * core, addr_t guest_addr, void * src, uint_t length, void * priv_data); @@ -888,7 +892,9 @@ static int apic_write(struct guest_info * core, addr_t guest_addr, void * src, u // ICC??? PrintDebug("apic %u: core %u: sending cmd 0x%llx to apic %u\n",apic->lapic_id.val,core->cpu_id, apic->int_cmd.val, apic->int_cmd.dst); - v3_icc_send_ipi(apic->icc_bus, apic->lapic_id.val, apic->int_cmd.val,0); + if (v3_icc_send_ipi(apic->icc_bus, apic->lapic_id.val, apic->int_cmd.val,apic->dst_fmt.val,0)==-1) { + return -1; + } break; case INT_CMD_HI_OFFSET: apic->int_cmd.hi = op_val; @@ -1098,8 +1104,20 @@ static struct v3_device_ops dev_ops = { +static int apic_should_deliver_flat(struct guest_info * core, uint8_t mda, void * private_data) +{ + struct apic_state * apic = (struct apic_state *)private_data; + + if (mda==0xff || (apic->log_dst.dst_log_id & mda)) { + return 1; + } else { + return 0; + } +} + static struct v3_icc_ops icc_ops = { .raise_intr = apic_raise_intr, + .should_deliver_flat = apic_should_deliver_flat, };