|
@@ -4798,11 +4798,10 @@ static int kvm_fetch_guest_virt(struct x86_emulate_ctxt *ctxt,
|
|
|
return X86EMUL_CONTINUE;
|
|
|
}
|
|
|
|
|
|
-int kvm_read_guest_virt(struct x86_emulate_ctxt *ctxt,
|
|
|
+int kvm_read_guest_virt(struct kvm_vcpu *vcpu,
|
|
|
gva_t addr, void *val, unsigned int bytes,
|
|
|
struct x86_exception *exception)
|
|
|
{
|
|
|
- struct kvm_vcpu *vcpu = emul_to_vcpu(ctxt);
|
|
|
u32 access = (kvm_x86_ops->get_cpl(vcpu) == 3) ? PFERR_USER_MASK : 0;
|
|
|
|
|
|
return kvm_read_guest_virt_helper(addr, val, bytes, vcpu, access,
|
|
@@ -4810,9 +4809,9 @@ int kvm_read_guest_virt(struct x86_emulate_ctxt *ctxt,
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(kvm_read_guest_virt);
|
|
|
|
|
|
-static int kvm_read_guest_virt_system(struct x86_emulate_ctxt *ctxt,
|
|
|
- gva_t addr, void *val, unsigned int bytes,
|
|
|
- struct x86_exception *exception)
|
|
|
+static int emulator_read_std(struct x86_emulate_ctxt *ctxt,
|
|
|
+ gva_t addr, void *val, unsigned int bytes,
|
|
|
+ struct x86_exception *exception)
|
|
|
{
|
|
|
struct kvm_vcpu *vcpu = emul_to_vcpu(ctxt);
|
|
|
return kvm_read_guest_virt_helper(addr, val, bytes, vcpu, 0, exception);
|
|
@@ -4827,18 +4826,16 @@ static int kvm_read_guest_phys_system(struct x86_emulate_ctxt *ctxt,
|
|
|
return r < 0 ? X86EMUL_IO_NEEDED : X86EMUL_CONTINUE;
|
|
|
}
|
|
|
|
|
|
-int kvm_write_guest_virt_system(struct x86_emulate_ctxt *ctxt,
|
|
|
- gva_t addr, void *val,
|
|
|
- unsigned int bytes,
|
|
|
- struct x86_exception *exception)
|
|
|
+static int kvm_write_guest_virt_helper(gva_t addr, void *val, unsigned int bytes,
|
|
|
+ struct kvm_vcpu *vcpu, u32 access,
|
|
|
+ struct x86_exception *exception)
|
|
|
{
|
|
|
- struct kvm_vcpu *vcpu = emul_to_vcpu(ctxt);
|
|
|
void *data = val;
|
|
|
int r = X86EMUL_CONTINUE;
|
|
|
|
|
|
while (bytes) {
|
|
|
gpa_t gpa = vcpu->arch.walk_mmu->gva_to_gpa(vcpu, addr,
|
|
|
- PFERR_WRITE_MASK,
|
|
|
+ access,
|
|
|
exception);
|
|
|
unsigned offset = addr & (PAGE_SIZE-1);
|
|
|
unsigned towrite = min(bytes, (unsigned)PAGE_SIZE - offset);
|
|
@@ -4859,6 +4856,22 @@ int kvm_write_guest_virt_system(struct x86_emulate_ctxt *ctxt,
|
|
|
out:
|
|
|
return r;
|
|
|
}
|
|
|
+
|
|
|
+static int emulator_write_std(struct x86_emulate_ctxt *ctxt, gva_t addr, void *val,
|
|
|
+ unsigned int bytes, struct x86_exception *exception)
|
|
|
+{
|
|
|
+ struct kvm_vcpu *vcpu = emul_to_vcpu(ctxt);
|
|
|
+
|
|
|
+ return kvm_write_guest_virt_helper(addr, val, bytes, vcpu,
|
|
|
+ PFERR_WRITE_MASK, exception);
|
|
|
+}
|
|
|
+
|
|
|
+int kvm_write_guest_virt_system(struct kvm_vcpu *vcpu, gva_t addr, void *val,
|
|
|
+ unsigned int bytes, struct x86_exception *exception)
|
|
|
+{
|
|
|
+ return kvm_write_guest_virt_helper(addr, val, bytes, vcpu,
|
|
|
+ PFERR_WRITE_MASK, exception);
|
|
|
+}
|
|
|
EXPORT_SYMBOL_GPL(kvm_write_guest_virt_system);
|
|
|
|
|
|
int handle_ud(struct kvm_vcpu *vcpu)
|
|
@@ -5611,8 +5624,8 @@ static int emulator_pre_leave_smm(struct x86_emulate_ctxt *ctxt, u64 smbase)
|
|
|
static const struct x86_emulate_ops emulate_ops = {
|
|
|
.read_gpr = emulator_read_gpr,
|
|
|
.write_gpr = emulator_write_gpr,
|
|
|
- .read_std = kvm_read_guest_virt_system,
|
|
|
- .write_std = kvm_write_guest_virt_system,
|
|
|
+ .read_std = emulator_read_std,
|
|
|
+ .write_std = emulator_write_std,
|
|
|
.read_phys = kvm_read_guest_phys_system,
|
|
|
.fetch = kvm_fetch_guest_virt,
|
|
|
.read_emulated = emulator_read_emulated,
|