[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v3 09/10] xen: modify page table construction
From: |
Juergen Gross |
Subject: |
Re: [PATCH v3 09/10] xen: modify page table construction |
Date: |
Fri, 19 Feb 2016 06:20:58 +0100 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.6.0 |
On 18/02/16 17:40, Daniel Kiper wrote:
> On Wed, Feb 17, 2016 at 06:19:36PM +0100, Juergen Gross wrote:
>> Modify the page table construction to allow multiple virtual regions
>> to be mapped. This is done as preparation for removing the p2m list
>> from the initial kernel mapping in order to support huge pv domains.
>>
>> This allows a cleaner approach for mapping the relocator page by
>> using this capability.
>>
>> The interface to the assembler level of the relocator has to be changed
>> in order to be able to process multiple page table areas.
>>
>> Signed-off-by: Juergen Gross <address@hidden>
>> ---
>> V3: use constants instead of numbers as requested by Daniel Kiper
>> add lots of comments to assembly code as requested by Daniel Kiper
...
>> 1:
>> + movq 0(%r8), %r12 /* Get start pfn of the current area */
>> + movq GRUB_TARGET_SIZEOF_LONG(%r8), %rcx /* Get # of pg tables */
>
> Use %r9 here and...
>
>> + testq %rcx, %rcx /* 0 -> last area reached */
>> + jz 3f
>> +2:
>> movq %r12, %rdi
>> - movq %rsi, %rbx
>> - movq 0(%rsi), %rsi
>> - shlq $12, %rsi
>> - orq $5, %rsi
>> - movq $2, %rdx
>> - movq %rcx, %r9
>> + shlq $PAGE_SHIFT, %rdi /* virtual address (1:1 mapping) */
>> + movq (%rbx, %r12, 8), %rsi /* mfn */
>> + shlq $PAGE_SHIFT, %rsi
>> + orq $(GRUB_PAGE_PRESENT | GRUB_PAGE_USER), %rsi /* Build pte */
>> + movq $UVMF_INVLPG, %rdx
>> + movq %rcx, %r9 /* %rcx clobbered by hypercall */
>
> ... you can avoid this...
>
>> movq $__HYPERVISOR_update_va_mapping, %rax
>> syscall
>>
>> movq %r9, %rcx
>
> and this...
>
>> - addq $8, %rbx
>> - addq $4096, %r12
>> - movq %rbx, %rsi
>> + incq %r12 /* next pfn */
>>
>> - loop 1b
>> + loop 2b
>>
This would require to open code the loop statement here with %r9 as
count register.
...
>> diff --git a/grub-core/lib/xen/relocator.c b/grub-core/lib/xen/relocator.c
>> index 8f427d3..250fbd4 100644
>> --- a/grub-core/lib/xen/relocator.c
>> +++ b/grub-core/lib/xen/relocator.c
>> @@ -36,15 +36,18 @@ extern grub_uint8_t grub_relocator_xen_remap_end;
>> extern grub_xen_reg_t grub_relocator_xen_stack;
>> extern grub_xen_reg_t grub_relocator_xen_start_info;
>> extern grub_xen_reg_t grub_relocator_xen_entry_point;
>> -extern grub_xen_reg_t grub_relocator_xen_paging_start;
>> -extern grub_xen_reg_t grub_relocator_xen_paging_size;
>> extern grub_xen_reg_t grub_relocator_xen_remapper_virt;
>> extern grub_xen_reg_t grub_relocator_xen_remapper_virt2;
>> extern grub_xen_reg_t grub_relocator_xen_remapper_map;
>> extern grub_xen_reg_t grub_relocator_xen_mfn_list;
>> +extern struct {
>> + grub_xen_reg_t start;
>> + grub_xen_reg_t size;
>> +} grub_relocator_xen_paging_areas[XEN_MAX_MAPPINGS];
>
> Should not you add GRUB_PACKED here? Could you define type
> earlier and use it here?
Why packed? Aah, I think I should align the variable in the assembly
source instead.
Regarding type: sure I could.
Juergen
[PATCH v3 08/10] xen: add capability to load initrd outside of initial mapping, Juergen Gross, 2016/02/17
[PATCH v3 04/10] xen: synchronize xen header, Juergen Gross, 2016/02/17