X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fdevices%2Fapic.c;h=5c5f7a4687414b008c752597c28f7df4459735d9;hb=52e81251f82ccaf516e3ed626c8abbcc9fbe3f41;hp=2d95008cc6b265ee647bf3301f47f468d6f6fcbc;hpb=82b8b87c344fcd1eab22e3f3be5ad54cbb3f8f68;p=palacios.git diff --git a/palacios/src/devices/apic.c b/palacios/src/devices/apic.c index 2d95008..5c5f7a4 100644 --- a/palacios/src/devices/apic.c +++ b/palacios/src/devices/apic.c @@ -236,9 +236,8 @@ static void init_apic_state(struct apic_state * apic) { static int read_apic_msr(uint_t msr, v3_msr_t * dst, void * priv_data) { struct vm_device * dev = (struct vm_device *)priv_data; struct apic_state * apic = (struct apic_state *)dev->private_data; - PrintError("READING APIC BASE ADDR: HI=%x LO=%x\n", apic->base_addr_msr.hi, apic->base_addr_msr.lo); - - return -1; + dst->value = apic->base_addr; + return 0; } @@ -337,7 +336,7 @@ static int apic_do_eoi(struct apic_state * apic) { *svc_location &= ~flag; -#ifdef CRAY_XT +#ifdef CONFIG_CRAY_XT if ((isr_irq == 238) || (isr_irq == 239)) { @@ -845,7 +844,7 @@ static int apic_write(addr_t guest_addr, void * src, uint_t length, void * priv_ /* Interrupt Controller Functions */ // returns 1 if an interrupt is pending, 0 otherwise -static int apic_intr_pending(void * private_data) { +static int apic_intr_pending(struct guest_info * info, void * private_data) { struct vm_device * dev = (struct vm_device *)private_data; struct apic_state * apic = (struct apic_state *)dev->private_data; int req_irq = get_highest_irr(apic); @@ -859,7 +858,7 @@ static int apic_intr_pending(void * private_data) { return 0; } -static int apic_get_intr_number(void * private_data) { +static int apic_get_intr_number(struct guest_info * info, void * private_data) { struct vm_device * dev = (struct vm_device *)private_data; struct apic_state * apic = (struct apic_state *)dev->private_data; int req_irq = get_highest_irr(apic); @@ -874,8 +873,8 @@ static int apic_get_intr_number(void * private_data) { return -1; } -static int apic_raise_intr(void * private_data, int irq) { -#ifdef CRAY_XT +static int apic_raise_intr(struct guest_info * info, void * private_data, int irq) { +#ifdef CONFIG_CRAY_XT // The Seastar is connected directly to the LAPIC via LINT0 on the ICC bus if (irq == 238) { @@ -885,14 +884,15 @@ static int apic_raise_intr(void * private_data, int irq) { return activate_apic_irq(apic, irq); } #endif + return 0; } -static int apic_lower_intr(void * private_data, int irq) { +static int apic_lower_intr(struct guest_info * info, void * private_data, int irq) { return 0; } -static int apic_begin_irq(void * private_data, int irq) { +static int apic_begin_irq(struct guest_info * info, void * private_data, int irq) { struct vm_device * dev = (struct vm_device *)private_data; struct apic_state * apic = (struct apic_state *)dev->private_data; int major_offset = (irq & ~0x00000007) >> 3; @@ -904,7 +904,7 @@ static int apic_begin_irq(void * private_data, int irq) { *svc_location |= flag; *req_location &= ~flag; -#ifdef CRAY_XT +#ifdef CONFIG_CRAY_XT if ((irq == 238) || (irq == 239)) { PrintError("APIC: Begin IRQ %d (ISR=%x), (IRR=%x)\n", irq, *svc_location, *req_location); } @@ -915,9 +915,17 @@ static int apic_begin_irq(void * private_data, int irq) { -int v3_apic_raise_intr(struct vm_device * apic_dev, int intr_num) { +int v3_apic_raise_intr(struct guest_info * info, struct vm_device * apic_dev, int intr_num) { struct apic_state * apic = (struct apic_state *)apic_dev->private_data; - return activate_apic_irq(apic, intr_num); + + if (activate_apic_irq(apic, intr_num) == -1) { + PrintError("Error: Could not activate apic_irq\n"); + return -1; + } + + v3_interrupt_cpu(info, 0); + + return 0; } @@ -991,7 +999,7 @@ static void apic_update_time(ullong_t cpu_cycles, ullong_t cpu_freq, void * priv PrintDebug("Raising APIC Timer interrupt (periodic=%d) (icnt=%d) (div=%d)\n", apic->tmr_vec_tbl.tmr_mode, apic->tmr_init_cnt, shift_num); - if (apic_intr_pending(priv_data)) { + if (apic_intr_pending(dev->vm, priv_data)) { PrintDebug("Overriding pending IRQ %d\n", apic_get_intr_number(priv_data)); }