Jeremy Fitzhardinge wrote:
Zachary Amsden wrote:
Failing to patch because not enough space is available for a call or jump
or because the site clobbers do not allow the target clobbers to fit is
a fatal error; it means the kernel can not be properly virtualized.

No, that doesn't follow.  If the original site was:

patchable_start:
    push %eax
    push %ecx
    push %edx
    call *paravirt_ops + thingy
    pop
    pop
    pop
patchable_end:

then its perfectly OK to leave it as-is, even if the direct call's
destination clobbers are mismatched.  If the patcher wants to generate a
call to a C function in a context which can't deal with normal C calling
conventions, then it needs to also patch in appropriate save/restores.

The example is a bit misconstrued. In this case, the clobbers for the patchable region are CLBR_ALL - so there is no possibility of mismatch because of expanded clobber list. If the patchable region consisted of this, it would be bad:

   push %eax
   push %ecx
patchable_start:
   push %edx
   call *paravirt_ops + thingy
   pop
patchable_end: (note - site clobber EDX ok)
   pop
   pop


But, why would you do that?

Calls through paravirt_ops function pointers are C function calls.  Failing to 
provide a patchable region which can make a C function call is a BUG().

Zach

_______________________________________________
Virtualization mailing list
[email protected]
https://lists.linux-foundation.org/mailman/listinfo/virtualization

Reply via email to