lkml.org 
[lkml]   [2021]   [Feb]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: [RFC PATCH v2 07/26] KVM: arm64: Introduce a BSS section for use at Hyp
    On Fri, Jan 08, 2021 at 12:15:05PM +0000, Quentin Perret wrote:
    > Currently, the hyp code cannot make full use of a bss, as the kernel
    > section is mapped read-only.
    >
    > While this mapping could simply be changed to read-write, it would
    > intermingle even more the hyp and kernel state than they currently are.
    > Instead, introduce a __hyp_bss section, that uses reserved pages, and
    > create the appropriate RW hyp mappings during KVM init.
    >
    > Signed-off-by: Quentin Perret <qperret@google.com>
    > ---
    > arch/arm64/include/asm/sections.h | 1 +
    > arch/arm64/kernel/vmlinux.lds.S | 7 +++++++
    > arch/arm64/kvm/arm.c | 11 +++++++++++
    > arch/arm64/kvm/hyp/nvhe/hyp.lds.S | 1 +
    > 4 files changed, 20 insertions(+)
    >
    > diff --git a/arch/arm64/include/asm/sections.h b/arch/arm64/include/asm/sections.h
    > index 8ff579361731..f58cf493de16 100644
    > --- a/arch/arm64/include/asm/sections.h
    > +++ b/arch/arm64/include/asm/sections.h
    > @@ -12,6 +12,7 @@ extern char __hibernate_exit_text_start[], __hibernate_exit_text_end[];
    > extern char __hyp_idmap_text_start[], __hyp_idmap_text_end[];
    > extern char __hyp_text_start[], __hyp_text_end[];
    > extern char __hyp_data_ro_after_init_start[], __hyp_data_ro_after_init_end[];
    > +extern char __hyp_bss_start[], __hyp_bss_end[];
    > extern char __idmap_text_start[], __idmap_text_end[];
    > extern char __initdata_begin[], __initdata_end[];
    > extern char __inittext_begin[], __inittext_end[];
    > diff --git a/arch/arm64/kernel/vmlinux.lds.S b/arch/arm64/kernel/vmlinux.lds.S
    > index 43af13968dfd..3eca35d5a7cf 100644
    > --- a/arch/arm64/kernel/vmlinux.lds.S
    > +++ b/arch/arm64/kernel/vmlinux.lds.S
    > @@ -8,6 +8,13 @@
    > #define RO_EXCEPTION_TABLE_ALIGN 8
    > #define RUNTIME_DISCARD_EXIT
    >
    > +#define BSS_FIRST_SECTIONS \
    > + . = ALIGN(PAGE_SIZE); \
    > + __hyp_bss_start = .; \
    > + *(.hyp.bss) \

    Use HYP_SECTION_NAME() here?

    > + . = ALIGN(PAGE_SIZE); \
    > + __hyp_bss_end = .;

    Should this be gated on CONFIG_KVM like the other hyp sections are? In fact,
    it might be nice to define all of those together. Yeah, it means moving
    things higher up in the file, but I think it will be easier to read.

    > #include <asm-generic/vmlinux.lds.h>
    > #include <asm/cache.h>
    > #include <asm/hyp_image.h>
    > diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c
    > index 3ac0f3425833..51b53ca36dc5 100644
    > --- a/arch/arm64/kvm/arm.c
    > +++ b/arch/arm64/kvm/arm.c
    > @@ -1770,7 +1770,18 @@ static int init_hyp_mode(void)
    > goto out_err;
    > }
    >
    > + /*
    > + * .hyp.bss is placed at the beginning of the .bss section, so map that
    > + * part RW, and the rest RO as the hyp shouldn't be touching it.
    > + */
    > err = create_hyp_mappings(kvm_ksym_ref(__bss_start),

    I think it would be clearer to refer to __hyp_bss_start here ^^.
    You could always add an ASSERT in the linker script if you want to catch
    anybody adding something before the hyp bss in future.

    Will

    \
     
     \ /
      Last update: 2021-02-01 19:41    [W:3.304 / U:0.368 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site