Skip to content
  • Uros Bizjak's avatar
    KVM: SVM: Split svm_vcpu_run inline assembly to separate file · 199cd1d7
    Uros Bizjak authored
    
    
    The compiler (GCC) does not like the situation, where there is inline
    assembly block that clobbers all available machine registers in the
    middle of the function. This situation can be found in function
    svm_vcpu_run in file kvm/svm.c and results in many register spills and
    fills to/from stack frame.
    
    This patch fixes the issue with the same approach as was done for
    VMX some time ago. The big inline assembly is moved to a separate
    assembly .S file, taking into account all ABI requirements.
    
    There are two main benefits of the above approach:
    
    * elimination of several register spills and fills to/from stack
    frame, and consequently smaller function .text size. The binary size
    of svm_vcpu_run is lowered from 2019 to 1626 bytes.
    
    * more efficient access to a register save array. Currently, register
    save array is accessed as:
    
        7b00:    48 8b 98 28 02 00 00     mov    0x228(%rax),%rbx
        7b07:    48 8b 88 18 02 00 00     mov    0x218(%rax),%rcx
        7b0e:    48 8b 90 20 02 00 00     mov    0x220(%rax),%rdx
    
    and passing ia pointer to a register array as an argument to a function one gets:
    
      12:    48 8b 48 08              mov    0x8(%rax),%rcx
      16:    48 8b 50 10              mov    0x10(%rax),%rdx
      1a:    48 8b 58 18              mov    0x18(%rax),%rbx
    
    As a result, the total size, considering that the new function size is 229
    bytes, gets lowered by 164 bytes.
    
    Signed-off-by: default avatarUros Bizjak <ubizjak@gmail.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    199cd1d7