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.
next prev parent reply other threads:[~2012-11-19 15:27 UTC|newest]
Thread overview: 65+ 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 ` [PATCH v4 01/14] ARM: Add page table and page defines needed by KVM Christoffer Dall
2012-11-19 14:14 ` Will Deacon
2012-11-29 15:57 ` Christoffer Dall
2012-11-30 11:46 ` Will Deacon
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-19 14:16 ` Will Deacon
2012-11-29 18:59 ` Christoffer Dall
2012-11-30 10:58 ` Will Deacon
2012-11-30 16:29 ` Christoffer Dall
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-19 14:21 ` Will Deacon
2012-11-29 21:38 ` Christoffer Dall
2012-11-30 10:21 ` Will Deacon
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-19 14:41 ` Will Deacon
2012-11-29 22:36 ` Christoffer Dall
2012-11-10 15:42 ` [PATCH v4 05/14] KVM: ARM: Hypervisor inititalization Christoffer Dall
2012-11-19 14:51 ` Will Deacon
2012-11-19 15:27 ` Cyril Chemparathy [this message]
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-19 14:53 ` Will Deacon
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-19 14:55 ` Will Deacon
2012-11-19 15:04 ` Christoffer Dall
2012-11-19 15:26 ` Will Deacon
2012-11-19 16:09 ` Christoffer Dall
2012-11-19 16:21 ` Will Deacon
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-19 14:57 ` Will Deacon
2012-11-30 6:37 ` Christoffer Dall
2012-11-30 15:15 ` Will Deacon
2012-11-30 16:47 ` Christoffer Dall
2012-11-30 17:14 ` Will Deacon
2012-11-30 18:49 ` Christoffer Dall
2012-12-03 10:33 ` Marc Zyngier
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-19 15:01 ` Will Deacon
2012-11-19 15:27 ` [kvmarm] " Peter Maydell
2012-11-20 2:18 ` Rusty Russell
2012-11-30 20:22 ` Christoffer Dall
2012-12-03 11:05 ` Will Deacon
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-19 15:02 ` Will Deacon
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-19 15:03 ` Will Deacon
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 ` [PATCH v4 13/14] KVM: ARM: Handle guest faults in KVM Christoffer Dall
2012-11-19 15:07 ` Will Deacon
2012-11-30 21:40 ` Christoffer Dall
2012-12-03 13:06 ` Will Deacon
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-19 15:09 ` Will Deacon
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$(echo .)com \
--cc=linux-arm-kernel@lists$(echo .)infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox