Dor Laor wrote:
...
+static __init struct kvm_paravirt_state *paravirt_alloc_state(void)
+{
+ struct kvm_paravirt_state *state;
+
+ state = (void *)get_zeroed_page(GFP_KERNEL);
+ if (!state)
+ goto err;
+
+ state->vmca = (void *)get_zeroed_page(GFP_KERNEL);
+ if (!state->vmca)
+ goto err;
+
+ /* FIXME: what do I need for this to be executable on 64 bit? */
+ state->hypercall = (void *)get_zeroed_page(GFP_KERNEL);
Why do you alloc a page for the hypercall instead of using Ingo's code
below? This way it can work for 64 bit too.
The current patch queue uses data in the text segment but it makes sure
that it has a proper page.
Regards,
Anthony Liguori
Ingo's code:
/*
* This is the vm-syscall address - to be patched by the host to
* VMCALL (Intel) or VMMCALL (AMD), depending on the CPU model:
*/
asm (
" .globl hypercall_addr \n"
" .align 4 \n"
" hypercall_addr: \n"
" movl $-38, %eax \n"
" ret \n"
);
extern unsigned char hypercall_addr[6];
And use it this way: (I used vmalloc_to_page since its compiles as a
module)
hypercall_addr_page = vmalloc_to_page(hypercall_addr);
para_state->hypercall_gpa = page_to_pfn(hypercall_addr_page) <<
PAGE_SHIFT |
offset_in_page(hypercall_addr);
Regards,
Dor.
_______________________________________________
Virtualization mailing list
Virtualization@xxxxxxxxxxxxxxxxxxxxxxxxxx
https://lists.linux-foundation.org/mailman/listinfo/virtualization