diff mbox

[RFC,v4,05/18] kvm: x86: add kvm_arch_vcpu_set_regs()

Message ID 20171218190642.7790-6-alazar@bitdefender.com (mailing list archive)
State New, archived
Headers show

Commit Message

Adalbert Lazăr Dec. 18, 2017, 7:06 p.m. UTC
From: Adalbert Lazar <alazar@bitdefender.com>

This is a version of kvm_arch_vcpu_ioctl_set_regs() which does not touch
the exceptions vector.

Signed-off-by: Mihai Donțu <mdontu@bitdefender.com>
---
 arch/x86/kvm/x86.c       | 34 ++++++++++++++++++++++++++++++++++
 include/linux/kvm_host.h |  1 +
 2 files changed, 35 insertions(+)

Comments

Patrick Colp Dec. 21, 2017, 9:39 p.m. UTC | #1
On 2017-12-18 02:06 PM, Adalber Lazăr wrote:
> From: Adalbert Lazar <alazar@bitdefender.com>
> 
> This is a version of kvm_arch_vcpu_ioctl_set_regs() which does not touch
> the exceptions vector.
> 
> Signed-off-by: Mihai Donțu <mdontu@bitdefender.com>
> ---
>   arch/x86/kvm/x86.c       | 34 ++++++++++++++++++++++++++++++++++
>   include/linux/kvm_host.h |  1 +
>   2 files changed, 35 insertions(+)
> 
> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> index e1a3c2c6ec08..4b0c3692386d 100644
> --- a/arch/x86/kvm/x86.c
> +++ b/arch/x86/kvm/x86.c
> @@ -7389,6 +7389,40 @@ int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)
>   	return 0;
>   }
>   
> +/*
> + * Similar to kvm_arch_vcpu_ioctl_set_regs() but it does not reset
> + * the exceptions
> + */
> +void kvm_arch_vcpu_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)
> +{
> +	vcpu->arch.emulate_regs_need_sync_from_vcpu = true;
> +	vcpu->arch.emulate_regs_need_sync_to_vcpu = false;
> +
> +	kvm_register_write(vcpu, VCPU_REGS_RAX, regs->rax);
> +	kvm_register_write(vcpu, VCPU_REGS_RBX, regs->rbx);
> +	kvm_register_write(vcpu, VCPU_REGS_RCX, regs->rcx);
> +	kvm_register_write(vcpu, VCPU_REGS_RDX, regs->rdx);
> +	kvm_register_write(vcpu, VCPU_REGS_RSI, regs->rsi);
> +	kvm_register_write(vcpu, VCPU_REGS_RDI, regs->rdi);
> +	kvm_register_write(vcpu, VCPU_REGS_RSP, regs->rsp);
> +	kvm_register_write(vcpu, VCPU_REGS_RBP, regs->rbp);
> +#ifdef CONFIG_X86_64
> +	kvm_register_write(vcpu, VCPU_REGS_R8, regs->r8);
> +	kvm_register_write(vcpu, VCPU_REGS_R9, regs->r9);
> +	kvm_register_write(vcpu, VCPU_REGS_R10, regs->r10);
> +	kvm_register_write(vcpu, VCPU_REGS_R11, regs->r11);
> +	kvm_register_write(vcpu, VCPU_REGS_R12, regs->r12);
> +	kvm_register_write(vcpu, VCPU_REGS_R13, regs->r13);
> +	kvm_register_write(vcpu, VCPU_REGS_R14, regs->r14);
> +	kvm_register_write(vcpu, VCPU_REGS_R15, regs->r15);
> +#endif
> +
> +	kvm_rip_write(vcpu, regs->rip);
> +	kvm_set_rflags(vcpu, regs->rflags);
> +
> +	kvm_make_request(KVM_REQ_EVENT, vcpu);
> +}
> +

kvm_arch_vcpu_ioctl_set_regs() returns an int (so that, for e.g., in ARM 
it can return an error to indicate that the function is not 
supported/implemented). Is there a reason this function shouldn't do the 
same (is it only ever going to be implemented for x86)?

