* Re: [Patch 6/7] RealMode: Adds support for mov seg, r (0x8e) instruction [not found] ` <20080527101923.77e62e21@frecb000711.frec.bull.fr> @ 2008-05-27 10:12 ` Avi Kivity 2008-05-27 12:49 ` Guillaume Thouvenin 0 siblings, 1 reply; 7+ messages in thread From: Avi Kivity @ 2008-05-27 10:12 UTC (permalink / raw) To: Guillaume Thouvenin Cc: kvm@vger.kernel.org, Anthony Liguori, Mohammed Gamal, Kamble, Nitin A, Marcelo Tosatti, laurent.vivier, Alexander Graf Guillaume Thouvenin wrote: > Adds support for mov r, sreg (0x8c) instruction. > We also introduce a table called vcpu_sreg_table[] to avoid an > unreadable switch. This table is also used to emulate instruction 0X8c. > > > +/* > + * This table is used by instruction like Ox8c to avoid long ugly switch. > + * The order is important, index is given by c->modrm_reg. > + */ > +static u16 vcpu_sreg_table[] = { > + VCPU_SREG_ES, > + VCPU_SREG_CS, > + VCPU_SREG_SS, > + VCPU_SREG_DS, > + VCPU_SREG_FS, > + VCPU_SREG_GS, > +}; > + > > 'static u16' -> 'static const u8' Also, you can make the ordering explicit: static const u8 vcpu_sreg_table[] = { [0]: VCPU_SREG_ES, ... }; -- error compiling committee.c: too many arguments to function ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Patch 6/7] RealMode: Adds support for mov seg, r (0x8e) instruction 2008-05-27 10:12 ` [Patch 6/7] RealMode: Adds support for mov seg, r (0x8e) instruction Avi Kivity @ 2008-05-27 12:49 ` Guillaume Thouvenin 0 siblings, 0 replies; 7+ messages in thread From: Guillaume Thouvenin @ 2008-05-27 12:49 UTC (permalink / raw) To: Avi Kivity Cc: kvm@vger.kernel.org, Anthony Liguori, Mohammed Gamal, Kamble, Nitin A, Marcelo Tosatti, laurent.vivier, Alexander Graf Adds support for mov r, sreg (0x8c) instruction. We also introduce a table called vcpu_sreg_table[] to avoid an unreadable switch. This table is also used to emulate instruction 0X8c. Changelog: - Change 'static u16' to 'static const u8' - Make the ordering explicit Signed-off-by: Guillaume Thouvenin <guillaume.thouvenin@ext.bull.net> Signed-off-by: Laurent Vivier <laurent.vivier@bull.net> --- arch/x86/kvm/x86_emulate.c | 38 +++++++++++++++++++++++++++++++++++++- 1 files changed, 37 insertions(+), 1 deletions(-) diff --git a/arch/x86/kvm/x86_emulate.c b/arch/x86/kvm/x86_emulate.c index 21d7ff6..b852fcb 100644 --- a/arch/x86/kvm/x86_emulate.c +++ b/arch/x86/kvm/x86_emulate.c @@ -138,7 +138,8 @@ static u16 opcode_table[256] = { /* 0x88 - 0x8F */ ByteOp | DstMem | SrcReg | ModRM | Mov, DstMem | SrcReg | ModRM | Mov, ByteOp | DstReg | SrcMem | ModRM | Mov, DstReg | SrcMem | ModRM | Mov, - 0, ModRM | DstReg, 0, Group | Group1A, + 0, ModRM | DstReg, + DstReg | SrcMem | ModRM | Mov, Group | Group1A, /* 0x90 - 0x9F */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ImplicitOps | Stack, ImplicitOps | Stack, 0, 0, @@ -288,6 +289,19 @@ static u16 group2_table[] = { SrcMem16 | ModRM | Mov, 0, }; +/* + * This table is used by instruction like Ox8c to avoid long ugly switch. + * The order is important, index is given by c->modrm_reg. + */ +static const u8 vcpu_sreg_table[] = { + [0] = VCPU_SREG_ES, + [1] = VCPU_SREG_CS, + [2] = VCPU_SREG_SS, + [3] = VCPU_SREG_DS, + [4] = VCPU_SREG_FS, + [5] = VCPU_SREG_GS, +}; + /* EFLAGS bit definitions. */ #define EFLG_OF (1<<11) #define EFLG_DF (1<<10) @@ -1520,6 +1534,28 @@ special_insn: case 0x8d: /* lea r16/r32, m */ c->dst.val = c->modrm_ea; break; + case 0x8e: { /* mov seg, r/m16 */ + uint16_t sel; + int type_bits; + int err; + + sel = c->src.val; + if (c->modrm_reg <= 5) { + type_bits = (c->modrm_reg == 1) ? 9 : 1; + err = kvm_load_segment_descriptor(ctxt->vcpu, sel, type_bits, + vcpu_sreg_table[c->modrm_reg]); + } else { + printk(KERN_INFO "Invalid segreg in modrm byte 0x%02x\n", + c->modrm); + goto cannot_emulate; + } + + if (err < 0) + goto cannot_emulate; + + c->dst.type = OP_NONE; /* Disable writeback. */ + break; + } case 0x8f: /* pop (sole member of Grp1a) */ rc = emulate_grp1a(ctxt, ops); if (rc != 0) -- 1.5.5.1 ^ permalink raw reply related [flat|nested] 7+ messages in thread
[parent not found: <20080527101933.68cdc7de@frecb000711.frec.bull.fr>]
* Re: [Patch 7/7] RealMode: Adds support for mov r, sreg (0x8c) instruction [not found] ` <20080527101933.68cdc7de@frecb000711.frec.bull.fr> @ 2008-05-27 10:14 ` Avi Kivity 2008-05-27 13:05 ` Guillaume Thouvenin 0 siblings, 1 reply; 7+ messages in thread From: Avi Kivity @ 2008-05-27 10:14 UTC (permalink / raw) To: Guillaume Thouvenin Cc: kvm@vger.kernel.org, Anthony Liguori, Mohammed Gamal, Kamble, Nitin A, Marcelo Tosatti, laurent.vivier, Alexander Graf Guillaume Thouvenin wrote: > Adds support for mov r, sreg (0x8c) instruction > > Signed-off-by: Guillaume Thouvenin <guillaume.thouvenin@ext.bull.net> > Signed-off-by: Laurent Vivier <laurent.vivier@bull.net> > > --- > arch/x86/kvm/x86_emulate.c | 21 ++++++++++++++++++++- > 1 files changed, 20 insertions(+), 1 deletions(-) > > diff --git a/arch/x86/kvm/x86_emulate.c b/arch/x86/kvm/x86_emulate.c > index 106d714..35767e7 100644 > --- a/arch/x86/kvm/x86_emulate.c > +++ b/arch/x86/kvm/x86_emulate.c > @@ -138,7 +138,7 @@ static u16 opcode_table[256] = { > /* 0x88 - 0x8F */ > ByteOp | DstMem | SrcReg | ModRM | Mov, DstMem | SrcReg | ModRM | Mov, > ByteOp | DstReg | SrcMem | ModRM | Mov, DstReg | SrcMem | ModRM | Mov, > - 0, ModRM | DstReg, > + DstMem | SrcReg | ModRM | Mov, ModRM | DstReg, > DstReg | SrcMem | ModRM | Mov, Group | Group1A, > /* 0x90 - 0x9F */ > 0, 0, 0, 0, 0, 0, 0, 0, > @@ -1531,6 +1531,25 @@ special_insn: > break; > case 0x88 ... 0x8b: /* mov */ > goto mov; > + case 0x8c: { /* mov r/m, sreg */ > + struct kvm_segment segreg; > + > + if (c->modrm_mod == 0x3) > + c->src.val = c->modrm_val; > What's this bit? > + > + if (c->modrm_reg <= 5) > + kvm_get_segment(ctxt->vcpu, &segreg, vcpu_sreg_table[c->modrm_reg]); > + else { > + printk(KERN_INFO "0x8c: Invalid segreg in modrm byte 0x%02x\n", > + c->modrm); > + goto cannot_emulate; > + } > + c->dst.val = segreg.selector; > + c->dst.bytes = 2; > + c->dst.ptr = (unsigned long *)decode_register(c->modrm_rm, c->regs, > + c->d & ByteOp); > Aren't dst.bytes and dst.ptr already set by the decoder? -- error compiling committee.c: too many arguments to function ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Patch 7/7] RealMode: Adds support for mov r, sreg (0x8c) instruction 2008-05-27 10:14 ` [Patch 7/7] RealMode: Adds support for mov r, sreg (0x8c) instruction Avi Kivity @ 2008-05-27 13:05 ` Guillaume Thouvenin 2008-05-27 13:13 ` Guillaume Thouvenin 0 siblings, 1 reply; 7+ messages in thread From: Guillaume Thouvenin @ 2008-05-27 13:05 UTC (permalink / raw) To: Avi Kivity Cc: kvm@vger.kernel.org, Anthony Liguori, Mohammed Gamal, Kamble, Nitin A, Marcelo Tosatti, laurent.vivier, Alexander Graf On Tue, 27 May 2008 13:14:36 +0300 Avi Kivity <avi@qumranet.com> wrote: > Guillaume Thouvenin wrote: > > Adds support for mov r, sreg (0x8c) instruction > > > > Signed-off-by: Guillaume Thouvenin <guillaume.thouvenin@ext.bull.net> > > Signed-off-by: Laurent Vivier <laurent.vivier@bull.net> > > > > --- > > arch/x86/kvm/x86_emulate.c | 21 ++++++++++++++++++++- > > 1 files changed, 20 insertions(+), 1 deletions(-) > > > > diff --git a/arch/x86/kvm/x86_emulate.c b/arch/x86/kvm/x86_emulate.c > > index 106d714..35767e7 100644 > > --- a/arch/x86/kvm/x86_emulate.c > > +++ b/arch/x86/kvm/x86_emulate.c > > @@ -138,7 +138,7 @@ static u16 opcode_table[256] = { > > /* 0x88 - 0x8F */ > > ByteOp | DstMem | SrcReg | ModRM | Mov, DstMem | SrcReg | ModRM | Mov, > > ByteOp | DstReg | SrcMem | ModRM | Mov, DstReg | SrcMem | ModRM | Mov, > > - 0, ModRM | DstReg, > > + DstMem | SrcReg | ModRM | Mov, ModRM | DstReg, > > DstReg | SrcMem | ModRM | Mov, Group | Group1A, > > /* 0x90 - 0x9F */ > > 0, 0, 0, 0, 0, 0, 0, 0, > > @@ -1531,6 +1531,25 @@ special_insn: > > break; > > case 0x88 ... 0x8b: /* mov */ > > goto mov; > > + case 0x8c: { /* mov r/m, sreg */ > > + struct kvm_segment segreg; > > + > > + if (c->modrm_mod == 0x3) > > + c->src.val = c->modrm_val; > > > > What's this bit? Right it's unneeded because c->src.val is update in "SrcReg:" > > + > > + if (c->modrm_reg <= 5) > > + kvm_get_segment(ctxt->vcpu, &segreg, vcpu_sreg_table[c->modrm_reg]); > > + else { > > + printk(KERN_INFO "0x8c: Invalid segreg in modrm byte 0x%02x\n", > > + c->modrm); > > + goto cannot_emulate; > > + } > > + c->dst.val = segreg.selector; > > + c->dst.bytes = 2; > > + c->dst.ptr = (unsigned long *)decode_register(c->modrm_rm, c->regs, > > + c->d & ByteOp); > > > > Aren't dst.bytes and dst.ptr already set by the decoder? Yes you're right. So I'll remove the c->dst.ptr. For the c->dst.bytes I copy it from Xen code where I see the following code: if (c->dst.type == OP_MEM) c->dst.bytes = 2; I added a trace and I didn't see any case where c->dst.type == OP_MEM. So I will also remove the update of c->dst.bytes that seems well done by the decoder. Regards, Guillaume ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Patch 7/7] RealMode: Adds support for mov r, sreg (0x8c) instruction 2008-05-27 13:05 ` Guillaume Thouvenin @ 2008-05-27 13:13 ` Guillaume Thouvenin 0 siblings, 0 replies; 7+ messages in thread From: Guillaume Thouvenin @ 2008-05-27 13:13 UTC (permalink / raw) To: Avi Kivity Cc: kvm@vger.kernel.org, Anthony Liguori, Mohammed Gamal, Kamble, Nitin A, Marcelo Tosatti, laurent.vivier, Alexander Graf Adds support for mov r, sreg (0x8c) instruction Changelog: - Remove code that is unneeded in the instruction because it is already executed by the decoder. Signed-off-by: Guillaume Thouvenin <guillaume.thouvenin@ext.bull.net> Signed-off-by: Laurent Vivier <laurent.vivier@bull.net> --- arch/x86/kvm/x86_emulate.c | 15 ++++++++++++++- 1 files changed, 14 insertions(+), 1 deletions(-) diff --git a/arch/x86/kvm/x86_emulate.c b/arch/x86/kvm/x86_emulate.c index b852fcb..1093281 100644 --- a/arch/x86/kvm/x86_emulate.c +++ b/arch/x86/kvm/x86_emulate.c @@ -138,7 +138,7 @@ static u16 opcode_table[256] = { /* 0x88 - 0x8F */ ByteOp | DstMem | SrcReg | ModRM | Mov, DstMem | SrcReg | ModRM | Mov, ByteOp | DstReg | SrcMem | ModRM | Mov, DstReg | SrcMem | ModRM | Mov, - 0, ModRM | DstReg, + DstMem | SrcReg | ModRM | Mov, ModRM | DstReg, DstReg | SrcMem | ModRM | Mov, Group | Group1A, /* 0x90 - 0x9F */ 0, 0, 0, 0, 0, 0, 0, 0, @@ -1531,6 +1531,19 @@ special_insn: break; case 0x88 ... 0x8b: /* mov */ goto mov; + case 0x8c: { /* mov r/m, sreg */ + struct kvm_segment segreg; + + if (c->modrm_reg <= 5) + kvm_get_segment(ctxt->vcpu, &segreg, vcpu_sreg_table[c->modrm_reg]); + else { + printk(KERN_INFO "0x8c: Invalid segreg in modrm byte 0x%02x\n", + c->modrm); + goto cannot_emulate; + } + c->dst.val = segreg.selector; + break; + } case 0x8d: /* lea r16/r32, m */ c->dst.val = c->modrm_ea; break; -- 1.5.5.1 ^ permalink raw reply related [flat|nested] 7+ messages in thread
[parent not found: <20080527101908.749cff41@frecb000711.frec.bull.fr>]
* Re: [Patch 4/7] RealMode: Adds support for jmp far 0xea [not found] ` <20080527101908.749cff41@frecb000711.frec.bull.fr> @ 2008-05-27 18:32 ` Anthony Liguori 2008-05-28 6:30 ` Avi Kivity 0 siblings, 1 reply; 7+ messages in thread From: Anthony Liguori @ 2008-05-27 18:32 UTC (permalink / raw) To: Guillaume Thouvenin Cc: kvm@vger.kernel.org, Avi Kivity, Anthony Liguori, Mohammed Gamal, Kamble, Nitin A, Marcelo Tosatti, laurent.vivier, Alexander Graf Guillaume Thouvenin wrote: > Adds support for jmp far 0xea instruction > > > Signed-off-by: Guillaume Thouvenin <guillaume.thouvenin@ext.bull.net> > Signed-off-by: Laurent Vivier <laurent.vivier@bull.net> > > --- > arch/x86/kvm/x86_emulate.c | 31 +++++++++++++++++++++++++++++-- > 1 files changed, 29 insertions(+), 2 deletions(-) > > diff --git a/arch/x86/kvm/x86_emulate.c b/arch/x86/kvm/x86_emulate.c > index a928aa6..48b62cc 100644 > --- a/arch/x86/kvm/x86_emulate.c > +++ b/arch/x86/kvm/x86_emulate.c > @@ -168,7 +168,8 @@ static u16 opcode_table[256] = { > /* 0xE0 - 0xE7 */ > 0, 0, 0, 0, 0, 0, 0, 0, > /* 0xE8 - 0xEF */ > - ImplicitOps | Stack, SrcImm|ImplicitOps, 0, SrcImmByte|ImplicitOps, > + ImplicitOps | Stack, SrcImm | ImplicitOps, > + ImplicitOps, SrcImmByte | ImplicitOps, > 0, 0, 0, 0, > /* 0xF0 - 0xF7 */ > 0, 0, 0, 0, > @@ -1661,7 +1662,33 @@ special_insn: > break; > } > case 0xe9: /* jmp rel */ > - case 0xeb: /* jmp rel short */ > + goto jmp; > The cases don't have to be in ascending order. Much better to leave 0xeb here then have a jmp cross case boundaries. Regards, Anthony Liguori > + case 0xea: /* jmp far */ { > + uint32_t eip; > + uint16_t sel; > + > + switch (c->op_bytes) { > + case 2: > + eip = insn_fetch(u16, 2, c->eip); > + break; > + case 4: > + eip = insn_fetch(u32, 4, c->eip); > + break; > + default: > + DPRINTF("jmp far: Invalid op_bytes\n"); > + goto cannot_emulate; > + } > + sel = insn_fetch(u16, 2, c->eip); > + if (kvm_load_segment_descriptor(ctxt->vcpu, sel, 9, VCPU_SREG_CS) < 0) { > + DPRINTF("jmp far: Failed to load CS descriptor\n"); > + goto cannot_emulate; > + } > + > + c->eip = eip; > + break; > + } > + case 0xeb: > + jmp: /* jmp rel short */ > jmp_rel(c, c->src.val); > c->dst.type = OP_NONE; /* Disable writeback. */ > break; > ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Patch 4/7] RealMode: Adds support for jmp far 0xea 2008-05-27 18:32 ` [Patch 4/7] RealMode: Adds support for jmp far 0xea Anthony Liguori @ 2008-05-28 6:30 ` Avi Kivity 0 siblings, 0 replies; 7+ messages in thread From: Avi Kivity @ 2008-05-28 6:30 UTC (permalink / raw) To: Anthony Liguori Cc: Guillaume Thouvenin, kvm@vger.kernel.org, Anthony Liguori, Mohammed Gamal, Kamble, Nitin A, Marcelo Tosatti, laurent.vivier, Alexander Graf Anthony Liguori wrote: >> @@ -1661,7 +1662,33 @@ special_insn: >> break; >> } >> case 0xe9: /* jmp rel */ >> - case 0xeb: /* jmp rel short */ >> + goto jmp; >> > > The cases don't have to be in ascending order. Much better to leave > 0xeb here then have a jmp cross case boundaries. I find that sorting helps finding opcodes quickly. A simple search doesn't work due to ranges. -- Do not meddle in the internals of kernels, for they are subtle and quick to panic. ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2008-05-28 6:30 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20080527084115.2b0cfae1@frecb000711.frec.bull.fr>
[not found] ` <20080527101923.77e62e21@frecb000711.frec.bull.fr>
2008-05-27 10:12 ` [Patch 6/7] RealMode: Adds support for mov seg, r (0x8e) instruction Avi Kivity
2008-05-27 12:49 ` Guillaume Thouvenin
[not found] ` <20080527101933.68cdc7de@frecb000711.frec.bull.fr>
2008-05-27 10:14 ` [Patch 7/7] RealMode: Adds support for mov r, sreg (0x8c) instruction Avi Kivity
2008-05-27 13:05 ` Guillaume Thouvenin
2008-05-27 13:13 ` Guillaume Thouvenin
[not found] ` <20080527101908.749cff41@frecb000711.frec.bull.fr>
2008-05-27 18:32 ` [Patch 4/7] RealMode: Adds support for jmp far 0xea Anthony Liguori
2008-05-28 6:30 ` Avi Kivity
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox