All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/5] Big real mode - addendum
@ 2012-06-13 14:30 Avi Kivity
  2012-06-13 14:30 ` [PATCH 1/5] KVM: x86 emulator: emulate BSWAP Avi Kivity
                   ` (4 more replies)
  0 siblings, 5 replies; 7+ messages in thread
From: Avi Kivity @ 2012-06-13 14:30 UTC (permalink / raw)
  To: Marcelo Tosatti, kvm

Some testing unconvered a few more missing instructions; here they are.

Avi Kivity (5):
  KVM: x86 emulator: emulate BSWAP
  KVM: x86 emulator: emulate LLDT
  KVM: x86 emulator: make read_segment_descriptor() return the address
  KVM: x86 emulator: make loading TR set the busy bit
  KVM: x86 emulator: implement LTR

 arch/x86/kvm/emulate.c |   63 ++++++++++++++++++++++++++++++++++++++++--------
 1 file changed, 53 insertions(+), 10 deletions(-)

-- 
1.7.10.1


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH 1/5] KVM: x86 emulator: emulate BSWAP
  2012-06-13 14:30 [PATCH 0/5] Big real mode - addendum Avi Kivity
@ 2012-06-13 14:30 ` Avi Kivity
  2012-06-13 14:30 ` [PATCH 2/5] KVM: x86 emulator: emulate LLDT Avi Kivity
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 7+ messages in thread
From: Avi Kivity @ 2012-06-13 14:30 UTC (permalink / raw)
  To: Marcelo Tosatti, kvm

Opcodes 0F C8 - 0F CF.

Used by the SeaBIOS cdrom code (though not in big real mode).

Signed-off-by: Avi Kivity <avi@redhat.com>
---
 arch/x86/kvm/emulate.c |   20 ++++++++++++++++++--
 1 file changed, 18 insertions(+), 2 deletions(-)

diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index c804db2..4eea1e4 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -3255,6 +3255,21 @@ static int em_lahf(struct x86_emulate_ctxt *ctxt)
 	return X86EMUL_CONTINUE;
 }
 
