lkml.org 
[lkml]   [2022]   [Mar]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v12 05/46] x86/boot: Introduce helpers for MSR reads/writes
    Date
    From: Michael Roth <michael.roth@amd.com>

    The current set of helpers used throughout the run-time kernel have
    dependencies on code/facilities outside of the boot kernel, so there
    are a number of call-sites throughout the boot kernel where inline
    assembly is used instead. More will be added with subsequent patches
    that add support for SEV-SNP, so take the opportunity to provide a basic
    set of helpers that can be used by the boot kernel to reduce reliance on
    inline assembly.

    Use boot_* prefix so that it's clear these are helpers specific to the
    boot kernel to avoid any confusion with the various other MSR read/write
    helpers.

    Suggested-by: Borislav Petkov <bp@alien8.de>
    Signed-off-by: Michael Roth <michael.roth@amd.com>
    ---
    arch/x86/boot/msr.h | 28 ++++++++++++++++++++++++++++
    arch/x86/include/asm/msr.h | 11 +----------
    arch/x86/include/asm/shared/msr.h | 15 +++++++++++++++
    3 files changed, 44 insertions(+), 10 deletions(-)
    create mode 100644 arch/x86/boot/msr.h
    create mode 100644 arch/x86/include/asm/shared/msr.h

    diff --git a/arch/x86/boot/msr.h b/arch/x86/boot/msr.h
    new file mode 100644
    index 000000000000..b6bb2161da27
    --- /dev/null
    +++ b/arch/x86/boot/msr.h
    @@ -0,0 +1,28 @@
    +/* SPDX-License-Identifier: GPL-2.0-only */
    +/*
    + * Helpers/definitions related to MSR access.
    + */
    +
    +#ifndef BOOT_MSR_H
    +#define BOOT_MSR_H
    +
    +#include <asm/shared/msr.h>
    +
    +/*
    + * The kernel proper already defines rdmsr()/wrmsr(), but they are not for the
    + * boot kernel since they rely tracepoint/exception handling infrastructure
    + * that's not available here, hence these boot_{rd,wr}msr helpers which serve
    + * the singular purpose of wrapping the RDMSR/WRMSR instructions to reduce the
    + * need for inline assembly calls throughout the boot kernel code.
    + */
    +static inline void boot_rdmsr(unsigned int msr, struct msr *m)
    +{
    + asm volatile("rdmsr" : "=a" (m->l), "=d" (m->h) : "c" (msr));
    +}
    +
    +static inline void boot_wrmsr(unsigned int msr, const struct msr *m)
    +{
    + asm volatile("wrmsr" : : "c" (msr), "a"(m->l), "d" (m->h) : "memory");
    +}
    +
    +#endif /* BOOT_MSR_H */
    diff --git a/arch/x86/include/asm/msr.h b/arch/x86/include/asm/msr.h
    index d42e6c6b47b1..65ec1965cd28 100644
    --- a/arch/x86/include/asm/msr.h
    +++ b/arch/x86/include/asm/msr.h
    @@ -10,16 +10,7 @@
    #include <asm/errno.h>
    #include <asm/cpumask.h>
    #include <uapi/asm/msr.h>
    -
    -struct msr {
    - union {
    - struct {
    - u32 l;
    - u32 h;
    - };
    - u64 q;
    - };
    -};
    +#include <asm/shared/msr.h>

    struct msr_info {
    u32 msr_no;
    diff --git a/arch/x86/include/asm/shared/msr.h b/arch/x86/include/asm/shared/msr.h
    new file mode 100644
    index 000000000000..1e6ec10b3a15
    --- /dev/null
    +++ b/arch/x86/include/asm/shared/msr.h
    @@ -0,0 +1,15 @@
    +/* SPDX-License-Identifier: GPL-2.0 */
    +#ifndef _ASM_X86_SHARED_MSR_H
    +#define _ASM_X86_SHARED_MSR_H
    +
    +struct msr {
    + union {
    + struct {
    + u32 l;
    + u32 h;
    + };
    + u64 q;
    + };
    +};
    +
    +#endif /* _ASM_X86_SHARED_MSR_H */
    --
    2.25.1
    \
     
     \ /
      Last update: 2022-03-07 22:35    [W:10.161 / U:0.036 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site