All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: Marc Zyngier <marc.zyngier@arm.com>
Cc: linux-arm-kernel@lists.infradead.org, kvm@vger.kernel.org,
	kvmarm@lists.cs.columbia.edu, catalin.marinas@arm.com
Subject: Re: [PATCH 08/29] arm64: KVM: user space interface
Date: Thu, 7 Mar 2013 10:09:03 +0200	[thread overview]
Message-ID: <20130307080903.GA3819@redhat.com> (raw)
In-Reply-To: <1362455265-24165-9-git-send-email-marc.zyngier@arm.com>

On Tue, Mar 05, 2013 at 03:47:24AM +0000, Marc Zyngier wrote:
> Provide the kvm.h file that defines the user space visible
> interface.
> 
> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
> ---
>  arch/arm64/include/uapi/asm/kvm.h | 112 ++++++++++++++++++++++++++++++++++++++
>  1 file changed, 112 insertions(+)
>  create mode 100644 arch/arm64/include/uapi/asm/kvm.h
> 
> diff --git a/arch/arm64/include/uapi/asm/kvm.h b/arch/arm64/include/uapi/asm/kvm.h
> new file mode 100644
> index 0000000..f5525f1
> --- /dev/null
> +++ b/arch/arm64/include/uapi/asm/kvm.h
> @@ -0,0 +1,112 @@
> +/*
> + * Copyright (C) 2012 - ARM Ltd
> + * Author: Marc Zyngier <marc.zyngier@arm.com>
> + *
> + * Derived from arch/arm/include/uapi/asm/kvm.h:
> + * Copyright (C) 2012 - Virtual Open Systems and Columbia University
> + * Author: Christoffer Dall <c.dall@virtualopensystems.com>
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2 as
> + * published by the Free Software Foundation.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program.  If not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +#ifndef __ARM_KVM_H__
> +#define __ARM_KVM_H__
> +
> +#define KVM_SPSR_EL1	0
> +#define KVM_NR_SPSR	1
> +
> +#ifndef __ASSEMBLY__
> +#include <asm/types.h>
> +#include <asm/ptrace.h>
> +
> +#define __KVM_HAVE_GUEST_DEBUG
> +#define __KVM_HAVE_IRQ_LINE
> +
> +#define KVM_REG_SIZE(id)						\
> +	(1U << (((id) & KVM_REG_SIZE_MASK) >> KVM_REG_SIZE_SHIFT))
> +
> +struct kvm_regs {
> +	struct user_pt_regs regs;	/* sp = sp_el0 */
> +
> +	unsigned long	sp_el1;
> +	unsigned long	elr_el1;
> +
> +	unsigned long	spsr[KVM_NR_SPSR];
> +};
> +

Using long in uapi is generally a mistake: with gcc it has
different size depending on whether you build in 64 and 32 bit mode.
I think it is better to make it __u64.

> +/* Supported Processor Types */
> +#define KVM_ARM_TARGET_CORTEX_A57	0
> +#define KVM_ARM_NUM_TARGETS		1
> +
> +/* KVM_ARM_SET_DEVICE_ADDR ioctl id encoding */
> +#define KVM_ARM_DEVICE_TYPE_SHIFT	0
> +#define KVM_ARM_DEVICE_TYPE_MASK	(0xffff << KVM_ARM_DEVICE_TYPE_SHIFT)
> +#define KVM_ARM_DEVICE_ID_SHIFT		16
> +#define KVM_ARM_DEVICE_ID_MASK		(0xffff << KVM_ARM_DEVICE_ID_SHIFT)
> +
> +/* Supported device IDs */
> +#define KVM_ARM_DEVICE_VGIC_V2		0
> +
> +/* Supported VGIC address types  */
> +#define KVM_VGIC_V2_ADDR_TYPE_DIST	0
> +#define KVM_VGIC_V2_ADDR_TYPE_CPU	1
> +
> +#define KVM_VGIC_V2_DIST_SIZE		0x1000
> +#define KVM_VGIC_V2_CPU_SIZE		0x2000
> +
> +struct kvm_vcpu_init {
> +	__u32 target;
> +	__u32 features[7];
> +};
> +
> +struct kvm_sregs {
> +};
> +
> +struct kvm_fpu {
> +};
> +
> +struct kvm_guest_debug_arch {
> +};
> +
> +struct kvm_debug_exit_arch {
> +};
> +

This is a problem too: structure alignment is different
in -m32 versus -m64 modes, which will affect the offset of
the following fields. I think it's best to add a "padding"
field in there, and size it to multiple of 8 bytes.

I think the same is a good idea for other empty stuctures,
since otherwise the padding is implicit and
not initialized by gcc, and it is hard not too leak
info to userspace when you copy these structures out.

And, it'll be handy if you want to extend the structures
down the line.

> +struct kvm_sync_regs {
> +};
> +
> +struct kvm_arch_memory_slot {
> +};
> +
> +/* KVM_IRQ_LINE irq field index values */
> +#define KVM_ARM_IRQ_TYPE_SHIFT		24
> +#define KVM_ARM_IRQ_TYPE_MASK		0xff
> +#define KVM_ARM_IRQ_VCPU_SHIFT		16
> +#define KVM_ARM_IRQ_VCPU_MASK		0xff
> +#define KVM_ARM_IRQ_NUM_SHIFT		0
> +#define KVM_ARM_IRQ_NUM_MASK		0xffff
> +
> +/* irq_type field */
> +#define KVM_ARM_IRQ_TYPE_CPU		0
> +#define KVM_ARM_IRQ_TYPE_SPI		1
> +#define KVM_ARM_IRQ_TYPE_PPI		2
> +
> +/* out-of-kernel GIC cpu interrupt injection irq_number field */
> +#define KVM_ARM_IRQ_CPU_IRQ		0
> +#define KVM_ARM_IRQ_CPU_FIQ		1
> +
> +/* Highest supported SPI, from VGIC_NR_IRQS */
> +#define KVM_ARM_IRQ_GIC_MAX		127
> +
> +#endif
> +
> +#endif /* __ARM_KVM_H__ */
> -- 
> 1.7.12.4
> 
> --
> To unsubscribe from this list: send the line "unsubscribe kvm" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

WARNING: multiple messages have this Message-ID (diff)
From: mst@redhat.com (Michael S. Tsirkin)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 08/29] arm64: KVM: user space interface
Date: Thu, 7 Mar 2013 10:09:03 +0200	[thread overview]
Message-ID: <20130307080903.GA3819@redhat.com> (raw)
In-Reply-To: <1362455265-24165-9-git-send-email-marc.zyngier@arm.com>

On Tue, Mar 05, 2013 at 03:47:24AM +0000, Marc Zyngier wrote:
> Provide the kvm.h file that defines the user space visible
> interface.
> 
> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
> ---
>  arch/arm64/include/uapi/asm/kvm.h | 112 ++++++++++++++++++++++++++++++++++++++
>  1 file changed, 112 insertions(+)
>  create mode 100644 arch/arm64/include/uapi/asm/kvm.h
> 
> diff --git a/arch/arm64/include/uapi/asm/kvm.h b/arch/arm64/include/uapi/asm/kvm.h
> new file mode 100644
> index 0000000..f5525f1
> --- /dev/null
> +++ b/arch/arm64/include/uapi/asm/kvm.h
> @@ -0,0 +1,112 @@
> +/*
> + * Copyright (C) 2012 - ARM Ltd
> + * Author: Marc Zyngier <marc.zyngier@arm.com>
> + *
> + * Derived from arch/arm/include/uapi/asm/kvm.h:
> + * Copyright (C) 2012 - Virtual Open Systems and Columbia University
> + * Author: Christoffer Dall <c.dall@virtualopensystems.com>
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2 as
> + * published by the Free Software Foundation.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program.  If not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +#ifndef __ARM_KVM_H__
> +#define __ARM_KVM_H__
> +
> +#define KVM_SPSR_EL1	0
> +#define KVM_NR_SPSR	1
> +
> +#ifndef __ASSEMBLY__
> +#include <asm/types.h>
> +#include <asm/ptrace.h>
> +
> +#define __KVM_HAVE_GUEST_DEBUG
> +#define __KVM_HAVE_IRQ_LINE
> +
> +#define KVM_REG_SIZE(id)						\
> +	(1U << (((id) & KVM_REG_SIZE_MASK) >> KVM_REG_SIZE_SHIFT))
> +
> +struct kvm_regs {
> +	struct user_pt_regs regs;	/* sp = sp_el0 */
> +
> +	unsigned long	sp_el1;
> +	unsigned long	elr_el1;
> +
> +	unsigned long	spsr[KVM_NR_SPSR];
> +};
> +

Using long in uapi is generally a mistake: with gcc it has
different size depending on whether you build in 64 and 32 bit mode.
I think it is better to make it __u64.

> +/* Supported Processor Types */
> +#define KVM_ARM_TARGET_CORTEX_A57	0
> +#define KVM_ARM_NUM_TARGETS		1
> +
> +/* KVM_ARM_SET_DEVICE_ADDR ioctl id encoding */
> +#define KVM_ARM_DEVICE_TYPE_SHIFT	0
> +#define KVM_ARM_DEVICE_TYPE_MASK	(0xffff << KVM_ARM_DEVICE_TYPE_SHIFT)
> +#define KVM_ARM_DEVICE_ID_SHIFT		16
> +#define KVM_ARM_DEVICE_ID_MASK		(0xffff << KVM_ARM_DEVICE_ID_SHIFT)
> +
> +/* Supported device IDs */
> +#define KVM_ARM_DEVICE_VGIC_V2		0
> +
> +/* Supported VGIC address types  */
> +#define KVM_VGIC_V2_ADDR_TYPE_DIST	0
> +#define KVM_VGIC_V2_ADDR_TYPE_CPU	1
> +
> +#define KVM_VGIC_V2_DIST_SIZE		0x1000
> +#define KVM_VGIC_V2_CPU_SIZE		0x2000
> +
> +struct kvm_vcpu_init {
> +	__u32 target;
> +	__u32 features[7];
> +};
> +
> +struct kvm_sregs {
> +};
> +
> +struct kvm_fpu {
> +};
> +
> +struct kvm_guest_debug_arch {
> +};
> +
> +struct kvm_debug_exit_arch {
> +};
> +

This is a problem too: structure alignment is different
in -m32 versus -m64 modes, which will affect the offset of
the following fields. I think it's best to add a "padding"
field in there, and size it to multiple of 8 bytes.

I think the same is a good idea for other empty stuctures,
since otherwise the padding is implicit and
not initialized by gcc, and it is hard not too leak
info to userspace when you copy these structures out.

And, it'll be handy if you want to extend the structures
down the line.

> +struct kvm_sync_regs {
> +};
> +
> +struct kvm_arch_memory_slot {
> +};
> +
> +/* KVM_IRQ_LINE irq field index values */
> +#define KVM_ARM_IRQ_TYPE_SHIFT		24
> +#define KVM_ARM_IRQ_TYPE_MASK		0xff
> +#define KVM_ARM_IRQ_VCPU_SHIFT		16
> +#define KVM_ARM_IRQ_VCPU_MASK		0xff
> +#define KVM_ARM_IRQ_NUM_SHIFT		0
> +#define KVM_ARM_IRQ_NUM_MASK		0xffff
> +
> +/* irq_type field */
> +#define KVM_ARM_IRQ_TYPE_CPU		0
> +#define KVM_ARM_IRQ_TYPE_SPI		1
> +#define KVM_ARM_IRQ_TYPE_PPI		2
> +
> +/* out-of-kernel GIC cpu interrupt injection irq_number field */
> +#define KVM_ARM_IRQ_CPU_IRQ		0
> +#define KVM_ARM_IRQ_CPU_FIQ		1
> +
> +/* Highest supported SPI, from VGIC_NR_IRQS */
> +#define KVM_ARM_IRQ_GIC_MAX		127
> +
> +#endif
> +
> +#endif /* __ARM_KVM_H__ */
> -- 
> 1.7.12.4
> 
> --
> To unsubscribe from this list: send the line "unsubscribe kvm" in
> the body of a message to majordomo at vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

  reply	other threads:[~2013-03-07  8:09 UTC|newest]

Thread overview: 128+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-03-05  3:47 [PATCH 00/29] Port of KVM to arm64 Marc Zyngier
2013-03-05  3:47 ` Marc Zyngier
2013-03-05  3:47 ` [PATCH 01/29] arm64: KVM: define HYP and Stage-2 translation page flags Marc Zyngier
2013-03-05  3:47   ` Marc Zyngier
2013-03-05  3:47 ` [PATCH 02/29] arm64: KVM: HYP mode idmap support Marc Zyngier
2013-03-05  3:47   ` Marc Zyngier
2013-03-05  3:47 ` [PATCH 03/29] arm64: KVM: EL2 register definitions Marc Zyngier
2013-03-05  3:47   ` Marc Zyngier
2013-03-05  3:47 ` [PATCH 04/29] arm64: KVM: system register definitions for 64bit guests Marc Zyngier
2013-03-05  3:47   ` Marc Zyngier
2013-03-07 10:33   ` [kvmarm] " Alexander Graf
2013-03-07 10:33     ` Alexander Graf
2013-03-08  3:23     ` Marc Zyngier
2013-03-08  3:23       ` Marc Zyngier
2013-03-12 13:20   ` Christopher Covington
2013-03-12 13:20     ` Christopher Covington
2013-03-12 13:41     ` Christopher Covington
2013-03-12 13:41       ` Christopher Covington
2013-03-12 13:50     ` Marc Zyngier
2013-03-12 13:50       ` Marc Zyngier
2013-03-05  3:47 ` [PATCH 05/29] arm64: KVM: Basic ESR_EL2 helpers and vcpu register access Marc Zyngier
2013-03-05  3:47   ` Marc Zyngier
2013-03-16  0:55   ` Geoff Levand
2013-03-16  0:55     ` Geoff Levand
2013-03-05  3:47 ` [PATCH 06/29] arm64: KVM: fault injection into a guest Marc Zyngier
2013-03-05  3:47   ` Marc Zyngier
2013-03-12 13:20   ` Christopher Covington
2013-03-12 13:20     ` Christopher Covington
2013-03-12 14:25     ` Marc Zyngier
2013-03-12 14:25       ` Marc Zyngier
2013-03-16  1:03   ` Geoff Levand
2013-03-16  1:03     ` Geoff Levand
2013-03-05  3:47 ` [PATCH 07/29] arm64: KVM: architecture specific MMU backend Marc Zyngier
2013-03-05  3:47   ` Marc Zyngier
2013-03-05  3:47 ` [PATCH 08/29] arm64: KVM: user space interface Marc Zyngier
2013-03-05  3:47   ` Marc Zyngier
2013-03-07  8:09   ` Michael S. Tsirkin [this message]
2013-03-07  8:09     ` Michael S. Tsirkin
2013-03-08  3:46     ` [kvmarm] " Marc Zyngier
2013-03-08  3:46       ` Marc Zyngier
2013-03-10  9:23       ` Michael S. Tsirkin
2013-03-10  9:23         ` Michael S. Tsirkin
2013-03-05  3:47 ` [PATCH 09/29] arm64: KVM: system register handling Marc Zyngier
2013-03-05  3:47   ` Marc Zyngier
2013-03-07 10:30   ` [kvmarm] " Alexander Graf
2013-03-07 10:30     ` Alexander Graf
2013-03-08  3:29     ` Marc Zyngier
2013-03-08  3:29       ` Marc Zyngier
2013-03-25  8:19     ` Marc Zyngier
2013-03-25  8:19       ` Marc Zyngier
2013-04-23 23:07       ` Christoffer Dall
2013-04-23 23:07         ` Christoffer Dall
2013-03-05  3:47 ` [PATCH 10/29] arm64: KVM: Cortex-A57 specific system registers handling Marc Zyngier
2013-03-05  3:47   ` Marc Zyngier
2013-03-13 18:30   ` Christopher Covington
2013-03-13 18:30     ` Christopher Covington
2013-03-14 10:26     ` Marc Zyngier
2013-03-14 10:26       ` Marc Zyngier
2013-03-05  3:47 ` [PATCH 11/29] arm64: KVM: virtual CPU reset Marc Zyngier
2013-03-05  3:47   ` Marc Zyngier
2013-03-05  3:47 ` [PATCH 12/29] arm64: KVM: kvm_arch and kvm_vcpu_arch definitions Marc Zyngier
2013-03-05  3:47   ` Marc Zyngier
2013-03-12 17:30   ` Christopher Covington
2013-03-12 17:30     ` Christopher Covington
2013-03-05  3:47 ` [PATCH 13/29] arm64: KVM: MMIO access backend Marc Zyngier
2013-03-05  3:47   ` Marc Zyngier
2013-03-05  3:47 ` [PATCH 14/29] arm64: KVM: guest one-reg interface Marc Zyngier
2013-03-05  3:47   ` Marc Zyngier
2013-03-12 17:31   ` Christopher Covington
2013-03-12 17:31     ` Christopher Covington
2013-03-12 18:05     ` Marc Zyngier
2013-03-12 18:05       ` Marc Zyngier
2013-03-12 22:07       ` Christopher Covington
2013-03-12 22:07         ` Christopher Covington
2013-03-13  7:48         ` Marc Zyngier
2013-03-13  7:48           ` Marc Zyngier
2013-03-13 20:34           ` Christopher Covington
2013-03-13 20:34             ` Christopher Covington
2013-03-14  8:57             ` [kvmarm] " Peter Maydell
2013-03-14  8:57               ` Peter Maydell
2013-03-20 20:06               ` Christopher Covington
2013-03-20 20:06                 ` Christopher Covington
2013-03-05  3:47 ` [PATCH 15/29] arm64: KVM: hypervisor initialization code Marc Zyngier
2013-03-05  3:47   ` Marc Zyngier
2013-03-05  3:47 ` [PATCH 16/29] arm64: KVM: HYP mode world switch implementation Marc Zyngier
2013-03-05  3:47   ` Marc Zyngier
2013-03-13 19:59   ` Christopher Covington
2013-03-13 19:59     ` Christopher Covington
2013-03-20 20:04     ` Christopher Covington
2013-03-20 20:04       ` Christopher Covington
2013-03-21 11:54       ` Marc Zyngier
2013-03-21 11:54         ` Marc Zyngier
2013-03-05  3:47 ` [PATCH 17/29] arm64: KVM: Exit handling Marc Zyngier
2013-03-05  3:47   ` Marc Zyngier
2013-03-05  3:47 ` [PATCH 18/29] arm64: KVM: Plug the VGIC Marc Zyngier
2013-03-05  3:47   ` Marc Zyngier
2013-03-05  3:47 ` [PATCH 19/29] arm64: KVM: Plug the arch timer Marc Zyngier
2013-03-05  3:47   ` Marc Zyngier
2013-03-05  3:47 ` [PATCH 20/29] arm64: KVM: PSCI implementation Marc Zyngier
2013-03-05  3:47   ` Marc Zyngier
2013-03-05  3:47 ` [PATCH 21/29] arm64: KVM: Build system integration Marc Zyngier
2013-03-05  3:47   ` Marc Zyngier
2013-03-05  3:47 ` [PATCH 22/29] arm64: KVM: define 32bit specific registers Marc Zyngier
2013-03-05  3:47   ` Marc Zyngier
2013-03-18 17:03   ` Christopher Covington
2013-03-18 17:03     ` Christopher Covington
2013-03-05  3:47 ` [PATCH 23/29] arm64: KVM: 32bit GP register access Marc Zyngier
2013-03-05  3:47   ` Marc Zyngier
2013-03-16  0:24   ` Geoff Levand
2013-03-16  0:24     ` Geoff Levand
2013-03-05  3:47 ` [PATCH 24/29] arm64: KVM: 32bit conditional execution emulation Marc Zyngier
2013-03-05  3:47   ` Marc Zyngier
2013-03-18 17:04   ` Christopher Covington
2013-03-18 17:04     ` Christopher Covington
2013-03-05  3:47 ` [PATCH 25/29] arm64: KVM: 32bit handling of coprocessor traps Marc Zyngier
2013-03-05  3:47   ` Marc Zyngier
2013-03-05  3:47 ` [PATCH 26/29] arm64: KVM: 32bit coprocessor access for Cortex-A57 Marc Zyngier
2013-03-05  3:47   ` Marc Zyngier
2013-03-05  3:47 ` [PATCH 27/29] arm64: KVM: 32bit specific register world switch Marc Zyngier
2013-03-05  3:47   ` Marc Zyngier
2013-03-05  3:47 ` [PATCH 28/29] arm64: KVM: 32bit guest fault injection Marc Zyngier
2013-03-05  3:47   ` Marc Zyngier
2013-03-18 18:45   ` Christopher Covington
2013-03-18 18:45     ` Christopher Covington
2013-03-05  3:47 ` [PATCH 29/29] arm64: KVM: enable initialization of a 32bit vcpu Marc Zyngier
2013-03-05  3:47   ` Marc Zyngier
2013-03-18 18:56   ` Christopher Covington
2013-03-18 18:56     ` Christopher Covington

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=20130307080903.GA3819@redhat.com \
    --to=mst@redhat.com \
    --cc=catalin.marinas@arm.com \
    --cc=kvm@vger.kernel.org \
    --cc=kvmarm@lists.cs.columbia.edu \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=marc.zyngier@arm.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.