Skip to content

Commit 58a9a36

Browse files
committed
Merge branch 'kvm-updates/3.0' of git://git.kernel.org/pub/scm/virt/kvm/kvm
* 'kvm-updates/3.0' of git://git.kernel.org/pub/scm/virt/kvm/kvm: KVM: Initialize kvm before registering the mmu notifier KVM: x86: use proper port value when checking io instruction permission KVM: add missing void __user * cast to access_ok() call
2 parents 22b174f + 74b5c5b commit 58a9a36

File tree

2 files changed

+56
-41
lines changed

2 files changed

+56
-41
lines changed

arch/x86/kvm/emulate.c

+47-35
Original file line numberDiff line numberDiff line change
@@ -47,38 +47,40 @@
4747
#define DstDI (5<<1) /* Destination is in ES:(E)DI */
4848
#define DstMem64 (6<<1) /* 64bit memory operand */
4949
#define DstImmUByte (7<<1) /* 8-bit unsigned immediate operand */
50-
#define DstMask (7<<1)
50+
#define DstDX (8<<1) /* Destination is in DX register */
51+
#define DstMask (0xf<<1)
5152
/* Source operand type. */
52-
#define SrcNone (0<<4) /* No source operand. */
53-
#define SrcReg (1<<4) /* Register operand. */
54-
#define SrcMem (2<<4) /* Memory operand. */
55-
#define SrcMem16 (3<<4) /* Memory operand (16-bit). */
56-
#define SrcMem32 (4<<4) /* Memory operand (32-bit). */
57-
#define SrcImm (5<<4) /* Immediate operand. */
58-
#define SrcImmByte (6<<4) /* 8-bit sign-extended immediate operand. */
59-
#define SrcOne (7<<4) /* Implied '1' */
60-
#define SrcImmUByte (8<<4) /* 8-bit unsigned immediate operand. */
61-
#define SrcImmU (9<<4) /* Immediate operand, unsigned */
62-
#define SrcSI (0xa<<4) /* Source is in the DS:RSI */
63-
#define SrcImmFAddr (0xb<<4) /* Source is immediate far address */
64-
#define SrcMemFAddr (0xc<<4) /* Source is far address in memory */
65-
#define SrcAcc (0xd<<4) /* Source Accumulator */
66-
#define SrcImmU16 (0xe<<4) /* Immediate operand, unsigned, 16 bits */
67-
#define SrcMask (0xf<<4)
53+
#define SrcNone (0<<5) /* No source operand. */
54+
#define SrcReg (1<<5) /* Register operand. */
55+
#define SrcMem (2<<5) /* Memory operand. */
56+
#define SrcMem16 (3<<5) /* Memory operand (16-bit). */
57+
#define SrcMem32 (4<<5) /* Memory operand (32-bit). */
58+
#define SrcImm (5<<5) /* Immediate operand. */
59+
#define SrcImmByte (6<<5) /* 8-bit sign-extended immediate operand. */
60+
#define SrcOne (7<<5) /* Implied '1' */
61+
#define SrcImmUByte (8<<5) /* 8-bit unsigned immediate operand. */
62+
#define SrcImmU (9<<5) /* Immediate operand, unsigned */
63+
#define SrcSI (0xa<<5) /* Source is in the DS:RSI */
64+
#define SrcImmFAddr (0xb<<5) /* Source is immediate far address */
65+
#define SrcMemFAddr (0xc<<5) /* Source is far address in memory */
66+
#define SrcAcc (0xd<<5) /* Source Accumulator */
67+
#define SrcImmU16 (0xe<<5) /* Immediate operand, unsigned, 16 bits */
68+
#define SrcDX (0xf<<5) /* Source is in DX register */
69+
#define SrcMask (0xf<<5)
6870
/* Generic ModRM decode. */
69-
#define ModRM (1<<8)
71+
#define ModRM (1<<9)
7072
/* Destination is only written; never read. */
71-
#define Mov (1<<9)
72-
#define BitOp (1<<10)
73-
#define MemAbs (1<<11) /* Memory operand is absolute displacement */
74-
#define String (1<<12) /* String instruction (rep capable) */
75-
#define Stack (1<<13) /* Stack instruction (push/pop) */
76-
#define GroupMask (7<<14) /* Opcode uses one of the group mechanisms */
77-
#define Group (1<<14) /* Bits 3:5 of modrm byte extend opcode */
78-
#define GroupDual (2<<14) /* Alternate decoding of mod == 3 */
79-
#define Prefix (3<<14) /* Instruction varies with 66/f2/f3 prefix */
80-
#define RMExt (4<<14) /* Opcode extension in ModRM r/m if mod == 3 */
81-
#define Sse (1<<17) /* SSE Vector instruction */
73+
#define Mov (1<<10)
74+
#define BitOp (1<<11)
75+
#define MemAbs (1<<12) /* Memory operand is absolute displacement */
76+
#define String (1<<13) /* String instruction (rep capable) */
77+
#define Stack (1<<14) /* Stack instruction (push/pop) */
78+
#define GroupMask (7<<15) /* Opcode uses one of the group mechanisms */
79+
#define Group (1<<15) /* Bits 3:5 of modrm byte extend opcode */
80+
#define GroupDual (2<<15) /* Alternate decoding of mod == 3 */
81+
#define Prefix (3<<15) /* Instruction varies with 66/f2/f3 prefix */
82+
#define RMExt (4<<15) /* Opcode extension in ModRM r/m if mod == 3 */
83+
#define Sse (1<<18) /* SSE Vector instruction */
8284
/* Misc flags */
8385
#define Prot (1<<21) /* instruction generates #UD if not in prot-mode */
8486
#define VendorSpecific (1<<22) /* Vendor specific instruction */
@@ -3154,8 +3156,8 @@ static struct opcode opcode_table[256] = {
31543156
I(DstReg | SrcMem | ModRM | Src2Imm, em_imul_3op),
31553157
I(SrcImmByte | Mov | Stack, em_push),
31563158
I(DstReg | SrcMem | ModRM | Src2ImmByte, em_imul_3op),
3157-
D2bvIP(DstDI | Mov | String, ins, check_perm_in), /* insb, insw/insd */
3158-
D2bvIP(SrcSI | ImplicitOps | String, outs, check_perm_out), /* outsb, outsw/outsd */
3159+
D2bvIP(DstDI | SrcDX | Mov | String, ins, check_perm_in), /* insb, insw/insd */
3160+
D2bvIP(SrcSI | DstDX | String, outs, check_perm_out), /* outsb, outsw/outsd */
31593161
/* 0x70 - 0x7F */
31603162
X16(D(SrcImmByte)),
31613163
/* 0x80 - 0x87 */
@@ -3212,8 +3214,8 @@ static struct opcode opcode_table[256] = {
32123214
/* 0xE8 - 0xEF */
32133215
D(SrcImm | Stack), D(SrcImm | ImplicitOps),
32143216
D(SrcImmFAddr | No64), D(SrcImmByte | ImplicitOps),
3215-
D2bvIP(SrcNone | DstAcc, in, check_perm_in),
3216-
D2bvIP(SrcAcc | ImplicitOps, out, check_perm_out),
3217+
D2bvIP(SrcDX | DstAcc, in, check_perm_in),
3218+
D2bvIP(SrcAcc | DstDX, out, check_perm_out),
32173219
/* 0xF0 - 0xF7 */
32183220
N, DI(ImplicitOps, icebp), N, N,
32193221
DI(ImplicitOps | Priv, hlt), D(ImplicitOps),
@@ -3613,6 +3615,12 @@ x86_decode_insn(struct x86_emulate_ctxt *ctxt, void *insn, int insn_len)
36133615
memop.bytes = c->op_bytes + 2;
36143616
goto srcmem_common;
36153617
break;
3618+
case SrcDX:
3619+
c->src.type = OP_REG;
3620+
c->src.bytes = 2;
3621+
c->src.addr.reg = &c->regs[VCPU_REGS_RDX];
3622+
fetch_register_operand(&c->src);
3623+
break;
36163624
}
36173625

36183626
if (rc != X86EMUL_CONTINUE)
@@ -3682,6 +3690,12 @@ x86_decode_insn(struct x86_emulate_ctxt *ctxt, void *insn, int insn_len)
36823690
c->dst.addr.mem.seg = VCPU_SREG_ES;
36833691
c->dst.val = 0;
36843692
break;
3693+
case DstDX:
3694+
c->dst.type = OP_REG;
3695+
c->dst.bytes = 2;
3696+
c->dst.addr.reg = &c->regs[VCPU_REGS_RDX];
3697+
fetch_register_operand(&c->dst);
3698+
break;
36853699
case ImplicitOps:
36863700
/* Special instructions do their own operand decoding. */
36873701
default:
@@ -4027,15 +4041,13 @@ x86_emulate_insn(struct x86_emulate_ctxt *ctxt)
40274041
break;
40284042
case 0xec: /* in al,dx */
40294043
case 0xed: /* in (e/r)ax,dx */
4030-
c->src.val = c->regs[VCPU_REGS_RDX];
40314044
do_io_in:
40324045
if (!pio_in_emulated(ctxt, ops, c->dst.bytes, c->src.val,
40334046
&c->dst.val))
40344047
goto done; /* IO is needed */
40354048
break;
40364049
case 0xee: /* out dx,al */
40374050
case 0xef: /* out dx,(e/r)ax */
4038-
c->dst.val = c->regs[VCPU_REGS_RDX];
40394051
do_io_out:
40404052
ops->pio_out_emulated(ctxt, c->src.bytes, c->dst.val,
40414053
&c->src.val, 1);

virt/kvm/kvm_main.c

+9-6
Original file line numberDiff line numberDiff line change
@@ -467,19 +467,20 @@ static struct kvm *kvm_create_vm(void)
467467
if (!kvm->buses[i])
468468
goto out_err;
469469
}
470-
spin_lock_init(&kvm->mmu_lock);
471-
472-
r = kvm_init_mmu_notifier(kvm);
473-
if (r)
474-
goto out_err;
475470

471+
spin_lock_init(&kvm->mmu_lock);
476472
kvm->mm = current->mm;
477473
atomic_inc(&kvm->mm->mm_count);
478474
kvm_eventfd_init(kvm);
479475
mutex_init(&kvm->lock);
480476
mutex_init(&kvm->irq_lock);
481477
mutex_init(&kvm->slots_lock);
482478
atomic_set(&kvm->users_count, 1);
479+
480+
r = kvm_init_mmu_notifier(kvm);
481+
if (r)
482+
goto out_err;
483+
483484
raw_spin_lock(&kvm_lock);
484485
list_add(&kvm->vm_list, &vm_list);
485486
raw_spin_unlock(&kvm_lock);
@@ -651,7 +652,9 @@ int __kvm_set_memory_region(struct kvm *kvm,
651652
/* We can read the guest memory with __xxx_user() later on. */
652653
if (user_alloc &&
653654
((mem->userspace_addr & (PAGE_SIZE - 1)) ||
654-
!access_ok(VERIFY_WRITE, mem->userspace_addr, mem->memory_size)))
655+
!access_ok(VERIFY_WRITE,
656+
(void __user *)(unsigned long)mem->userspace_addr,
657+
mem->memory_size)))
655658
goto out;
656659
if (mem->slot >= KVM_MEMORY_SLOTS + KVM_PRIVATE_MEM_SLOTS)
657660
goto out;

0 commit comments

Comments
 (0)