>   void kvm_get_cs_db_l_bits(struct kvm_vcpu *vcpu, int *db, int *l)
>   {
>   	struct kvm_segment cs;
> diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
> index 6bdd4b9f6611..68e4d756f5c9 100644
> --- a/include/linux/kvm_host.h
> +++ b/include/linux/kvm_host.h
> @@ -767,6 +767,7 @@ int kvm_arch_vcpu_ioctl_translate(struct kvm_vcpu *vcpu,
>   
>   int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs);
>   int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs);
> +void kvm_arch_vcpu_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs);
>   int kvm_arch_vcpu_ioctl_get_sregs(struct kvm_vcpu *vcpu,
>   				  struct kvm_sregs *sregs);
>   int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu,
> 


Patrick
Adalbert Lazăr Dec. 22, 2017, 9:29 a.m. UTC | #2
On Thu, 21 Dec 2017 16:39:02 -0500, Patrick Colp <patrick.colp@oracle.com> wrote:
> On 2017-12-18 02:06 PM, Adalber Lazăr wrote:
> > From: Adalbert Lazar <alazar@bitdefender.com>
> > 
> > This is a version of kvm_arch_vcpu_ioctl_set_regs() which does not touch
> > the exceptions vector.
> > 
> > Signed-off-by: Mihai Donțu <mdontu@bitdefender.com>
> > ---
> >   arch/x86/kvm/x86.c       | 34 ++++++++++++++++++++++++++++++++++
> >   include/linux/kvm_host.h |  1 +
> >   2 files changed, 35 insertions(+)
> > 
> > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> > index e1a3c2c6ec08..4b0c3692386d 100644
> > --- a/arch/x86/kvm/x86.c
> > +++ b/arch/x86/kvm/x86.c
> > @@ -7389,6 +7389,40 @@ int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)
> >   	return 0;
> >   }
> >   
> > +/*
> > + * Similar to kvm_arch_vcpu_ioctl_set_regs() but it does not reset
> > + * the exceptions
> > + */
> > +void kvm_arch_vcpu_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)
> > +{
> > +	vcpu->arch.emulate_regs_need_sync_from_vcpu = true;
> > +	vcpu->arch.emulate_regs_need_sync_to_vcpu = false;
> > +
> > +	kvm_register_write(vcpu, VCPU_REGS_RAX, regs->rax);
> > +	kvm_register_write(vcpu, VCPU_REGS_RBX, regs->rbx);
> > +	kvm_register_write(vcpu, VCPU_REGS_RCX, regs->rcx);
> > +	kvm_register_write(vcpu, VCPU_REGS_RDX, regs->rdx);
> > +	kvm_register_write(vcpu, VCPU_REGS_RSI, regs->rsi);
> > +	kvm_register_write(vcpu, VCPU_REGS_RDI, regs->rdi);
> > +	kvm_register_write(vcpu, VCPU_REGS_RSP, regs->rsp);
> > +	kvm_register_write(vcpu, VCPU_REGS_RBP, regs->rbp);
> > +#ifdef CONFIG_X86_64
> > +	kvm_register_write(vcpu, VCPU_REGS_R8, regs->r8);
> > +	kvm_register_write(vcpu, VCPU_REGS_R9, regs->r9);
> > +	kvm_register_write(vcpu, VCPU_REGS_R10, regs->r10);
> > +	kvm_register_write(vcpu, VCPU_REGS_R11, regs->r11);
> > +	kvm_register_write(vcpu, VCPU_REGS_R12, regs->r12);
> > +	kvm_register_write(vcpu, VCPU_REGS_R13, regs->r13);
> > +	kvm_register_write(vcpu, VCPU_REGS_R14, regs->r14);
> > +	kvm_register_write(vcpu, VCPU_REGS_R15, regs->r15);
> > +#endif
> > +
> > +	kvm_rip_write(vcpu, regs->rip);
> > +	kvm_set_rflags(vcpu, regs->rflags);
> > +
> > +	kvm_make_request(KVM_REQ_EVENT, vcpu);
> > +}
> > +
> 
> kvm_arch_vcpu_ioctl_set_regs() returns an int (so that, for e.g., in ARM 
> it can return an error to indicate that the function is not 
> supported/implemented). Is there a reason this function shouldn't do the 
> same (is it only ever going to be implemented for x86)?
> 
> > diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
> > index 6bdd4b9f6611..68e4d756f5c9 100644
> > --- a/include/linux/kvm_host.h
> > +++ b/include/linux/kvm_host.h
> > @@ -767,6 +767,7 @@ int kvm_arch_vcpu_ioctl_translate(struct kvm_vcpu *vcpu,
> >   
> >   int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs);
> >   int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs);
> > +void kvm_arch_vcpu_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs);
> >   int kvm_arch_vcpu_ioctl_get_sregs(struct kvm_vcpu *vcpu,
> >   				  struct kvm_sregs *sregs);
> 
> 
> Patrick

