• Sean Christopherson's avatar
    KVM: selftests: Implement memcmp(), memcpy(), and memset() for guest use · 6b6f7148
    Sean Christopherson authored
    Implement memcmp(), memcpy(), and memset() to override the compiler's
    built-in versions in order to guarantee that the compiler won't generate
    out-of-line calls to external functions via the PLT.  This allows the
    helpers to be safely used in guest code, as KVM selftests don't support
    dynamic loading of guest code.
    
    Steal the implementations from the kernel's generic versions, sans the
    optimizations in memcmp() for unaligned accesses.
    
    Put the utilities in a separate compilation unit and build with
    -ffreestanding to fudge around a gcc "feature" where it will optimize
    memset(), memcpy(), etc... by generating a recursive call.  I.e. the
    compiler optimizes itself into infinite recursion.  Alternatively, the
    individual functions could be tagged with
    optimize("no-tree-loop-distribute-patterns"), but using "optimize" for
    anything but debug is discouraged, and Linus NAK'd the use of the flag
    in the kernel proper[*].
    
    https://lore.kernel.org/lkml/CAHk-=wik-oXnUpfZ6Hw37uLykc-_P0Apyn2XuX-odh-3Nzop8w@mail.gmail.com
    
    Cc: Andrew Jones <andrew.jones@linux.dev>
    Cc: Anup Patel <anup@brainfault.org>
    Cc: Atish Patra <atishp@atishpatra.org>
    Cc: Christian Borntraeger <borntraeger@linux.ibm.com>
    Cc: Janosch Frank <frankja@linux.ibm.com>
    Cc: Claudio Imbrenda <imbrenda@linux.ibm.com>
    Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
    Message-Id: <20220928233652.783504-2-seanjc@google.com>
    Reviewed-by: default avatarAndrew Jones <andrew.jones@linux.dev>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    6b6f7148
string_override.c 806 Bytes