]> git.baikalelectronics.ru Git - kernel.git/commit
[PATCH] i386: PARAVIRT: add common patching machinery
authorJeremy Fitzhardinge <jeremy@goop.org>
Wed, 2 May 2007 17:27:14 +0000 (19:27 +0200)
committerAndi Kleen <andi@basil.nowhere.org>
Wed, 2 May 2007 17:27:14 +0000 (19:27 +0200)
commite2b12a451431d8f252b9f4e792fbaef58e1197e7
tree7ffe766f25007845c99cfc337365c3006a153b83
parentc7c5ea8463662515b67f9611939bfad51d6a19b4
[PATCH] i386: PARAVIRT: add common patching machinery

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: Jeremy Fitzhardinge <jeremy@xensource.com>
Signed-off-by: Andi 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: Ingo Molnar <mingo@elte.hu>
arch/i386/kernel/alternative.c
arch/i386/kernel/paravirt.c
include/asm-i386/paravirt.h