From 5c886b49627fb0a48b0df55a6c675d67c7797f5b Mon Sep 17 00:00:00 2001 From: Markus Partheymueller Date: Mon, 15 Oct 2012 14:25:07 +0200 Subject: [PATCH] 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. --- ports/src/vancouver/main.cc | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/ports/src/vancouver/main.cc b/ports/src/vancouver/main.cc index 419dfc7f74..2af27a5e59 100644 --- a/ports/src/vancouver/main.cc +++ b/ports/src/vancouver/main.cc @@ -446,8 +446,14 @@ class Vcpu_dispatcher : public Genode::Thread, 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(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);