diff options
| -rw-r--r-- | arch/x86/lguest/boot.c | 21 | ||||
| -rw-r--r-- | drivers/lguest/lguest_device.c | 6 |
2 files changed, 20 insertions, 7 deletions
diff --git a/arch/x86/lguest/boot.c b/arch/x86/lguest/boot.c index 92f1c6f3e19d..960a8d9c049c 100644 --- a/arch/x86/lguest/boot.c +++ b/arch/x86/lguest/boot.c | |||
| @@ -343,6 +343,11 @@ static void lguest_cpuid(unsigned int *ax, unsigned int *bx, | |||
| 343 | * flush_tlb_user() for both user and kernel mappings unless | 343 | * flush_tlb_user() for both user and kernel mappings unless |
| 344 | * the Page Global Enable (PGE) feature bit is set. */ | 344 | * the Page Global Enable (PGE) feature bit is set. */ |
| 345 | *dx |= 0x00002000; | 345 | *dx |= 0x00002000; |
| 346 | /* We also lie, and say we're family id 5. 6 or greater | ||
| 347 | * leads to a rdmsr in early_init_intel which we can't handle. | ||
| 348 | * Family ID is returned as bits 8-12 in ax. */ | ||
| 349 | *ax &= 0xFFFFF0FF; | ||
| 350 | *ax |= 0x00000500; | ||
| 346 | break; | 351 | break; |
| 347 | case 0x80000000: | 352 | case 0x80000000: |
| 348 | /* Futureproof this a little: if they ask how much extended | 353 | /* Futureproof this a little: if they ask how much extended |
| @@ -589,19 +594,21 @@ static void __init lguest_init_IRQ(void) | |||
| 589 | /* Some systems map "vectors" to interrupts weirdly. Lguest has | 594 | /* Some systems map "vectors" to interrupts weirdly. Lguest has |
| 590 | * a straightforward 1 to 1 mapping, so force that here. */ | 595 | * a straightforward 1 to 1 mapping, so force that here. */ |
| 591 | __get_cpu_var(vector_irq)[vector] = i; | 596 | __get_cpu_var(vector_irq)[vector] = i; |
| 592 | if (vector != SYSCALL_VECTOR) { | 597 | if (vector != SYSCALL_VECTOR) |
| 593 | set_intr_gate(vector, | 598 | set_intr_gate(vector, interrupt[i]); |
| 594 | interrupt[vector-FIRST_EXTERNAL_VECTOR]); | ||
| 595 | set_irq_chip_and_handler_name(i, &lguest_irq_controller, | ||
| 596 | handle_level_irq, | ||
| 597 | "level"); | ||
| 598 | } | ||
| 599 | } | 599 | } |
| 600 | /* This call is required to set up for 4k stacks, where we have | 600 | /* This call is required to set up for 4k stacks, where we have |
| 601 | * separate stacks for hard and soft interrupts. */ | 601 | * separate stacks for hard and soft interrupts. */ |
| 602 | irq_ctx_init(smp_processor_id()); | 602 | irq_ctx_init(smp_processor_id()); |
| 603 | } | 603 | } |
| 604 | 604 | ||
| 605 | void lguest_setup_irq(unsigned int irq) | ||
| 606 | { | ||
| 607 | irq_to_desc_alloc_cpu(irq, 0); | ||
| 608 | set_irq_chip_and_handler_name(irq, &lguest_irq_controller, | ||
| 609 | handle_level_irq, "level"); | ||
| 610 | } | ||
| 611 | |||
| 605 | /* | 612 | /* |
| 606 | * Time. | 613 | * Time. |
| 607 | * | 614 | * |
diff --git a/drivers/lguest/lguest_device.c b/drivers/lguest/lguest_device.c index b4d44e571d76..8132533d71f9 100644 --- a/drivers/lguest/lguest_device.c +++ b/drivers/lguest/lguest_device.c | |||
| @@ -212,6 +212,9 @@ static void lg_notify(struct virtqueue *vq) | |||
| 212 | hcall(LHCALL_NOTIFY, lvq->config.pfn << PAGE_SHIFT, 0, 0); | 212 | hcall(LHCALL_NOTIFY, lvq->config.pfn << PAGE_SHIFT, 0, 0); |
| 213 | } | 213 | } |
| 214 | 214 | ||
| 215 | /* An extern declaration inside a C file is bad form. Don't do it. */ | ||
| 216 | extern void lguest_setup_irq(unsigned int irq); | ||
| 217 | |||
| 215 | /* This routine finds the first virtqueue described in the configuration of | 218 | /* This routine finds the first virtqueue described in the configuration of |
| 216 | * this device and sets it up. | 219 | * this device and sets it up. |
| 217 | * | 220 | * |
| @@ -266,6 +269,9 @@ static struct virtqueue *lg_find_vq(struct virtio_device *vdev, | |||
| 266 | goto unmap; | 269 | goto unmap; |
| 267 | } | 270 | } |
| 268 | 271 | ||
| 272 | /* Make sure the interrupt is allocated. */ | ||
| 273 | lguest_setup_irq(lvq->config.irq); | ||
| 274 | |||
| 269 | /* Tell the interrupt for this virtqueue to go to the virtio_ring | 275 | /* Tell the interrupt for this virtqueue to go to the virtio_ring |
| 270 | * interrupt handler. */ | 276 | * interrupt handler. */ |
| 271 | /* FIXME: We used to have a flag for the Host to tell us we could use | 277 | /* FIXME: We used to have a flag for the Host to tell us we could use |
