From d9556a543f570e21260c4d516d325c4c7bc7e933 Mon Sep 17 00:00:00 2001 From: Andrei Vagin Date: Wed, 7 Sep 2022 15:26:00 -0700 Subject: [PATCH] kvm: handle a case when a bounce interrupt is triggred in gr0 We disable interrupts in gr0, but go-runtime can resume a routine that has been suspend in hr3. In this case, it restores eflags with the IF flag. PiperOrigin-RevId: 472826101 --- pkg/sentry/platform/kvm/bluepill_amd64.go | 9 +++++---- pkg/sentry/platform/kvm/bluepill_unsafe.go | 1 - 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pkg/sentry/platform/kvm/bluepill_amd64.go b/pkg/sentry/platform/kvm/bluepill_amd64.go index 0ba7a0d0f..c1be709a8 100644 --- a/pkg/sentry/platform/kvm/bluepill_amd64.go +++ b/pkg/sentry/platform/kvm/bluepill_amd64.go @@ -128,10 +128,11 @@ func (c *vCPU) KernelSyscall() { func (c *vCPU) KernelException(vector ring0.Vector) { regs := c.Registers() if vector == ring0.Vector(bounce) { - // These should not interrupt kernel execution; point the Rip - // to zero to ensure that we get a reasonable panic when we - // attempt to return and a full stack trace. - regs.Rip = 0 + // This go-routine was saved in hr3 and resumed in gr0 with the + // userspace flags. Let's adjust flags and skip the interrupt. + regs.Eflags &^= uint64(ring0.KernelFlagsClear) + regs.Eflags |= ring0.KernelFlagsSet + return } // See above. ring0.HaltAndWriteFSBase(regs) // escapes: no, reload host segment. diff --git a/pkg/sentry/platform/kvm/bluepill_unsafe.go b/pkg/sentry/platform/kvm/bluepill_unsafe.go index cc6949d6c..853b5789d 100644 --- a/pkg/sentry/platform/kvm/bluepill_unsafe.go +++ b/pkg/sentry/platform/kvm/bluepill_unsafe.go @@ -221,7 +221,6 @@ func bluepillHandler(context unsafe.Pointer) { c.die(bluepillArchContext(context), "entry failed") return default: - printHex([]byte("exitReason="), uint64(c.runData.exitReason)) bluepillArchHandleExit(c, context) return }