Jun Koi wrote:
On 6/26/07, Dor Laor <dor.laor@xxxxxxxxxxxx> 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.
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"
);
The assembly code "movl $-38, %eax; \nret" is only a "reserved place",
which is later overwritten by hypercall address from the host, isnt
it?
If so, why dont we simply put 4 NOPs there?
So if the hypervisor fails to patch it, we get a proper errno instead of
running off into random code.
Regards,
Anthony Liguori
Thanks,
Jun
_______________________________________________
Virtualization mailing list
Virtualization@xxxxxxxxxxxxxxxxxxxxxxxxxx
https://lists.linux-foundation.org/mailman/listinfo/virtualization