From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: shuo.a.liu@intel.com
Cc: linux-kernel@vger.kernel.org, x86@kernel.org,
"H . Peter Anvin" <hpa@zytor.com>,
Thomas Gleixner <tglx@linutronix.de>,
Ingo Molnar <mingo@redhat.com>, Borislav Petkov <bp@alien8.de>,
Yu Wang <yu1.wang@intel.com>,
Reinette Chatre <reinette.chatre@intel.com>,
Zhi Wang <zhi.a.wang@intel.com>,
Zhenyu Wang <zhenyuw@linux.intel.com>
Subject: Re: [PATCH v7 07/18] virt: acrn: Introduce an ioctl to set vCPU registers state
Date: Fri, 8 Jan 2021 16:33:22 +0100 [thread overview]
Message-ID: <X/h7QoSqRw2Anfvo@kroah.com> (raw)
In-Reply-To: <20210106075055.47226-8-shuo.a.liu@intel.com>
On Wed, Jan 06, 2021 at 03:50:44PM +0800, shuo.a.liu@intel.com wrote:
> From: Shuo Liu <shuo.a.liu@intel.com>
>
> A virtual CPU of User VM has different context due to the different
> registers state. ACRN userspace needs to set the virtual CPU
> registers state (e.g. giving a initial registers state to a virtual
> BSP of a User VM).
>
> HSM provides an ioctl ACRN_IOCTL_SET_VCPU_REGS to do the virtual CPU
> registers state setting. The ioctl passes the registers state from ACRN
> userspace to the hypervisor directly.
>
> Signed-off-by: Shuo Liu <shuo.a.liu@intel.com>
> Reviewed-by: Zhi Wang <zhi.a.wang@intel.com>
> Reviewed-by: Reinette Chatre <reinette.chatre@intel.com>
> Cc: Zhi Wang <zhi.a.wang@intel.com>
> Cc: Zhenyu Wang <zhenyuw@linux.intel.com>
> Cc: Yu Wang <yu1.wang@intel.com>
> Cc: Reinette Chatre <reinette.chatre@intel.com>
> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> ---
> drivers/virt/acrn/hsm.c | 21 ++++++++++-
> drivers/virt/acrn/hypercall.h | 13 +++++++
> include/uapi/linux/acrn.h | 69 +++++++++++++++++++++++++++++++++++
> 3 files changed, 102 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/virt/acrn/hsm.c b/drivers/virt/acrn/hsm.c
> index 5fd933471683..2d04ebaa43f8 100644
> --- a/drivers/virt/acrn/hsm.c
> +++ b/drivers/virt/acrn/hsm.c
> @@ -9,6 +9,7 @@
> * Yakui Zhao <yakui.zhao@intel.com>
> */
>
> +#include <linux/io.h>
> #include <linux/mm.h>
> #include <linux/module.h>
> #include <linux/slab.h>
> @@ -46,7 +47,8 @@ static long acrn_dev_ioctl(struct file *filp, unsigned int cmd,
> {
> struct acrn_vm *vm = filp->private_data;
> struct acrn_vm_creation *vm_param;
> - int ret = 0;
> + struct acrn_vcpu_regs *cpu_regs;
> + int i, ret = 0;
>
> if (vm->vmid == ACRN_INVALID_VMID && cmd != ACRN_IOCTL_CREATE_VM) {
> dev_dbg(acrn_dev.this_device,
> @@ -100,6 +102,23 @@ static long acrn_dev_ioctl(struct file *filp, unsigned int cmd,
> case ACRN_IOCTL_DESTROY_VM:
> ret = acrn_vm_destroy(vm);
> break;
> + case ACRN_IOCTL_SET_VCPU_REGS:
> + cpu_regs = memdup_user((void __user *)ioctl_param,
> + sizeof(struct acrn_vcpu_regs));
> + if (IS_ERR(cpu_regs))
> + return PTR_ERR(cpu_regs);
> +
> + for (i = 0; i < ARRAY_SIZE(cpu_regs->reserved); i++)
> + if (cpu_regs->reserved[i])
> + return -EINVAL;
> +
> + ret = hcall_set_vcpu_regs(vm->vmid, virt_to_phys(cpu_regs));
> + if (ret < 0)
> + dev_dbg(acrn_dev.this_device,
> + "Failed to set regs state of VM%u!\n",
> + vm->vmid);
> + kfree(cpu_regs);
> + break;
> default:
> dev_dbg(acrn_dev.this_device, "Unknown IOCTL 0x%x!\n", cmd);
> ret = -ENOTTY;
> diff --git a/drivers/virt/acrn/hypercall.h b/drivers/virt/acrn/hypercall.h
> index 426b66cadb1f..f29cfae08862 100644
> --- a/drivers/virt/acrn/hypercall.h
> +++ b/drivers/virt/acrn/hypercall.h
> @@ -19,6 +19,7 @@
> #define HC_START_VM _HC_ID(HC_ID, HC_ID_VM_BASE + 0x02)
> #define HC_PAUSE_VM _HC_ID(HC_ID, HC_ID_VM_BASE + 0x03)
> #define HC_RESET_VM _HC_ID(HC_ID, HC_ID_VM_BASE + 0x05)
> +#define HC_SET_VCPU_REGS _HC_ID(HC_ID, HC_ID_VM_BASE + 0x06)
>
> /**
> * hcall_create_vm() - Create a User VM
> @@ -75,4 +76,16 @@ static inline long hcall_reset_vm(u64 vmid)
> return acrn_hypercall1(HC_RESET_VM, vmid);
> }
>
> +/**
> + * hcall_set_vcpu_regs() - Set up registers of virtual CPU of a User VM
> + * @vmid: User VM ID
> + * @regs_state: Service VM GPA of registers state
> + *
> + * Return: 0 on success, <0 on failure
> + */
> +static inline long hcall_set_vcpu_regs(u64 vmid, u64 regs_state)
> +{
> + return acrn_hypercall2(HC_SET_VCPU_REGS, vmid, regs_state);
> +}
> +
> #endif /* __ACRN_HSM_HYPERCALL_H */
> diff --git a/include/uapi/linux/acrn.h b/include/uapi/linux/acrn.h
> index e1608b8a50a2..d5d66b93586e 100644
> --- a/include/uapi/linux/acrn.h
> +++ b/include/uapi/linux/acrn.h
> @@ -35,6 +35,73 @@ struct acrn_vm_creation {
> __u64 cpu_affinity;
> };
>
> +struct acrn_gp_regs {
> + __le64 rax;
> + __le64 rcx;
> + __le64 rdx;
> + __le64 rbx;
> + __le64 rsp;
> + __le64 rbp;
> + __le64 rsi;
> + __le64 rdi;
> + __le64 r8;
> + __le64 r9;
> + __le64 r10;
> + __le64 r11;
> + __le64 r12;
> + __le64 r13;
> + __le64 r14;
> + __le64 r15;
> +};
> +
> +struct acrn_descriptor_ptr {
> + __le16 limit;
> + __le64 base;
> + __le16 reserved[3];
> +} __attribute__ ((__packed__));
> +
> +struct acrn_regs {
> + struct acrn_gp_regs gprs;
> + struct acrn_descriptor_ptr gdt;
> + struct acrn_descriptor_ptr idt;
> +
> + __le64 rip;
> + __le64 cs_base;
> + __le64 cr0;
> + __le64 cr4;
> + __le64 cr3;
> + __le64 ia32_efer;
> + __le64 rflags;
> + __le64 reserved_64[4];
> +
> + __le32 cs_ar;
> + __le32 cs_limit;
> + __le32 reserved_32[3];
> +
> + __le16 cs_sel;
> + __le16 ss_sel;
> + __le16 ds_sel;
> + __le16 es_sel;
> + __le16 fs_sel;
> + __le16 gs_sel;
> + __le16 ldt_sel;
> + __le16 tr_sel;
> +};
No documentation of what these variables are anywhere?
What about the reserved slots, what must they be set to?
> +
> +/**
> + * struct acrn_vcpu_regs - Info of vCPU registers state
> + * @vcpu_id: vCPU ID
> + * @reserved: Reserved and must be 0
You actually checked this, nice!
thanks,
greg k-h
next prev parent reply other threads:[~2021-01-08 15:32 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-01-06 7:50 [PATCH v7 00/18] HSM driver for ACRN hypervisor shuo.a.liu
2021-01-06 7:50 ` [PATCH v7 01/18] docs: acrn: Introduce ACRN shuo.a.liu
2021-01-18 22:30 ` Randy Dunlap
2021-01-19 1:36 ` Shuo A Liu
2021-01-06 7:50 ` [PATCH v7 02/18] x86/acrn: Introduce acrn_{setup, remove}_intr_handler() shuo.a.liu
2021-01-06 7:50 ` [PATCH v7 03/18] x86/acrn: Introduce acrn_cpuid_base() and hypervisor feature bits shuo.a.liu
2021-01-06 7:50 ` [PATCH v7 04/18] x86/acrn: Introduce hypercall interfaces shuo.a.liu
2021-01-06 7:50 ` [PATCH v7 05/18] virt: acrn: Introduce ACRN HSM basic driver shuo.a.liu
2021-01-06 7:50 ` [PATCH v7 06/18] virt: acrn: Introduce VM management interfaces shuo.a.liu
2021-01-08 15:31 ` Greg Kroah-Hartman
2021-01-11 3:55 ` Shuo A Liu
2021-01-06 7:50 ` [PATCH v7 07/18] virt: acrn: Introduce an ioctl to set vCPU registers state shuo.a.liu
2021-01-08 15:33 ` Greg Kroah-Hartman [this message]
2021-01-11 3:59 ` Shuo A Liu
2021-01-06 7:50 ` [PATCH v7 08/18] virt: acrn: Introduce EPT mapping management shuo.a.liu
2021-01-08 15:34 ` Greg Kroah-Hartman
2021-01-11 4:03 ` Shuo A Liu
2021-01-06 7:50 ` [PATCH v7 09/18] virt: acrn: Introduce I/O request management shuo.a.liu
2021-01-11 21:52 ` Davidlohr Bueso
2021-01-12 6:05 ` Shuo A Liu
2021-01-12 17:29 ` Davidlohr Bueso
2021-01-06 7:50 ` [PATCH v7 10/18] virt: acrn: Introduce PCI configuration space PIO accesses combiner shuo.a.liu
2021-01-06 7:50 ` [PATCH v7 11/18] virt: acrn: Introduce interfaces for PCI device passthrough shuo.a.liu
2021-01-06 7:50 ` [PATCH v7 12/18] virt: acrn: Introduce interrupt injection interfaces shuo.a.liu
2021-01-06 7:50 ` [PATCH v7 13/18] virt: acrn: Introduce interfaces to query C-states and P-states allowed by hypervisor shuo.a.liu
2021-01-06 7:50 ` [PATCH v7 14/18] virt: acrn: Introduce I/O ranges operation interfaces shuo.a.liu
2021-01-06 7:50 ` [PATCH v7 15/18] virt: acrn: Introduce ioeventfd shuo.a.liu
2021-01-06 7:50 ` [PATCH v7 16/18] virt: acrn: Introduce irqfd shuo.a.liu
2021-01-06 7:50 ` [PATCH v7 17/18] virt: acrn: Introduce an interface for Service VM to control vCPU shuo.a.liu
2021-01-06 7:50 ` [PATCH v7 18/18] sample/acrn: Introduce a sample of HSM ioctl interface usage shuo.a.liu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=X/h7QoSqRw2Anfvo@kroah.com \
--to=gregkh@linuxfoundation.org \
--cc=bp@alien8.de \
--cc=hpa@zytor.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=reinette.chatre@intel.com \
--cc=shuo.a.liu@intel.com \
--cc=tglx@linutronix.de \
--cc=x86@kernel.org \
--cc=yu1.wang@intel.com \
--cc=zhenyuw@linux.intel.com \
--cc=zhi.a.wang@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.