From: Avi Kivity <avi@redhat.com>
To: Sanjay Lal <sanjayl@kymasys.com>
Cc: kvm@vger.kernel.org, linux-mips@linux-mips.org
Subject: Re: [PATCH 02/20] KVM/MIPS32: Arch specific KVM data structures.
Date: Thu, 01 Nov 2012 17:04:39 +0200 [thread overview]
Message-ID: <50928F87.4060309@redhat.com> (raw)
In-Reply-To: <54507365-0EF7-480A-8A54-75E12B3677D9@kymasys.com>
On 10/31/2012 05:18 PM, Sanjay Lal wrote:
>
> Signed-off-by: Sanjay Lal <sanjayl@kymasys.com>
> ---
> arch/mips/include/asm/kvm.h | 58 ++++
> arch/mips/include/asm/kvm_host.h | 672 +++++++++++++++++++++++++++++++++++++++
> 2 files changed, 730 insertions(+)
> create mode 100644 arch/mips/include/asm/kvm.h
> create mode 100644 arch/mips/include/asm/kvm_host.h
>
> diff --git a/arch/mips/include/asm/kvm.h b/arch/mips/include/asm/kvm.h
> new file mode 100644
> index 0000000..39bb715
> --- /dev/null
> +++ b/arch/mips/include/asm/kvm.h
> @@ -0,0 +1,58 @@
> +/*
> +* This file is subject to the terms and conditions of the GNU General Public
> +* License. See the file "COPYING" in the main directory of this archive
> +* for more details.
> +*
> +*
> +* Copyright (C) 2012 MIPS Technologies, Inc. All rights reserved.
> +* Authors: Sanjay Lal <sanjayl@kymasys.com>
> +*/
> +
> +
> +#ifndef __LINUX_KVM_MIPS_H
> +#define __LINUX_KVM_MIPS_H
> +
> +#include <linux/types.h>
> +
> +#define __KVM_MIPS
> +
> +#define N_MIPS_COPROC_REGS 32
> +#define N_MIPS_COPROC_SEL 8
> +
> +/* for KVM_GET_REGS and KVM_SET_REGS */
> +struct kvm_regs {
> + __u32 gprs[32];
> + __u32 hi;
> + __u32 lo;
> + __u32 pc;
> +
> + ulong cp0reg[N_MIPS_COPROC_REGS][N_MIPS_COPROC_SEL];
> +};
ulong changes size in 64-bit archs, requiring compat translations when
issuing 32-bit syscalls on a 64-bit kernel. I don't know MIPS enough to
know whether that's a useful scenario.
> +
> +#define KVM_MAX_VCPUS 8
Set to 1 until smp is supported.
> +#define KVM_MEMORY_SLOTS 32
> +/* memory slots that does not exposed to userspace */
> +#define KVM_PRIVATE_MEM_SLOTS 4
Do you really need those?
> +
> +#define ENTER_CRITICAL(flags) local_irq_save(flags)
> +#define EXIT_CRITICAL(flags) local_irq_restore(flags)
Why wrap?
> +
> +
> +#define KVM_GUEST_KERNEL_ASID ((vcpu->arch.guest_kernel_asid[smp_processor_id()]) & ASID_MASK)
> +
> +#define KVM_GUEST_USER_ASID ((vcpu->arch.guest_user_asid[smp_processor_id()]) & ASID_MASK)
> +
> +
> +#define KVM_GUEST_WIRED_TLBS (current_cpu_data.tlbsize)
> +#define KVM_GUEST_COMMPAGE_TLB (vcpu->kvm->arch.commpage_tlb)
> +#define KVM_GUEST_TLBS KVM_GUEST_WIRED_TLBS
Don't use defines for variable expressions. Use inline functions for
those, or just open-code when it's more readable.
> +
> +/* Special address that contains the comm page, used for reducing # of traps */
> +#define KVM_GUEST_COMMPAGE_ADDR 0x0
> +
> +struct kvm_arch
> +{
> + /* Guest GVA->HPA page table */
> + ulong *guest_pmap;
> + ulong guest_pmap_npages;
> +
> + /* Wired host TLB used for the commpage */
> + int commpage_tlb;
> +
> + pfn_t (*gfn_to_pfn) (struct kvm *kvm, gfn_t gfn);
> + void (*release_pfn_clean) (pfn_t pfn);
> + bool (*is_error_pfn) (pfn_t pfn);
Why this indirection? Do those functions change at runtime?
> +
> + /* Stats for exit reasons */
> + ulong exit_reason_stats[MAX_KVM_MIPS_EXIT_TYPES];
> +};
Please use tracepoints for statistics instead of manual collection +
debugfs.
> +
> +struct kvm_mips_callbacks {
> + int (*handle_cop_unusable)(struct kvm_vcpu *vcpu);
> + int (*handle_tlb_mod)(struct kvm_vcpu *vcpu);
> + int (*handle_tlb_ld_miss)(struct kvm_vcpu *vcpu);
> + int (*handle_tlb_st_miss)(struct kvm_vcpu *vcpu);
> + int (*handle_addr_err_st)(struct kvm_vcpu *vcpu);
> + int (*handle_addr_err_ld)(struct kvm_vcpu *vcpu);
> + int (*handle_syscall)(struct kvm_vcpu *vcpu);
> + int (*handle_res_inst)(struct kvm_vcpu *vcpu);
> + int (*handle_break)(struct kvm_vcpu *vcpu);
> + gpa_t (*gva_to_gpa)(gva_t gva);
> + void (*queue_timer_int)(struct kvm_vcpu *vcpu);
> + void (*dequeue_timer_int)(struct kvm_vcpu *vcpu);
> + void (*queue_io_int)(struct kvm_vcpu *vcpu, struct kvm_mips_interrupt *irq);
> + void (*dequeue_io_int)(struct kvm_vcpu *vcpu, struct kvm_mips_interrupt *irq);
> + int (*irq_deliver)(struct kvm_vcpu *vcpu, unsigned int priority, uint32_t cause);
> + int (*irq_clear)(struct kvm_vcpu *vcpu, unsigned int priority, uint32_t cause);
> + int (*vcpu_ioctl_get_regs)(struct kvm_vcpu *vcpu, struct kvm_regs *regs);
> + int (*vcpu_ioctl_set_regs)(struct kvm_vcpu *vcpu, struct kvm_regs *regs);
> + int (*vcpu_init)(struct kvm_vcpu *vcpu);
> +};
We use callbacks on x86 because we have two separate implementations
(svm and vmx). Will that be the case on MIPS? If not, use direct calls.
--
error compiling committee.c: too many arguments to function
next prev parent reply other threads:[~2012-11-01 15:29 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-10-31 15:18 [PATCH 02/20] KVM/MIPS32: Arch specific KVM data structures Sanjay Lal
2012-11-01 15:04 ` Avi Kivity [this message]
2012-11-01 16:51 ` David Daney
2012-11-02 17:11 ` Sanjay Lal
2012-11-04 19:04 ` Avi Kivity
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=50928F87.4060309@redhat.com \
--to=avi@redhat.com \
--cc=kvm@vger.kernel.org \
--cc=linux-mips@linux-mips.org \
--cc=sanjayl@kymasys.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.