lkml.org 
[lkml]   [2021]   [Jan]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 3/8] KVM: arm64: Add symbol at the beginning of each hyp section
    Date
    Generating hyp relocations will require referencing positions at a given
    offset from the beginning of hyp sections. Since the final layout will
    not be determined until the linking of `vmlinux`, modify the hyp linker
    script to insert a symbol at the first byte of each hyp section to use
    as an anchor. The linker of `vmlinux` will place the symbols together
    with the sections.

    Signed-off-by: David Brazdil <dbrazdil@google.com>
    ---
    arch/arm64/include/asm/hyp_image.h | 29 +++++++++++++++++++++++++++--
    arch/arm64/kvm/hyp/nvhe/hyp.lds.S | 4 ++--
    2 files changed, 29 insertions(+), 4 deletions(-)

    diff --git a/arch/arm64/include/asm/hyp_image.h b/arch/arm64/include/asm/hyp_image.h
    index daa1a1da539e..f97b774b58f4 100644
    --- a/arch/arm64/include/asm/hyp_image.h
    +++ b/arch/arm64/include/asm/hyp_image.h
    @@ -7,6 +7,9 @@
    #ifndef __ARM64_HYP_IMAGE_H__
    #define __ARM64_HYP_IMAGE_H__

    +#define HYP_CONCAT(a, b) __HYP_CONCAT(a, b)
    +#define __HYP_CONCAT(a, b) a ## b
    +
    /*
    * KVM nVHE code has its own symbol namespace prefixed with __kvm_nvhe_,
    * to separate it from the kernel proper.
    @@ -21,9 +24,31 @@
    */
    #define HYP_SECTION_NAME(NAME) .hyp##NAME

    +/* Symbol defined at the beginning of each hyp section. */
    +#define HYP_SECTION_SYMBOL_NAME(NAME) \
    + HYP_CONCAT(__hyp_section_, HYP_SECTION_NAME(NAME))
    +
    +/*
    + * Helper to generate linker script statements starting a hyp section.
    + *
    + * A symbol with a well-known name is defined at the first byte. This
    + * is used as a base for hyp relocations (see gen-hyprel.c). It must
    + * be defined inside the section so the linker of `vmlinux` cannot
    + * separate it from the section data.
    + */
    +#define BEGIN_HYP_SECTION(NAME) \
    + HYP_SECTION_NAME(NAME) : { \
    + HYP_SECTION_SYMBOL_NAME(NAME) = .;
    +
    +/* Helper to generate linker script statements ending a hyp section. */
    +#define END_HYP_SECTION \
    + }
    +
    /* Defines an ELF hyp section from input section @NAME and its subsections. */
    -#define HYP_SECTION(NAME) \
    - HYP_SECTION_NAME(NAME) : { *(NAME NAME##.*) }
    +#define HYP_SECTION(NAME) \
    + BEGIN_HYP_SECTION(NAME) \
    + *(NAME NAME##.*) \
    + END_HYP_SECTION

    /*
    * Defines a linker script alias of a kernel-proper symbol referenced by
    diff --git a/arch/arm64/kvm/hyp/nvhe/hyp.lds.S b/arch/arm64/kvm/hyp/nvhe/hyp.lds.S
    index cfdc59b4329b..cd119d82d8e3 100644
    --- a/arch/arm64/kvm/hyp/nvhe/hyp.lds.S
    +++ b/arch/arm64/kvm/hyp/nvhe/hyp.lds.S
    @@ -22,7 +22,7 @@ SECTIONS {
    * alignment for when linking into vmlinux.
    */
    . = ALIGN(PAGE_SIZE);
    - HYP_SECTION_NAME(.data..percpu) : {
    + BEGIN_HYP_SECTION(.data..percpu)
    PERCPU_INPUT(L1_CACHE_BYTES)
    - }
    + END_HYP_SECTION
    }
    --
    2.29.2.729.g45daf8777d-goog
    \
     
     \ /
      Last update: 2021-01-05 19:09    [W:4.040 / U:0.624 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site