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>,
Sean Christopherson <sean.j.christopherson@intel.com>,
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 v5 07/17] virt: acrn: Introduce an ioctl to set vCPU registers state
Date: Mon, 9 Nov 2020 18:09:40 +0100 [thread overview]
Message-ID: <20201109170940.GA2013864@kroah.com> (raw)
In-Reply-To: <20201019061803.13298-8-shuo.a.liu@intel.com>
On Mon, Oct 19, 2020 at 02:17:53PM +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 | 15 ++++++++
> drivers/virt/acrn/hypercall.h | 13 +++++++
> include/uapi/linux/acrn.h | 71 +++++++++++++++++++++++++++++++++++
> 3 files changed, 99 insertions(+)
>
> diff --git a/drivers/virt/acrn/hsm.c b/drivers/virt/acrn/hsm.c
> index cbda67d4eb89..58ceb02e82db 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,6 +47,7 @@ static long acrn_dev_ioctl(struct file *filp, unsigned int cmd,
> {
> struct acrn_vm *vm = filp->private_data;
> struct acrn_vm_creation *vm_param;
> + struct acrn_vcpu_regs *cpu_regs;
> int ret = 0;
>
> if (vm->vmid == ACRN_INVALID_VMID && cmd != ACRN_IOCTL_CREATE_VM) {
> @@ -97,6 +99,19 @@ 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);
> +
> + ret = hcall_set_vcpu_regs(vm->vmid, virt_to_phys(cpu_regs));
Why the virt_to_phys() call here? And there really is no validation of
any fields?
> + if (ret < 0)
> + dev_dbg(acrn_dev.this_device,
Wait, a global, static device? Where did I miss that? That feels odd,
why is there just one?
> + "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 364b1a783074..1d5b82e154fb 100644
> --- a/include/uapi/linux/acrn.h
> +++ b/include/uapi/linux/acrn.h
> @@ -36,6 +36,75 @@ struct acrn_vm_creation {
> __u8 reserved2[8];
> } __attribute__((aligned(8)));
>
> +struct acrn_gp_regs {
> + __u64 rax;
> + __u64 rcx;
> + __u64 rdx;
> + __u64 rbx;
> + __u64 rsp;
> + __u64 rbp;
> + __u64 rsi;
> + __u64 rdi;
> + __u64 r8;
> + __u64 r9;
> + __u64 r10;
> + __u64 r11;
> + __u64 r12;
> + __u64 r13;
> + __u64 r14;
> + __u64 r15;
> +};
> +
> +struct acrn_descriptor_ptr {
> + __u16 limit;
> + __u64 base;
> + __u16 reserved[3];
> +} __attribute__ ((__packed__));
> +
> +struct acrn_regs {
> + struct acrn_gp_regs gprs;
> + struct acrn_descriptor_ptr gdt;
> + struct acrn_descriptor_ptr idt;
> +
> + __u64 rip;
As these are all crossing the user/kernel boundry and then on to
somewhere "else", you have to specify the endian of all of these, right?
if not, why not?
> + __u64 cs_base;
> + __u64 cr0;
> + __u64 cr4;
> + __u64 cr3;
> + __u64 ia32_efer;
> + __u64 rflags;
> + __u64 reserved_64[4];
> +
> + __u32 cs_ar;
> + __u32 cs_limit;
> + __u32 reserved_32[3];
> +
> + __u16 cs_sel;
> + __u16 ss_sel;
> + __u16 ds_sel;
> + __u16 es_sel;
> + __u16 fs_sel;
> + __u16 gs_sel;
> + __u16 ldt_sel;
> + __u16 tr_sel;
> +
> + __u16 reserved_16[4];
> +};
> +
> +/**
> + * struct acrn_vcpu_regs - Info of vCPU registers state
> + * @vcpu_id: vCPU ID
> + * @reserved0: Reserved
> + * @vcpu_regs: vCPU registers state
> + *
> + * This structure will be passed to hypervisor directly.
> + */
> +struct acrn_vcpu_regs {
> + __u16 vcpu_id;
Endian?
> + __u16 reserved0[3];
What does the reserved fields do?
Is there a pointer to a public document for all of these structures
somewhere?
> + struct acrn_regs vcpu_regs;
> +} __attribute__((aligned(8)));
What does the alignment do here?
thanks,
greg k-h
next prev parent reply other threads:[~2020-11-09 17:08 UTC|newest]
Thread overview: 61+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-10-19 6:17 [PATCH v5 00/17] HSM driver for ACRN hypervisor shuo.a.liu
2020-10-19 6:17 ` [PATCH v5 01/17] docs: acrn: Introduce ACRN shuo.a.liu
2020-10-19 6:17 ` [PATCH v5 02/17] x86/acrn: Introduce acrn_{setup, remove}_intr_handler() shuo.a.liu
2020-10-19 6:17 ` [PATCH v5 03/17] x86/acrn: Introduce an API to check if a VM is privileged shuo.a.liu
2020-11-02 14:37 ` Borislav Petkov
2020-11-03 6:27 ` Shuo A Liu
2020-11-03 10:25 ` Borislav Petkov
2020-11-04 3:50 ` Shuo A Liu
2020-11-04 18:51 ` Borislav Petkov
2020-11-05 3:25 ` Shuo A Liu
2020-10-19 6:17 ` [PATCH v5 04/17] x86/acrn: Introduce hypercall interfaces shuo.a.liu
2020-10-19 21:53 ` Nick Desaulniers
2020-10-19 22:15 ` Arvind Sankar
2020-10-20 1:38 ` Shuo A Liu
2020-10-20 2:08 ` Arvind Sankar
2020-10-20 2:30 ` Shuo A Liu
2020-10-20 14:16 ` Arvind Sankar
2020-10-21 1:16 ` Shuo A Liu
2020-11-02 14:56 ` Borislav Petkov
2020-11-02 16:09 ` Segher Boessenkool
2020-11-02 17:19 ` Borislav Petkov
2020-11-02 18:10 ` Segher Boessenkool
2020-11-02 18:34 ` Borislav Petkov
2020-11-02 20:01 ` Segher Boessenkool
2020-11-02 22:54 ` Borislav Petkov
2020-11-02 23:18 ` Segher Boessenkool
2020-11-03 16:44 ` Borislav Petkov
2020-11-03 18:47 ` Segher Boessenkool
2020-11-03 19:43 ` Borislav Petkov
2020-10-19 6:17 ` [PATCH v5 05/17] virt: acrn: Introduce ACRN HSM basic driver shuo.a.liu
2020-10-19 6:17 ` [PATCH v5 06/17] virt: acrn: Introduce VM management interfaces shuo.a.liu
2020-11-04 19:02 ` Greg Kroah-Hartman
2020-11-05 3:10 ` Shuo A Liu
2020-11-05 6:29 ` Greg Kroah-Hartman
2020-11-05 7:35 ` Shuo A Liu
2020-11-05 8:26 ` Greg Kroah-Hartman
2020-11-05 9:02 ` Shuo A Liu
2020-11-05 9:16 ` Greg Kroah-Hartman
2020-11-05 12:48 ` Shuo A Liu
2020-11-05 13:04 ` Greg Kroah-Hartman
2020-10-19 6:17 ` [PATCH v5 07/17] virt: acrn: Introduce an ioctl to set vCPU registers state shuo.a.liu
2020-11-09 17:09 ` Greg Kroah-Hartman [this message]
2020-11-10 13:14 ` Shuo A Liu
2020-11-10 14:54 ` Greg Kroah-Hartman
2020-11-11 9:54 ` Shuo A Liu
2020-11-11 10:28 ` Greg Kroah-Hartman
2020-11-11 12:03 ` Shuo A Liu
2020-11-11 12:29 ` Greg Kroah-Hartman
2020-11-11 16:55 ` Shuo A Liu
2020-10-19 6:17 ` [PATCH v5 08/17] virt: acrn: Introduce EPT mapping management shuo.a.liu
2020-10-19 6:17 ` [PATCH v5 09/17] virt: acrn: Introduce I/O request management shuo.a.liu
2020-10-19 6:17 ` [PATCH v5 10/17] virt: acrn: Introduce PCI configuration space PIO accesses combiner shuo.a.liu
2020-10-19 6:17 ` [PATCH v5 11/17] virt: acrn: Introduce interfaces for PCI device passthrough shuo.a.liu
2020-10-19 6:17 ` [PATCH v5 12/17] virt: acrn: Introduce interrupt injection interfaces shuo.a.liu
2020-10-19 6:17 ` [PATCH v5 13/17] virt: acrn: Introduce interfaces to query C-states and P-states allowed by hypervisor shuo.a.liu
2020-10-19 6:18 ` [PATCH v5 14/17] virt: acrn: Introduce I/O ranges operation interfaces shuo.a.liu
2020-10-19 6:18 ` [PATCH v5 15/17] virt: acrn: Introduce ioeventfd shuo.a.liu
2020-10-19 6:18 ` [PATCH v5 16/17] virt: acrn: Introduce irqfd shuo.a.liu
2020-10-19 6:18 ` [PATCH v5 17/17] virt: acrn: Introduce an interface for Service VM to control vCPU shuo.a.liu
2020-10-21 15:19 ` [PATCH v5 00/17] HSM driver for ACRN hypervisor Dave Hansen
2020-10-26 0:39 ` 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=20201109170940.GA2013864@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=sean.j.christopherson@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.