From: cyril@ti.com (Cyril Chemparathy)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v4 05/14] KVM: ARM: Hypervisor inititalization
Date: Mon, 19 Nov 2012 10:27:05 -0500 [thread overview]
Message-ID: <50AA4FC9.8080208@ti.com> (raw)
In-Reply-To: <20121119145100.GX3205@mudshark.cambridge.arm.com>
On 11/19/2012 09:51 AM, Will Deacon wrote:
>
> Typo in subject, use one of initiali[sz]ation instead.
>
> On Sat, Nov 10, 2012 at 03:42:45PM +0000, Christoffer Dall wrote:
>> Sets up KVM code to handle all exceptions taken to Hyp mode.
>>
>> When the kernel is booted in Hyp mode, calling "hvc #0xff" with r0 pointing to
>> the new vectors, the HVBAR is changed to the the vector pointers. This allows
>> subsystems (like KVM here) to execute code in Hyp-mode with the MMU disabled.
>>
>> We initialize other Hyp-mode registers and enables the MMU for Hyp-mode from
>> the id-mapped hyp initialization code. Afterwards, the HVBAR is changed to
>> point to KVM Hyp vectors used to catch guest faults and to switch to Hyp mode
>> to perform a world-switch into a KVM guest.
>>
>> If the KVM module is unloaded we call "hvc #0xff" once more to disable the MMU
>> in Hyp mode again and install a vector handler to change the HVBAR for a
>> subsequent reload of KVM or another hypervisor.
>
> 0xff might be a bit too simple. I notice Xen use 0xEA1, which is
> probably less likely to conflict with anything else. We should probably
> also put these numbers in the same header file so that any conflicts
> become immediately apparent.
>
>>
>> Also provides memory mapping code to map required code pages, data structures,
>> and I/O regions accessed in Hyp mode at the same virtual address as the host
>> kernel virtual addresses, but which conforms to the architectural requirements
>> for translations in Hyp mode. This interface is added in arch/arm/kvm/arm_mmu.c
>> and comprises:
>> - create_hyp_mappings(from, to);
>> - create_hyp_io_mappings(from, to, phys_addr);
>> - free_hyp_pmds();
>>
>> Reviewed-by: Marcelo Tosatti <mtosatti@redhat.com>
>> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
>> Signed-off-by: Christoffer Dall <c.dall@virtualopensystems.com>
>
[...]
>> +static int init_hyp_mode(void)
>> +{
>> + phys_addr_t init_phys_addr;
>> + int cpu;
>> + int err = 0;
>> +
>> + /*
>> + * Allocate Hyp PGD and setup Hyp identity mapping
>> + */
>> + err = kvm_mmu_init();
>> + if (err)
>> + return err;
>> +
>> + /*
>> + * It is probably enough to obtain the default on one
>> + * CPU. It's unlikely to be different on the others.
>> + */
>> + hyp_default_vectors = __hyp_get_vectors();
>> +
>> + /*
>> + * Allocate stack pages for Hypervisor-mode
>> + */
>> + for_each_possible_cpu(cpu) {
>> + unsigned long stack_page;
>> +
>> + stack_page = __get_free_page(GFP_KERNEL);
>> + if (!stack_page) {
>> + err = -ENOMEM;
>> + goto out_free_stack_pages;
>> + }
>> +
>> + per_cpu(kvm_arm_hyp_stack_page, cpu) = stack_page;
>> + }
>> +
>> + /*
>> + * Execute the init code on each CPU.
>> + *
>> + * Note: The stack is not mapped yet, so don't do anything else than
>> + * initializing the hypervisor mode on each CPU using a local stack
>> + * space for temporary storage.
>> + */
>> + init_phys_addr = virt_to_phys(__kvm_hyp_init);
>> + for_each_online_cpu(cpu) {
>> + smp_call_function_single(cpu, cpu_init_hyp_mode,
>> + (void *)(long)init_phys_addr, 1);
>> + }
>
> Hmm, this will probably go wrong for platforms like keystone, where
> everything is above 4GB in physical memory. Actually, I'm not sure on
> the status of the patches so you could check with Cyril [CC'd].
>
Thanks for the heads up.
Looks like __kvm_hyp_init is idmap'ed. This should be ok on keystone,
but we'll need to replace the virt_to_phys() with a virt_to_idmap() when
we get to this.
Thanks
-- Cyril.
WARNING: multiple messages have this Message-ID (diff)
From: Cyril Chemparathy <cyril@ti.com>
To: Will Deacon <will.deacon@arm.com>
Cc: Christoffer Dall <c.dall@virtualopensystems.com>,
"kvm@vger.kernel.org" <kvm@vger.kernel.org>,
"linux-arm-kernel@lists.infradead.org"
<linux-arm-kernel@lists.infradead.org>,
"kvmarm@lists.cs.columbia.edu" <kvmarm@lists.cs.columbia.edu>,
Marc Zyngier <Marc.Zyngier@arm.com>,
Marcelo Tosatti <mtosatti@redhat.com>
Subject: Re: [PATCH v4 05/14] KVM: ARM: Hypervisor inititalization
Date: Mon, 19 Nov 2012 10:27:05 -0500 [thread overview]
Message-ID: <50AA4FC9.8080208@ti.com> (raw)
In-Reply-To: <20121119145100.GX3205@mudshark.cambridge.arm.com>
On 11/19/2012 09:51 AM, Will Deacon wrote:
>
> Typo in subject, use one of initiali[sz]ation instead.
>
> On Sat, Nov 10, 2012 at 03:42:45PM +0000, Christoffer Dall wrote:
>> Sets up KVM code to handle all exceptions taken to Hyp mode.
>>
>> When the kernel is booted in Hyp mode, calling "hvc #0xff" with r0 pointing to
>> the new vectors, the HVBAR is changed to the the vector pointers. This allows
>> subsystems (like KVM here) to execute code in Hyp-mode with the MMU disabled.
>>
>> We initialize other Hyp-mode registers and enables the MMU for Hyp-mode from
>> the id-mapped hyp initialization code. Afterwards, the HVBAR is changed to
>> point to KVM Hyp vectors used to catch guest faults and to switch to Hyp mode
>> to perform a world-switch into a KVM guest.
>>
>> If the KVM module is unloaded we call "hvc #0xff" once more to disable the MMU
>> in Hyp mode again and install a vector handler to change the HVBAR for a
>> subsequent reload of KVM or another hypervisor.
>
> 0xff might be a bit too simple. I notice Xen use 0xEA1, which is
> probably less likely to conflict with anything else. We should probably
> also put these numbers in the same header file so that any conflicts
> become immediately apparent.
>
>>
>> Also provides memory mapping code to map required code pages, data structures,
>> and I/O regions accessed in Hyp mode at the same virtual address as the host
>> kernel virtual addresses, but which conforms to the architectural requirements
>> for translations in Hyp mode. This interface is added in arch/arm/kvm/arm_mmu.c
>> and comprises:
>> - create_hyp_mappings(from, to);
>> - create_hyp_io_mappings(from, to, phys_addr);
>> - free_hyp_pmds();
>>
>> Reviewed-by: Marcelo Tosatti <mtosatti@redhat.com>
>> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
>> Signed-off-by: Christoffer Dall <c.dall@virtualopensystems.com>
>
[...]
>> +static int init_hyp_mode(void)
>> +{
>> + phys_addr_t init_phys_addr;
>> + int cpu;
>> + int err = 0;
>> +
>> + /*
>> + * Allocate Hyp PGD and setup Hyp identity mapping
>> + */
>> + err = kvm_mmu_init();
>> + if (err)
>> + return err;
>> +
>> + /*
>> + * It is probably enough to obtain the default on one
>> + * CPU. It's unlikely to be different on the others.
>> + */
>> + hyp_default_vectors = __hyp_get_vectors();
>> +
>> + /*
>> + * Allocate stack pages for Hypervisor-mode
>> + */
>> + for_each_possible_cpu(cpu) {
>> + unsigned long stack_page;
>> +
>> + stack_page = __get_free_page(GFP_KERNEL);
>> + if (!stack_page) {
>> + err = -ENOMEM;
>> + goto out_free_stack_pages;
>> + }
>> +
>> + per_cpu(kvm_arm_hyp_stack_page, cpu) = stack_page;
>> + }
>> +
>> + /*
>> + * Execute the init code on each CPU.
>> + *
>> + * Note: The stack is not mapped yet, so don't do anything else than
>> + * initializing the hypervisor mode on each CPU using a local stack
>> + * space for temporary storage.
>> + */
>> + init_phys_addr = virt_to_phys(__kvm_hyp_init);
>> + for_each_online_cpu(cpu) {
>> + smp_call_function_single(cpu, cpu_init_hyp_mode,
>> + (void *)(long)init_phys_addr, 1);
>> + }
>
> Hmm, this will probably go wrong for platforms like keystone, where
> everything is above 4GB in physical memory. Actually, I'm not sure on
> the status of the patches so you could check with Cyril [CC'd].
>
Thanks for the heads up.
Looks like __kvm_hyp_init is idmap'ed. This should be ok on keystone,
but we'll need to replace the virt_to_phys() with a virt_to_idmap() when
we get to this.
Thanks
-- Cyril.
next prev parent reply other threads:[~2012-11-19 15:27 UTC|newest]
Thread overview: 130+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-11-10 15:42 [PATCH v4 00/14] KVM/ARM Implementation Christoffer Dall
2012-11-10 15:42 ` Christoffer Dall
2012-11-10 15:42 ` [PATCH v4 01/14] ARM: Add page table and page defines needed by KVM Christoffer Dall
2012-11-10 15:42 ` Christoffer Dall
2012-11-19 14:14 ` Will Deacon
2012-11-19 14:14 ` Will Deacon
2012-11-29 15:57 ` Christoffer Dall
2012-11-29 15:57 ` Christoffer Dall
2012-11-30 11:46 ` Will Deacon
2012-11-30 11:46 ` Will Deacon
2012-11-30 15:54 ` Christoffer Dall
2012-11-30 15:54 ` Christoffer Dall
2012-11-10 15:42 ` [PATCH v4 02/14] ARM: Section based HYP idmap Christoffer Dall
2012-11-10 15:42 ` Christoffer Dall
2012-11-19 14:16 ` Will Deacon
2012-11-19 14:16 ` Will Deacon
2012-11-29 18:59 ` Christoffer Dall
2012-11-29 18:59 ` Christoffer Dall
2012-11-30 10:58 ` Will Deacon
2012-11-30 10:58 ` Will Deacon
2012-11-30 16:29 ` Christoffer Dall
2012-11-30 16:29 ` Christoffer Dall
2012-11-19 14:25 ` Rob Herring
2012-11-19 14:25 ` Rob Herring
2012-11-10 15:42 ` [PATCH v4 03/14] ARM: Factor out cpuid implementor and part number Christoffer Dall
2012-11-10 15:42 ` Christoffer Dall
2012-11-19 14:21 ` Will Deacon
2012-11-19 14:21 ` Will Deacon
2012-11-29 21:38 ` Christoffer Dall
2012-11-29 21:38 ` Christoffer Dall
2012-11-30 10:21 ` Will Deacon
2012-11-30 10:21 ` Will Deacon
2012-11-30 15:42 ` Christoffer Dall
2012-11-30 15:42 ` Christoffer Dall
2012-11-10 15:42 ` [PATCH v4 04/14] KVM: ARM: Initial skeleton to compile KVM support Christoffer Dall
2012-11-10 15:42 ` Christoffer Dall
2012-11-19 14:41 ` Will Deacon
2012-11-19 14:41 ` Will Deacon
2012-11-29 22:36 ` Christoffer Dall
2012-11-29 22:36 ` Christoffer Dall
2012-11-10 15:42 ` [PATCH v4 05/14] KVM: ARM: Hypervisor inititalization Christoffer Dall
2012-11-10 15:42 ` Christoffer Dall
2012-11-19 14:51 ` Will Deacon
2012-11-19 14:51 ` Will Deacon
2012-11-19 15:27 ` Cyril Chemparathy [this message]
2012-11-19 15:27 ` Cyril Chemparathy
2012-11-30 5:41 ` Christoffer Dall
2012-11-30 5:41 ` Christoffer Dall
2012-11-10 15:42 ` [PATCH v4 06/14] KVM: ARM: Memory virtualization setup Christoffer Dall
2012-11-10 15:42 ` Christoffer Dall
2012-11-19 14:53 ` Will Deacon
2012-11-19 14:53 ` Will Deacon
2012-11-19 15:05 ` Christoffer Dall
2012-11-19 15:05 ` Christoffer Dall
2012-11-10 15:42 ` [PATCH v4 07/14] KVM: ARM: Inject IRQs and FIQs from userspace Christoffer Dall
2012-11-10 15:42 ` Christoffer Dall
2012-11-19 14:55 ` Will Deacon
2012-11-19 14:55 ` Will Deacon
2012-11-19 15:04 ` Christoffer Dall
2012-11-19 15:04 ` Christoffer Dall
2012-11-19 15:26 ` Will Deacon
2012-11-19 15:26 ` Will Deacon
2012-11-19 16:09 ` Christoffer Dall
2012-11-19 16:09 ` Christoffer Dall
2012-11-19 16:21 ` Will Deacon
2012-11-19 16:21 ` Will Deacon
2012-11-30 6:13 ` Christoffer Dall
2012-11-30 6:13 ` Christoffer Dall
2012-11-10 15:43 ` [PATCH v4 08/14] KVM: ARM: World-switch implementation Christoffer Dall
2012-11-10 15:43 ` Christoffer Dall
2012-11-19 14:57 ` Will Deacon
2012-11-19 14:57 ` Will Deacon
2012-11-30 6:37 ` Christoffer Dall
2012-11-30 6:37 ` Christoffer Dall
2012-11-30 15:15 ` Will Deacon
2012-11-30 15:15 ` Will Deacon
2012-11-30 16:47 ` Christoffer Dall
2012-11-30 16:47 ` Christoffer Dall
2012-11-30 17:14 ` Will Deacon
2012-11-30 17:14 ` Will Deacon
2012-11-30 18:49 ` Christoffer Dall
2012-11-30 18:49 ` Christoffer Dall
2012-12-03 10:33 ` Marc Zyngier
2012-12-03 10:33 ` Marc Zyngier
2012-12-03 15:05 ` Christoffer Dall
2012-12-03 15:05 ` Christoffer Dall
2012-11-10 15:43 ` [PATCH v4 09/14] KVM: ARM: Emulation framework and CP15 emulation Christoffer Dall
2012-11-10 15:43 ` Christoffer Dall
2012-11-19 15:01 ` Will Deacon
2012-11-19 15:01 ` Will Deacon
2012-11-19 15:27 ` [kvmarm] " Peter Maydell
2012-11-19 15:27 ` Peter Maydell
2012-11-20 2:18 ` Rusty Russell
2012-11-20 2:18 ` Rusty Russell
2012-11-30 20:22 ` Christoffer Dall
2012-11-30 20:22 ` Christoffer Dall
2012-12-03 11:05 ` Will Deacon
2012-12-03 11:05 ` Will Deacon
2012-12-03 19:09 ` Christoffer Dall
2012-12-03 19:09 ` Christoffer Dall
2012-11-10 15:43 ` [PATCH v4 10/14] KVM: ARM: User space API for getting/setting co-proc registers Christoffer Dall
2012-11-10 15:43 ` Christoffer Dall
2012-11-19 15:02 ` Will Deacon
2012-11-19 15:02 ` Will Deacon
2012-11-30 6:42 ` Christoffer Dall
2012-11-30 6:42 ` Christoffer Dall
2012-11-10 15:43 ` [PATCH v4 11/14] KVM: ARM: Demux CCSIDR in the userspace API Christoffer Dall
2012-11-10 15:43 ` Christoffer Dall
2012-11-19 15:03 ` Will Deacon
2012-11-19 15:03 ` Will Deacon
2012-11-30 6:45 ` Christoffer Dall
2012-11-30 6:45 ` Christoffer Dall
2012-11-10 15:43 ` [PATCH v4 12/14] KVM: ARM: VFP userspace interface Christoffer Dall
2012-11-10 15:43 ` Christoffer Dall
2012-11-10 15:43 ` [PATCH v4 13/14] KVM: ARM: Handle guest faults in KVM Christoffer Dall
2012-11-10 15:43 ` Christoffer Dall
2012-11-19 15:07 ` Will Deacon
2012-11-19 15:07 ` Will Deacon
2012-11-30 21:40 ` Christoffer Dall
2012-11-30 21:40 ` Christoffer Dall
2012-12-03 13:06 ` Will Deacon
2012-12-03 13:06 ` Will Deacon
2012-12-03 15:02 ` Christoffer Dall
2012-12-03 15:02 ` Christoffer Dall
2012-11-10 15:43 ` [PATCH v4 14/14] KVM: ARM: Handle I/O aborts Christoffer Dall
2012-11-10 15:43 ` Christoffer Dall
2012-11-19 15:09 ` Will Deacon
2012-11-19 15:09 ` Will Deacon
2012-11-30 14:46 ` Dave Martin
2012-11-30 14:46 ` Dave Martin
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=50AA4FC9.8080208@ti.com \
--to=cyril@ti.com \
--cc=linux-arm-kernel@lists.infradead.org \
/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.