Hi Patrick,

Thank you for taking the time to review these patches.

You're right. This function should return an error code, regardless on
the time when ARM will be supported.

Adalbert
diff mbox

Patch

diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index e1a3c2c6ec08..4b0c3692386d 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -7389,6 +7389,40 @@  int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)
 	return 0;
 }
 
+/*
+ * Similar to kvm_arch_vcpu_ioctl_set_regs() but it does not reset
+ * the exceptions
+ */
+void kvm_arch_vcpu_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)
+{
+	vcpu->arch.emulate_regs_need_sync_from_vcpu = true;
+	vcpu->arch.emulate_regs_need_sync_to_vcpu = false;
+
+	kvm_register_write(vcpu, VCPU_REGS_RAX, regs->rax);
+	kvm_register_write(vcpu, VCPU_REGS_RBX, regs->rbx);
+	kvm_register_write(vcpu, VCPU_REGS_RCX, regs->rcx);
+	kvm_register_write(vcpu, VCPU_REGS_RDX, regs->rdx);
+	kvm_register_write(vcpu, VCPU_REGS_RSI, regs->rsi);
+	kvm_register_write(vcpu, VCPU_REGS_RDI, regs->rdi);
+	kvm_register_write(vcpu, VCPU_REGS_RSP, regs->rsp);
+	kvm_register_write(vcpu, VCPU_REGS_RBP, regs->rbp);
+#ifdef CONFIG_X86_64
+	kvm_register_write(vcpu, VCPU_REGS_R8, regs->r8);
+	kvm_register_write(vcpu, VCPU_REGS_R9, regs->r9);
+	kvm_register_write(vcpu, VCPU_REGS_R10, regs->r10);
+	kvm_register_write(vcpu, VCPU_REGS_R11, regs->r11);
+	kvm_register_write(vcpu, VCPU_REGS_R12, regs->r12);
+	kvm_register_write(vcpu, VCPU_REGS_R13, regs->r13);
+	kvm_register_write(vcpu, VCPU_REGS_R14, regs->r14);
+	kvm_register_write(vcpu, VCPU_REGS_R15, regs->r15);
+#endif
+
+	kvm_rip_write(vcpu, regs->rip);
+	kvm_set_rflags(vcpu, regs->rflags);
+
+	kvm_make_request(KVM_REQ_EVENT, vcpu);
+}
+
 void kvm_get_cs_db_l_bits(struct kvm_vcpu *vcpu, int *db, int *l)
 {
 	struct kvm_segment cs;
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
index 6bdd4b9f6611..68e4d756f5c9 100644
--- a/include/linux/kvm_host.h
+++ b/include/linux/kvm_host.h
@@ -767,6 +767,7 @@  int kvm_arch_vcpu_ioctl_translate(struct kvm_vcpu *vcpu,
 
 int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs);
 int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs);
+void kvm_arch_vcpu_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs);
 int kvm_arch_vcpu_ioctl_get_sregs(struct kvm_vcpu *vcpu,
 				  struct kvm_sregs *sregs);
 int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu,