diff options
Diffstat (limited to 'drivers/lguest/interrupts_and_traps.c')
-rw-r--r-- | drivers/lguest/interrupts_and_traps.c | 28 |
1 files changed, 14 insertions, 14 deletions
diff --git a/drivers/lguest/interrupts_and_traps.c b/drivers/lguest/interrupts_and_traps.c index 468faf8233d6..306b93c71dcc 100644 --- a/drivers/lguest/interrupts_and_traps.c +++ b/drivers/lguest/interrupts_and_traps.c | |||
@@ -178,7 +178,7 @@ void maybe_do_interrupt(struct lg_cpu *cpu) | |||
178 | /* Look at the IDT entry the Guest gave us for this interrupt. The | 178 | /* Look at the IDT entry the Guest gave us for this interrupt. The |
179 | * first 32 (FIRST_EXTERNAL_VECTOR) entries are for traps, so we skip | 179 | * first 32 (FIRST_EXTERNAL_VECTOR) entries are for traps, so we skip |
180 | * over them. */ | 180 | * over them. */ |
181 | idt = &lg->arch.idt[FIRST_EXTERNAL_VECTOR+irq]; | 181 | idt = &cpu->arch.idt[FIRST_EXTERNAL_VECTOR+irq]; |
182 | /* If they don't have a handler (yet?), we just ignore it */ | 182 | /* If they don't have a handler (yet?), we just ignore it */ |
183 | if (idt_present(idt->a, idt->b)) { | 183 | if (idt_present(idt->a, idt->b)) { |
184 | /* OK, mark it no longer pending and deliver it. */ | 184 | /* OK, mark it no longer pending and deliver it. */ |
@@ -251,15 +251,15 @@ int deliver_trap(struct lg_cpu *cpu, unsigned int num) | |||
251 | { | 251 | { |
252 | /* Trap numbers are always 8 bit, but we set an impossible trap number | 252 | /* Trap numbers are always 8 bit, but we set an impossible trap number |
253 | * for traps inside the Switcher, so check that here. */ | 253 | * for traps inside the Switcher, so check that here. */ |
254 | if (num >= ARRAY_SIZE(cpu->lg->arch.idt)) | 254 | if (num >= ARRAY_SIZE(cpu->arch.idt)) |
255 | return 0; | 255 | return 0; |
256 | 256 | ||
257 | /* Early on the Guest hasn't set the IDT entries (or maybe it put a | 257 | /* Early on the Guest hasn't set the IDT entries (or maybe it put a |
258 | * bogus one in): if we fail here, the Guest will be killed. */ | 258 | * bogus one in): if we fail here, the Guest will be killed. */ |
259 | if (!idt_present(cpu->lg->arch.idt[num].a, cpu->lg->arch.idt[num].b)) | 259 | if (!idt_present(cpu->arch.idt[num].a, cpu->arch.idt[num].b)) |
260 | return 0; | 260 | return 0; |
261 | set_guest_interrupt(cpu, cpu->lg->arch.idt[num].a, | 261 | set_guest_interrupt(cpu, cpu->arch.idt[num].a, |
262 | cpu->lg->arch.idt[num].b, has_err(num)); | 262 | cpu->arch.idt[num].b, has_err(num)); |
263 | return 1; | 263 | return 1; |
264 | } | 264 | } |
265 | 265 | ||
@@ -385,7 +385,7 @@ static void set_trap(struct lguest *lg, struct desc_struct *trap, | |||
385 | * | 385 | * |
386 | * We saw the Guest setting Interrupt Descriptor Table (IDT) entries with the | 386 | * We saw the Guest setting Interrupt Descriptor Table (IDT) entries with the |
387 | * LHCALL_LOAD_IDT_ENTRY hypercall before: that comes here. */ | 387 | * LHCALL_LOAD_IDT_ENTRY hypercall before: that comes here. */ |
388 | void load_guest_idt_entry(struct lguest *lg, unsigned int num, u32 lo, u32 hi) | 388 | void load_guest_idt_entry(struct lg_cpu *cpu, unsigned int num, u32 lo, u32 hi) |
389 | { | 389 | { |
390 | /* Guest never handles: NMI, doublefault, spurious interrupt or | 390 | /* Guest never handles: NMI, doublefault, spurious interrupt or |
391 | * hypercall. We ignore when it tries to set them. */ | 391 | * hypercall. We ignore when it tries to set them. */ |
@@ -394,13 +394,13 @@ void load_guest_idt_entry(struct lguest *lg, unsigned int num, u32 lo, u32 hi) | |||
394 | 394 | ||
395 | /* Mark the IDT as changed: next time the Guest runs we'll know we have | 395 | /* Mark the IDT as changed: next time the Guest runs we'll know we have |
396 | * to copy this again. */ | 396 | * to copy this again. */ |
397 | lg->changed |= CHANGED_IDT; | 397 | cpu->lg->changed |= CHANGED_IDT; |
398 | 398 | ||
399 | /* Check that the Guest doesn't try to step outside the bounds. */ | 399 | /* Check that the Guest doesn't try to step outside the bounds. */ |
400 | if (num >= ARRAY_SIZE(lg->arch.idt)) | 400 | if (num >= ARRAY_SIZE(cpu->arch.idt)) |
401 | kill_guest(lg, "Setting idt entry %u", num); | 401 | kill_guest(cpu->lg, "Setting idt entry %u", num); |
402 | else | 402 | else |
403 | set_trap(lg, &lg->arch.idt[num], num, lo, hi); | 403 | set_trap(cpu->lg, &cpu->arch.idt[num], num, lo, hi); |
404 | } | 404 | } |
405 | 405 | ||
406 | /* The default entry for each interrupt points into the Switcher routines which | 406 | /* The default entry for each interrupt points into the Switcher routines which |
@@ -436,14 +436,14 @@ void setup_default_idt_entries(struct lguest_ro_state *state, | |||
436 | /*H:240 We don't use the IDT entries in the "struct lguest" directly, instead | 436 | /*H:240 We don't use the IDT entries in the "struct lguest" directly, instead |
437 | * we copy them into the IDT which we've set up for Guests on this CPU, just | 437 | * we copy them into the IDT which we've set up for Guests on this CPU, just |
438 | * before we run the Guest. This routine does that copy. */ | 438 | * before we run the Guest. This routine does that copy. */ |
439 | void copy_traps(const struct lguest *lg, struct desc_struct *idt, | 439 | void copy_traps(const struct lg_cpu *cpu, struct desc_struct *idt, |
440 | const unsigned long *def) | 440 | const unsigned long *def) |
441 | { | 441 | { |
442 | unsigned int i; | 442 | unsigned int i; |
443 | 443 | ||
444 | /* We can simply copy the direct traps, otherwise we use the default | 444 | /* We can simply copy the direct traps, otherwise we use the default |
445 | * ones in the Switcher: they will return to the Host. */ | 445 | * ones in the Switcher: they will return to the Host. */ |
446 | for (i = 0; i < ARRAY_SIZE(lg->arch.idt); i++) { | 446 | for (i = 0; i < ARRAY_SIZE(cpu->arch.idt); i++) { |
447 | /* If no Guest can ever override this trap, leave it alone. */ | 447 | /* If no Guest can ever override this trap, leave it alone. */ |
448 | if (!direct_trap(i)) | 448 | if (!direct_trap(i)) |
449 | continue; | 449 | continue; |
@@ -452,8 +452,8 @@ void copy_traps(const struct lguest *lg, struct desc_struct *idt, | |||
452 | * Interrupt gates (type 14) disable interrupts as they are | 452 | * Interrupt gates (type 14) disable interrupts as they are |
453 | * entered, which we never let the Guest do. Not present | 453 | * entered, which we never let the Guest do. Not present |
454 | * entries (type 0x0) also can't go direct, of course. */ | 454 | * entries (type 0x0) also can't go direct, of course. */ |
455 | if (idt_type(lg->arch.idt[i].a, lg->arch.idt[i].b) == 0xF) | 455 | if (idt_type(cpu->arch.idt[i].a, cpu->arch.idt[i].b) == 0xF) |
456 | idt[i] = lg->arch.idt[i]; | 456 | idt[i] = cpu->arch.idt[i]; |
457 | else | 457 | else |
458 | /* Reset it to the default. */ | 458 | /* Reset it to the default. */ |
459 | default_idt_entry(&idt[i], i, def[i]); | 459 | default_idt_entry(&idt[i], i, def[i]); |