vancouver: Nested events during EPT violation

When an EPT/NPT fault occurs during IDT vectoring, the original event must
be reinjected.  Additionally we may have to inject an IRQ window if another
event is already pending.
This commit is contained in:
Markus Partheymueller 2012-10-15 14:25:07 +02:00 committed by Norman Feske
parent 1434d0948a
commit 5c886b4962
1 changed files with 8 additions and 2 deletions

View File

@ -446,8 +446,14 @@ class Vcpu_dispatcher : public Genode::Thread<STACK_SIZE>,
utcb->mtd = 0;
/* EPT violation during IDT vectoring? */
if (utcb->inj_info & 0x80000000)
Logging::panic("EPT violation during IDT vectoring - not handled\n");
if (utcb->inj_info & 0x80000000) {
utcb->mtd |= MTD_INJ;
Logging::printf("EPT violation during IDT vectoring.\n");
CpuMessage _win(CpuMessage::TYPE_CALC_IRQWINDOW, static_cast<CpuState *>(utcb), utcb->mtd);
_win.mtr_out = MTD_INJ;
if (!_vcpu->executor.send(_win, true))
Logging::panic("nobody to execute %s at %x:%x\n", __func__, utcb->cs.sel, utcb->eip);
}
Nova::Utcb * u = (Nova::Utcb *)utcb;
u->set_msg_word(0);