Re: use of setjmp/longjmp in x86 emulator.

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Gleb Natapov
Date: Tuesday, March 2, 2010 - 1:49 am

On Mon, Mar 01, 2010 at 02:56:59PM -0800, H. Peter Anvin wrote:
Can I consider this as ACK for something like the patch blow? :) (with
proper x86 version of setjmp/longjmp of course).

diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index cfcb6f0..089a405 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -35,6 +35,45 @@
 #include "x86.h"
 #include "tss.h"
 
+typedef unsigned long jmp_buf[8];
+int setjmp(jmp_buf);
+void longjmp(jmp_buf, int);
+
+asm (
+"	.align 4\n"
+"	.type setjmp, @function\n"
+"setjmp:\n"
+"	pop  %rsi		# Return address, and adjust the stack\n"
+"	xorl %eax,%eax		# Return value\n"
+"	movq %rbx,(%rdi)\n"
+"	movq %rsp,8(%rdi)	# Post-return %rsp!\n"
+"	push %rsi		# Make the call/return stack happy\n"
+"	movq %rbp,16(%rdi)\n"
+"	movq %r12,24(%rdi)\n"
+"	movq %r13,32(%rdi)\n"
+"	movq %r14,40(%rdi)\n"
+"	movq %r15,48(%rdi)\n"
+"	movq %rsi,56(%rdi)	# Return address\n"
+"	ret\n"
+"	.size setjmp,.-setjmp\n"
+
+"	.align 4\n"
+"	.type longjmp, @function\n"
+"longjmp:\n"
+"	movl %esi,%eax		# Return value (int)\n"
+"	movq (%rdi),%rbx\n"
+"	movq 8(%rdi),%rsp\n"
+"	movq 16(%rdi),%rbp\n"
+"	movq 24(%rdi),%r12\n"
+"	movq 32(%rdi),%r13\n"
+"	movq 40(%rdi),%r14\n"
+"	movq 48(%rdi),%r15\n"
+"	jmp *56(%rdi)\n"
+"	.size longjmp,.-longjmp\n"
+	);
+
+static jmp_buf jb;
+
 /*
  * Opcode effective-address decode tables.
  * Note that we only emulate instructions that have at least one memory
@@ -1729,7 +1768,7 @@ static inline int writeback(struct x86_emulate_ctxt *ctxt,
 					c->dst.bytes,
 					ctxt->vcpu);
 		if (rc != X86EMUL_CONTINUE)
-			return rc;
+			longjmp(jb, 1);
 		break;
 	case OP_NONE:
 		/* no writeback */
@@ -2391,6 +2430,11 @@ x86_emulate_insn(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops)
 	memcpy(c->regs, ctxt->vcpu->arch.regs, sizeof c->regs);
 	saved_eip = c->eip;
 
+	if (setjmp(jb)) {
+		printk(KERN_ERR"setjump() == 1\n");
+		return 0;
+	}
+
 	if (ctxt->mode == X86EMUL_MODE_PROT64 && (c->d & No64)) {
 		kvm_queue_exception(ctxt->vcpu, UD_VECTOR);
 		goto done;
--
			Gleb.
--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
use of setjmp/longjmp in x86 emulator., Gleb Natapov, (Mon Mar 1, 2:18 am)
Re: use of setjmp/longjmp in x86 emulator., Takuya Yoshikawa, (Mon Mar 1, 5:45 am)
Re: use of setjmp/longjmp in x86 emulator., Gleb Natapov, (Mon Mar 1, 5:52 am)
Re: use of setjmp/longjmp in x86 emulator., Takuya Yoshikawa, (Mon Mar 1, 6:17 am)
Re: use of setjmp/longjmp in x86 emulator., Gleb Natapov, (Mon Mar 1, 6:26 am)
Re: use of setjmp/longjmp in x86 emulator., Zachary Amsden, (Mon Mar 1, 9:13 am)
Re: use of setjmp/longjmp in x86 emulator., Gleb Natapov, (Mon Mar 1, 10:47 am)
Re: use of setjmp/longjmp in x86 emulator., Zachary Amsden, (Mon Mar 1, 11:39 am)
Re: use of setjmp/longjmp in x86 emulator., Luca Barbieri, (Mon Mar 1, 11:47 am)
Re: use of setjmp/longjmp in x86 emulator., Gleb Natapov, (Mon Mar 1, 12:03 pm)
Re: use of setjmp/longjmp in x86 emulator., john cooper, (Mon Mar 1, 12:13 pm)
Re: use of setjmp/longjmp in x86 emulator., Zachary Amsden, (Mon Mar 1, 12:18 pm)
Re: use of setjmp/longjmp in x86 emulator., H. Peter Anvin, (Mon Mar 1, 3:31 pm)
Re: use of setjmp/longjmp in x86 emulator., H. Peter Anvin, (Mon Mar 1, 3:56 pm)
Re: use of setjmp/longjmp in x86 emulator., Zachary Amsden, (Mon Mar 1, 4:34 pm)
Re: use of setjmp/longjmp in x86 emulator., H. Peter Anvin, (Mon Mar 1, 4:43 pm)
Re: use of setjmp/longjmp in x86 emulator., Gleb Natapov, (Tue Mar 2, 12:28 am)
Re: use of setjmp/longjmp in x86 emulator., Gleb Natapov, (Tue Mar 2, 1:05 am)
Re: use of setjmp/longjmp in x86 emulator., Gleb Natapov, (Tue Mar 2, 1:49 am)
Re: use of setjmp/longjmp in x86 emulator., Avi Kivity, (Sun Mar 7, 2:00 am)
Re: use of setjmp/longjmp in x86 emulator., Avi Kivity, (Sun Mar 7, 2:04 am)
Re: use of setjmp/longjmp in x86 emulator., H. Peter Anvin, (Sun Mar 7, 5:08 pm)
Re: use of setjmp/longjmp in x86 emulator., Eric W. Biederman, (Mon Mar 8, 4:11 pm)
Re: use of setjmp/longjmp in x86 emulator., Gleb Natapov, (Mon Mar 8, 11:28 pm)