+static int em_bswap(struct x86_emulate_ctxt *ctxt)
+{
+	switch (ctxt->op_bytes) {
+#ifdef CONFIG_X86_64
+	case 8:
+		asm("bswap %0" : "+r"(ctxt->dst.val));
+		break;
+#endif
+	default:
+		asm("bswap %0" : "+r"(*(u32 *)&ctxt->dst.val));
+		break;
+	}
+	return X86EMUL_CONTINUE;
+}
+
 static bool valid_cr(int nr)
 {
 	switch (nr) {
@@ -3771,11 +3786,12 @@ static int check_perm_out(struct x86_emulate_ctxt *ctxt)
 	I(DstMem | SrcReg | ModRM | BitOp | Lock | PageTable, em_btc),
 	I(DstReg | SrcMem | ModRM, em_bsf), I(DstReg | SrcMem | ModRM, em_bsr),
 	D(DstReg | SrcMem8 | ModRM | Mov), D(DstReg | SrcMem16 | ModRM | Mov),
-	/* 0xC0 - 0xCF */
+	/* 0xC0 - 0xC7 */
 	D2bv(DstMem | SrcReg | ModRM | Lock),
 	N, D(DstMem | SrcReg | ModRM | Mov),
 	N, N, N, GD(0, &group9),
-	N, N, N, N, N, N, N, N,
+	/* 0xC8 - 0xCF */
+	X8(I(DstReg, em_bswap)),
 	/* 0xD0 - 0xDF */
 	N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N,
 	/* 0xE0 - 0xEF */
-- 
1.7.10.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 2/5] KVM: x86 emulator: emulate LLDT
  2012-06-13 14:30 [PATCH 0/5] Big real mode - addendum Avi Kivity
  2012-06-13 14:30 ` [PATCH 1/5] KVM: x86 emulator: emulate BSWAP Avi Kivity
@ 2012-06-13 14:30 ` Avi Kivity
  2012-06-13 14:30 ` [PATCH 3/5] KVM: x86 emulator: make read_segment_descriptor() return the address Avi Kivity
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 7+ messages in thread
From: Avi Kivity @ 2012-06-13 14:30 UTC (permalink / raw)
  To: Marcelo Tosatti, kvm

Opcode 0F 00 /2. Used by isolinux durign the protected mode transition.

Signed-off-by: Avi Kivity <avi@redhat.com>
---
 arch/x86/kvm/emulate.c |   11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index 4eea1e4..85f7a5f 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -3006,6 +3006,15 @@ static int em_mov_sreg_rm(struct x86_emulate_ctxt *ctxt)
 	return load_segment_descriptor(ctxt, sel, ctxt->modrm_reg);
 }
 
+static int em_lldt(struct x86_emulate_ctxt *ctxt)
+{
+	u16 sel = ctxt->src.val;
+
+	/* Disable writeback. */
+	ctxt->dst.type = OP_NONE;
+	return load_segment_descriptor(ctxt, sel, VCPU_SREG_LDTR);
+}
+
 static int em_invlpg(struct x86_emulate_ctxt *ctxt)
 {
 	int rc;
@@ -3551,7 +3560,7 @@ static int check_perm_out(struct x86_emulate_ctxt *ctxt)
 static struct opcode group6[] = {
 	DI(Prot,	sldt),
 	DI(Prot,	str),
-	DI(Prot | Priv,	lldt),
+	II(Prot | Priv | SrcMem16, em_lldt, lldt),
 	DI(Prot | Priv,	ltr),
 	N, N, N, N,
 };
-- 
1.7.10.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 3/5] KVM: x86 emulator: make read_segment_descriptor() return the address
  2012-06-13 14:30 [PATCH 0/5] Big real mode - addendum Avi Kivity
  2012-06-13 14:30 ` [PATCH 1/5] KVM: x86 emulator: emulate BSWAP Avi Kivity
  2012-06-13 14:30 ` [PATCH 2/5] KVM: x86 emulator: emulate LLDT Avi Kivity
@ 2012-06-13 14:30 ` Avi Kivity
  2012-06-13 14:30 ` [PATCH 4/5] KVM: x86 emulator: make loading TR set the busy bit Avi Kivity
  2012-06-13 14:30 ` [PATCH 5/5] KVM: x86 emulator: implement LTR Avi Kivity
  4 siblings, 0 replies; 7+ messages in thread
From: Avi Kivity @ 2012-06-13 14:30 UTC (permalink / raw)
  To: Marcelo Tosatti, kvm

Some operations want to modify the descriptor later on, so save the
address for future use.

Signed-off-by: Avi Kivity <avi@redhat.com>
---
 arch/x86/kvm/emulate.c |   13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index 85f7a5f..d3046b6 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -1289,7 +1289,8 @@ static void get_descriptor_table_ptr(struct x86_emulate_ctxt *ctxt,
 
 /* allowed just for 8 bytes segments */
 static int read_segment_descriptor(struct x86_emulate_ctxt *ctxt,
-				   u16 selector, struct desc_struct *desc)
+				   u16 selector, struct desc_struct *desc,
+				   ulong *desc_addr_p)
 {
 	struct desc_ptr dt;
 	u16 index = selector >> 3;
@@ -1300,7 +1301,7 @@ static int read_segment_descriptor(struct x86_emulate_ctxt *ctxt,
 	if (dt.size < index * 8 + 7)
 		return emulate_gp(ctxt, selector & 0xfffc);
 
-	addr = dt.address + index * 8;
+	*desc_addr_p = addr = dt.address + index * 8;
 	return ctxt->ops->read_std(ctxt, addr, desc, sizeof *desc,
 				   &ctxt->exception);
 }
@@ -1332,6 +1333,7 @@ static int load_segment_descriptor(struct x86_emulate_ctxt *ctxt,
 	unsigned err_vec = GP_VECTOR;
 	u32 err_code = 0;
 	bool null_selector = !(selector & ~0x3); /* 0000-0003 are null */
+	ulong desc_addr;
 	int ret;
 
 	memset(&seg_desc, 0, sizeof seg_desc);
@@ -1363,7 +1365,7 @@ static int load_segment_descriptor(struct x86_emulate_ctxt *ctxt,
 	if (null_selector) /* for NULL selector skip all following checks */
 		goto load;
 
-	ret = read_segment_descriptor(ctxt, selector, &seg_desc);
+	ret = read_segment_descriptor(ctxt, selector, &seg_desc, &desc_addr);
 	if (ret != X86EMUL_CONTINUE)
 		return ret;
 
@@ -2605,13 +2607,14 @@ static int emulator_do_task_switch(struct x86_emulate_ctxt *ctxt,
 	ulong old_tss_base =
 		ops->get_cached_segment_base(ctxt, VCPU_SREG_TR);
 	u32 desc_limit;
+	ulong desc_addr;
 
 	/* FIXME: old_tss_base == ~0 ? */
 
-	ret = read_segment_descriptor(ctxt, tss_selector, &next_tss_desc);
+	ret = read_segment_descriptor(ctxt, tss_selector, &next_tss_desc, &desc_addr);
 	if (ret != X86EMUL_CONTINUE)
 		return ret;
-	ret = read_segment_descriptor(ctxt, old_tss_sel, &curr_tss_desc);
+	ret = read_segment_descriptor(ctxt, old_tss_sel, &curr_tss_desc, &desc_addr);
 	if (ret != X86EMUL_CONTINUE)
 		return ret;
 
-- 
1.7.10.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 4/5] KVM: x86 emulator: make loading TR set the busy bit
  2012-06-13 14:30 [PATCH 0/5] Big real mode - addendum Avi Kivity
                   ` (2 preceding siblings ...)
  2012-06-13 14:30 ` [PATCH 3/5] KVM: x86 emulator: make read_segment_descriptor() return the address Avi Kivity
@ 2012-06-13 14:30 ` Avi Kivity
  2012-06-13 14:30 ` [PATCH 5/5] KVM: x86 emulator: implement LTR Avi Kivity
  4 siblings, 0 replies; 7+ messages in thread
From: Avi Kivity @ 2012-06-13 14:30 UTC (permalink / raw)
  To: Marcelo Tosatti, kvm

Guest software doesn't actually depend on it, but vmx will refuse us
entry if we don't.  Set the bit in both the cached segment and memory,
just to be nice.

Signed-off-by: Avi Kivity <avi@redhat.com>
---
 arch/x86/kvm/emulate.c |    8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index d3046b6..dff416f 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -1328,7 +1328,7 @@ static int write_segment_descriptor(struct x86_emulate_ctxt *ctxt,
 static int load_segment_descriptor(struct x86_emulate_ctxt *ctxt,
 				   u16 selector, int seg)
 {
-	struct desc_struct seg_desc;
+	struct desc_struct seg_desc, old_desc;
 	u8 dpl, rpl, cpl;
 	unsigned err_vec = GP_VECTOR;
 	u32 err_code = 0;
@@ -1413,6 +1413,12 @@ static int load_segment_descriptor(struct x86_emulate_ctxt *ctxt,
 	case VCPU_SREG_TR:
 		if (seg_desc.s || (seg_desc.type != 1 && seg_desc.type != 9))
 			goto exception;
+		old_desc = seg_desc;
+		seg_desc.type |= 2; /* busy */
+		ret = ctxt->ops->cmpxchg_emulated(ctxt, desc_addr, &old_desc, &seg_desc,
+						  sizeof(seg_desc), &ctxt->exception);
+		if (ret != X86EMUL_CONTINUE)
+			return ret;
 		break;
 	case VCPU_SREG_LDTR:
 		if (seg_desc.s || seg_desc.type != 2)
-- 
1.7.10.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 5/5] KVM: x86 emulator: implement LTR
  2012-06-13 14:30 [PATCH 0/5] Big real mode - addendum Avi Kivity
                   ` (3 preceding siblings ...)
  2012-06-13 14:30 ` [PATCH 4/5] KVM: x86 emulator: make loading TR set the busy bit Avi Kivity
@ 2012-06-13 14:30 ` Avi Kivity
  4 siblings, 0 replies; 7+ messages in thread
From: Avi Kivity @ 2012-06-13 14:30 UTC (permalink / raw)
  To: Marcelo Tosatti, kvm

Opcode 0F 00 /3.  Encountered during Windows XP secondary processor bringup.

Signed-off-by: Avi Kivity <avi@redhat.com>
---
 arch/x86/kvm/emulate.c |   11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index dff416f..218e731 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -3024,6 +3024,15 @@ static int em_lldt(struct x86_emulate_ctxt *ctxt)
 	return load_segment_descriptor(ctxt, sel, VCPU_SREG_LDTR);
 }
 
+static int em_ltr(struct x86_emulate_ctxt *ctxt)
+{
+	u16 sel = ctxt->src.val;
+
+	/* Disable writeback. */
+	ctxt->dst.type = OP_NONE;
+	return load_segment_descriptor(ctxt, sel, VCPU_SREG_TR);
+}
+
 static int em_invlpg(struct x86_emulate_ctxt *ctxt)
 {
 	int rc;
@@ -3570,7 +3579,7 @@ static int check_perm_out(struct x86_emulate_ctxt *ctxt)
 	DI(Prot,	sldt),
 	DI(Prot,	str),
 	II(Prot | Priv | SrcMem16, em_lldt, lldt),
-	DI(Prot | Priv,	ltr),
+	II(Prot | Priv | SrcMem16, em_ltr, ltr),
 	N, N, N, N,
 };
 
-- 
1.7.10.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 5/5] KVM: x86 emulator: implement LTR
  2012-06-27 15:18 [PATCH v2 00/26] Big big real mode improvements Avi Kivity
@ 2012-06-27 15:19 ` Avi Kivity
  0 siblings, 0 replies; 7+ messages in thread
From: Avi Kivity @ 2012-06-27 15:19 UTC (permalink / raw)
  To: Marcelo Tosatti; +Cc: kvm

Opcode 0F 00 /3.  Encountered during Windows XP secondary processor bringup.

Signed-off-by: Avi Kivity <avi@redhat.com>
---
 arch/x86/kvm/emulate.c |   11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index dff416f..218e731 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -3024,6 +3024,15 @@ static int em_lldt(struct x86_emulate_ctxt *ctxt)
 	return load_segment_descriptor(ctxt, sel, VCPU_SREG_LDTR);
 }
 
+static int em_ltr(struct x86_emulate_ctxt *ctxt)
+{
+	u16 sel = ctxt->src.val;
+
+	/* Disable writeback. */
+	ctxt->dst.type = OP_NONE;
+	return load_segment_descriptor(ctxt, sel, VCPU_SREG_TR);
+}
+
 static int em_invlpg(struct x86_emulate_ctxt *ctxt)
 {
 	int rc;
@@ -3570,7 +3579,7 @@ static int check_perm_out(struct x86_emulate_ctxt *ctxt)
 	DI(Prot,	sldt),
 	DI(Prot,	str),
 	II(Prot | Priv | SrcMem16, em_lldt, lldt),
-	DI(Prot | Priv,	ltr),
+	II(Prot | Priv | SrcMem16, em_ltr, ltr),
 	N, N, N, N,
 };
 
-- 
1.7.10.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2012-06-27 15:19 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-06-13 14:30 [PATCH 0/5] Big real mode - addendum Avi Kivity
2012-06-13 14:30 ` [PATCH 1/5] KVM: x86 emulator: emulate BSWAP Avi Kivity
2012-06-13 14:30 ` [PATCH 2/5] KVM: x86 emulator: emulate LLDT Avi Kivity
2012-06-13 14:30 ` [PATCH 3/5] KVM: x86 emulator: make read_segment_descriptor() return the address Avi Kivity
2012-06-13 14:30 ` [PATCH 4/5] KVM: x86 emulator: make loading TR set the busy bit Avi Kivity
2012-06-13 14:30 ` [PATCH 5/5] KVM: x86 emulator: implement LTR Avi Kivity
2012-06-27 15:18 [PATCH v2 00/26] Big big real mode improvements Avi Kivity
2012-06-27 15:19 ` [PATCH 5/5] KVM: x86 emulator: implement LTR Avi Kivity

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.