From: Rusty Russell Date: Thu, 5 Sep 2013 08:15:53 +0000 (+0930) Subject: lguest: fix guest kernel stack overflow when TF bit set. X-Git-Tag: v3.12-rc1~85^2~2 X-Git-Url: https://git.kernel.dk/?a=commitdiff_plain;h=98fb4e5e6b100a247ce2dbf2d1699726fdcdef20;p=linux-2.6-block.git lguest: fix guest kernel stack overflow when TF bit set. The symptoms are that running gdb on a binary causes the guest to overflow the kernels stack (after some period of time), resulting in it finally being killed with a "Bad address" message. Reported-by: Sakari Ailus Signed-off-by: Rusty Russell --- diff --git a/drivers/lguest/interrupts_and_traps.c b/drivers/lguest/interrupts_and_traps.c index 28433a155d67..70dfcdc29f1f 100644 --- a/drivers/lguest/interrupts_and_traps.c +++ b/drivers/lguest/interrupts_and_traps.c @@ -139,6 +139,16 @@ static void set_guest_interrupt(struct lg_cpu *cpu, u32 lo, u32 hi, cpu->regs->cs = (__KERNEL_CS|GUEST_PL); cpu->regs->eip = idt_address(lo, hi); + /* + * Trapping always clears these flags: + * TF: Trap flag + * VM: Virtual 8086 mode + * RF: Resume + * NT: Nested task. + */ + cpu->regs->eflags &= + ~(X86_EFLAGS_TF|X86_EFLAGS_VM|X86_EFLAGS_RF|X86_EFLAGS_NT); + /* * There are two kinds of interrupt handlers: 0xE is an "interrupt * gate" which expects interrupts to be disabled on entry.