• Jeremy Fitzhardinge's avatar
    [PATCH] i386: PARAVIRT: add common patching machinery · 63f70270
    Jeremy Fitzhardinge authored
    Implement the actual patching machinery.  paravirt_patch_default()
    contains the logic to automatically patch a callsite based on a few
    simple rules:
    
     - if the paravirt_op function is paravirt_nop, then patch nops
     - if the paravirt_op function is a jmp target, then jmp to it
     - if the paravirt_op function is callable and doesn't clobber too much
        for the callsite, call it directly
    
    paravirt_patch_default is suitable as a default implementation of
    paravirt_ops.patch, will remove most of the expensive indirect calls
    in favour of either a direct call or a pile of nops.
    
    Backends may implement their own patcher, however.  There are several
    helper functions to help with this:
    
    paravirt_patch_nop	nop out a callsite
    paravirt_patch_ignore	leave the callsite as-is
    paravirt_patch_call	patch a call if the caller and callee
    			have compatible clobbers
    paravirt_patch_jmp	patch in a jmp
    paravirt_patch_insns	patch some literal instructions over
    			the callsite, if they fit
    
    This patch also implements more direct patches for the native case, so
    that when running on native hardware many common operations are
    implemented inline.
    Signed-off-by: default avatarJeremy Fitzhardinge <jeremy@xensource.com>
    Signed-off-by: default avatarAndi Kleen <ak@suse.de>
    Cc: Rusty Russell <rusty@rustcorp.com.au>
    Cc: Zachary Amsden <zach@vmware.com>
    Cc: Anthony Liguori <anthony@codemonkey.ws>
    Acked-by: default avatarIngo Molnar <mingo@elte.hu>
    63f70270
alternative.c 9.22 KB