[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Minios-devel] [UNIKRAFT PATCH v3 2/7] plat/kvm: Align linker script with Xen platform ones
I would suggest that we proceed with the current version of the patch, and I and/or Sharan can express suggestions in a form of follow-up patches. Sometimes code speaks better :) Reviewed-by: Yuri Volchkov <yuri.volchkov@xxxxxxxxx> Simon Kuenzer <simon.kuenzer@xxxxxxxxx> writes: > On 01.06.2018 11:02, Sharan Santhanam wrote: >> Hello Simon, >> >> >> On 05/30/2018 04:04 PM, Simon Kuenzer wrote: >>> >>> >>> On 23.05.2018 13:53, Yuri Volchkov wrote: >>>> Sharan Santhanam <sharan.santhanam@xxxxxxxxx> writes: >>>> >>>>> Hello Simon, >>>>> >>>>> Please find the comments in line >>>>> >>>>> >>>>> On 05/22/2018 02:20 PM, Simon Kuenzer wrote: >>>>>> The linker scripts of Xen and KVM diverged too much. This patch >>>>>> is aligning KVMs with the ones from the Xen platform: >>>>>> >>>>>> - Unify symbols provided by linker script that mark start and end >>>>>> of sections >>>>>> - Remove currently unused and unsupported eh_frame section >>>>>> It may be added again when we officially introduce support >>>>>> together with the other platforms >>>>>> - Use tabs for identation >>>>>> - Keep multiboot header just once >>>>>> >>>>>> Signed-off-by: Simon Kuenzer<simon.kuenzer@xxxxxxxxx> >>>>>> --- >>>>>> plat/kvm/memory.c | 32 +++++++++++------ >>>>>> plat/kvm/x86/entry64.S | 2 +- >>>>>> plat/kvm/x86/link64.ld | 97 >>>>>> ++++++++++++++++++++++---------------------------- >>>>>> plat/kvm/x86/setup.c | 2 +- >>>>>> 4 files changed, 67 insertions(+), 66 deletions(-) >>>>>> >>>>>> diff --git a/plat/kvm/memory.c b/plat/kvm/memory.c >>>>>> index cfb15a6..705c6df 100644 >>>>>> --- a/plat/kvm/memory.c >>>>>> +++ b/plat/kvm/memory.c >>>>>> @@ -32,20 +32,21 @@ extern void *_libkvmplat_mem_end; >>>>>> int ukplat_memregion_count(void) >>>>>> { >>>>>> - return 5; >>>>>> + return 6; >>>>>> } >>>>>> int ukplat_memregion_get(int i, struct ukplat_memregion_desc *m) >>>>>> { >>>>>> - extern char _stext[], _etext[], _erodata[], _end[]; >>>>>> + extern char _text, _etext, _data, _edata, _rodata, _erodata, >>>>>> + __bss_start, _end; >>>>>> int ret; >>>>>> UK_ASSERT(m); >>>>>> switch (i) { >>>>>> case 0: /* text */ >>>>>> - m->base = &_stext; >>>>>> - m->len = (size_t) &_etext - (size_t) &_stext; >>>>>> + m->base = &_text; >>>>>> + m->len = (size_t) &_etext - (size_t) &_text; >>>>>> m->flags = (UKPLAT_MEMRF_RESERVED >>>>>> | UKPLAT_MEMRF_READABLE); >>>>>> #if UKPLAT_MEMRNAME >>>>>> @@ -54,8 +55,8 @@ int ukplat_memregion_get(int i, struct >>>>>> ukplat_memregion_desc *m) >>>>>> ret = 0; >>>>>> break; >>>>>> case 1: /* rodata */ >>>>>> - m->base = &_etext; >>>>>> - m->len = (size_t) &_erodata - (size_t) &_etext; >>>>>> + m->base = &_rodata; >>>>>> + m->len = (size_t) &_erodata - (size_t) &_rodata; >>>>>> m->flags = (UKPLAT_MEMRF_RESERVED >>>>>> | UKPLAT_MEMRF_READABLE); >>>>>> #if UKPLAT_MEMRNAME >>>>>> @@ -64,8 +65,8 @@ int ukplat_memregion_get(int i, struct >>>>>> ukplat_memregion_desc *m) >>>>>> ret = 0; >>>>>> break; >>>>>> case 2: /* data */ >>>>>> - m->base = &_erodata; >>>>>> - m->len = (size_t) &_end - (size_t) &_erodata; >>>>>> + m->base = &_data; >>>>>> + m->len = (size_t) &_edata - (size_t) &_data; >>>>>> m->flags = (UKPLAT_MEMRF_RESERVED >>>>>> | UKPLAT_MEMRF_READABLE >>>>>> | UKPLAT_MEMRF_WRITABLE); >>>>>> @@ -74,7 +75,18 @@ int ukplat_memregion_get(int i, struct >>>>>> ukplat_memregion_desc *m) >>>>>> #endif >>>>>> ret = 0; >>>>>> break; >>>>>> - case 3: /* heap */ >>>>>> + case 3: /* bss */ >>>>>> + m->base = &__bss_start; >>>>>> + m->len = (size_t) &_end - (size_t) &__bss_start; >>>>>> + m->flags = (UKPLAT_MEMRF_RESERVED >>>>>> + | UKPLAT_MEMRF_READABLE >>>>>> + | UKPLAT_MEMRF_WRITABLE); >>>>>> +#if UKPLAT_MEMRNAME >>>>>> + m->name = "bss"; >>>>>> +#endif >>>>>> + ret = 0; >>>>>> + break; >>>>>> + case 4: /* heap */ >>>>>> m->base = _libkvmplat_heap_start; >>>>>> m->len = (size_t) _libkvmplat_stack_top >>>>>> - (size_t) _libkvmplat_heap_start; >>>>>> @@ -84,7 +96,7 @@ int ukplat_memregion_get(int i, struct >>>>>> ukplat_memregion_desc *m) >>>>>> #endif >>>>>> ret = 0; >>>>>> break; >>>>>> - case 4: /* stack */ >>>>>> + case 5: /* stack */ >>>>>> m->base = _libkvmplat_stack_top; >>>>>> m->len = (size_t) _libkvmplat_mem_end >>>>>> - (size_t) _libkvmplat_stack_top; >>>>> Would it not be useful to use platform specific private data structure >>>>> to determine the number of section and the index of each section? In >>>>> the >>>>> current implementation we are using magic number. This suggested change >>>>> does not affect the purpose of this patch. As a result we can take in >>>>> this patch perform the modification in another patch set. >>>> >>>> I support this too. Also agree that this probably does not belong to >>>> this patch series. >>>> >>>> In my opinion a cool way to do this would be like: >>>> enum { >>>> MEMREG_TEXT = 0, >>>> MEMREG_DATA, >>>> MEMREG_BSS, >>>> /* . . . */ >>>> MEMREG_COUNT >>>> } >>>> >>>> Then, in the ukplat_entry(): >>>> for (i = 0; i < MEMREG_COUNT; ++i) { >>>> ukplat_memregion_get(i, &md); >>>> } >>>> >>>> >>> >>> Hum, yeah, we could define it within memory.c. This would be done by >>> each platform individually but we won't export the enum on the >>> platform API. >> >> I agree the platform enum should not be exported outside the library. >> >>> The reason is that we have a restriction coming from the platform >>> API/ABI and the current building procedure: Each library is built just >>> once but linked multiple times against different sets of platform >>> libraries. To keep this working, there should never be code part of a >>> non-platform library binary which actually belongs to a single or a >>> subset of platforms only. >>> This way, we save building time, and we keep libraries independent of >>> platforms. LTO should safe us for the cases where we normally would >>> have used `static inline` or macros on the platform API. >>> >>> >> * I do not see the difference between the current approach and the >> suggested approach in terms of the build time. There could be code >> duplication of memory region loading but I think we could also avoid >> with platform internal library of function, thereby sharing the plat >> object file across the different platform libraries. We may argue that >> is what the ukboot library is currently doing this but in my opinion >> putting it part of the platform library provides a better distinction >> between platform specific information and boot lib. > > What is the suggested approach? Sorry, I can't follow you. ;-) > >> >> * We could also abstract the information exposed to the boot library >> further and call it to initialize the "ukplat_memory_initialize" and let >> each platform decide on how to initialize it memory regions. As >> currently we exposing the number of memory regions also to the ukboot >> library. >> > > The task of the current interface is actually not the initialization of > a memory region (e.g., setting up page table entries). This is still > happening as part of the platform library, but the boot strapping needs > information where to find the address range for initializing the heap > management. > I see the following risk with your suggestion: We would need to make the > platform aware of a particular memory allocator implementation (like > ukalloc) so that such functions are called. However, we also want to > support completely customized cases or cases where the Unikernel builder > wants to implement something by its own for the heap, so I want to have > the platform as self-contained as much as possible. > Alternatively, the platform could define a callback-based API for > handing over memory to allocators. But honestly, I think this makes it > more complicated as the interface we have now: Having a way to query the > platform to get know where which region is available. > >>>>>> diff --git a/plat/kvm/x86/entry64.S b/plat/kvm/x86/entry64.S >>>>>> index 2d14386..47980ad 100644 >>>>>> --- a/plat/kvm/x86/entry64.S >>>>>> +++ b/plat/kvm/x86/entry64.S >>>>>> @@ -46,7 +46,7 @@ _multiboot_header: >>>>>> .long _multiboot_header >>>>>> .long 0x100000 >>>>>> .long _edata >>>>>> -.long _ebss >>>>>> +.long _end >>>>>> .long _libkvmplat_start32 >>>>>> .section .bss >>>>>> diff --git a/plat/kvm/x86/link64.ld b/plat/kvm/x86/link64.ld >>>>>> index 85ea058..a9f3ac3 100644 >>>>>> --- a/plat/kvm/x86/link64.ld >>>>>> +++ b/plat/kvm/x86/link64.ld >>>>>> @@ -6,7 +6,7 @@ >>>>>> * >>>>>> * Copyright (c) 2016, IBM >>>>>> * (c) 2016-2017 Docker, Inc. >>>>>> - * (c) 2017, NEC Europe Ltd. >>>>>> + * (c) 2017-2018, NEC Europe Ltd. >>>>>> * >>>>>> * Permission to use, copy, modify, and/or distribute this software >>>>>> * for any purpose with or without fee is hereby granted, provided >>>>>> @@ -24,63 +24,52 @@ >>>>>> */ >>>>>> ENTRY(_libkvmplat_entry) >>>>>> +SECTIONS >>>>>> +{ >>>>>> + . = 0x100000; >>>>>> -SECTIONS { >>>>>> - . = 0x100000; >>>>>> + /* Code */ >>>>>> + _text = .; >>>>>> + .text : >>>>>> + { >>>>>> + /* prevent linker gc from removing multiboot header */ >>>>>> + KEEP (*(.data.multiboot)) >>>>>> - /* Code */ >>>>>> - _stext = .; >>>>>> + *(.text) >>>>>> + *(.text.*) >>>>>> + } >>>>>> + _etext = .; >>>>>> - .text : >>>>>> - { >>>>>> - *(.data.multiboot) >>>>>> - /* prevent linker gc from removing multiboot header */ >>>>>> - KEEP(*(.data.multiboot)) >>>>>> - *(.text) >>>>>> - *(.text.*) >>>>>> - } >>>>>> + /* Read-only data */ >>>>>> + . = ALIGN(0x1000); >>>>>> + _rodata = .; >>>>>> + .rodata : >>>>>> + { >>>>>> + *(.rodata) >>>>>> + *(.rodata.*) >>>>>> + } >>>>>> + _erodata = .; >>>>>> - _etext = .; >>>>>> + /* Read-write data (initialized) */ >>>>>> + . = ALIGN(0x1000); >>>>>> + _data = .; >>>>>> + .data : >>>>>> + { >>>>>> + *(.data) >>>>>> + *(.data.*) >>>>>> + } >>>>>> + _edata = .; >>>>>> - . = ALIGN(0x1000); >>>>>> - /* Read-only data */ >>>>>> - .rodata : >>>>>> - { >>>>>> - *(.rodata) >>>>>> - *(.rodata.*) >>>>>> - } >>>>>> - .eh_frame : >>>>>> - { >>>>>> - *(.eh_frame) >>>>>> - } >>>>>> + /* Read-write data (uninitialized) */ >>>>>> + . = ALIGN(0x1000); >>>>>> + __bss_start = .; >>>>>> + .bss : >>>>>> + { >>>>>> + *(.bss) >>>>>> + *(.bss.*) >>>>>> + *(COMMON) >>>>>> + . = ALIGN(0x1000); >>>>>> + } >>>>>> - _erodata = .; >>>>>> - >>>>>> - . = ALIGN(0x1000); >>>>>> - /* Read-write data (initialized) */ >>>>>> - .got : >>>>>> - { >>>>>> - *(.got.plt) >>>>>> - *(.got) >>>>>> - } >>>>>> - .data : >>>>>> - { >>>>>> - *(.data) >>>>>> - *(.data.*) >>>>>> - } >>>>>> - >>>>>> - _edata = .; >>>>>> - >>>>>> - . = ALIGN(0x1000); >>>>>> - /* Read-write data (uninitialized) */ >>>>>> - .bss : >>>>>> - { >>>>>> - *(.bss) >>>>>> - *(.bss.*) >>>>>> - *(COMMON) >>>>>> - } >>>>>> - >>>>>> - . = ALIGN(0x1000); >>>>>> - _ebss = .; >>>>>> - _end = .; >>>>>> + _end = .; >>>>>> } >>>>>> diff --git a/plat/kvm/x86/setup.c b/plat/kvm/x86/setup.c >>>>>> index 6895f29..332d10e 100644 >>>>>> --- a/plat/kvm/x86/setup.c >>>>>> +++ b/plat/kvm/x86/setup.c >>>>>> @@ -78,7 +78,7 @@ static inline void _mb_get_cmdline(struct >>>>>> multiboot_info *mi, char *cmdline, >>>>>> static inline void _mb_init_mem(struct multiboot_info *mi) >>>>>> { >>>>>> - extern char _end[]; >>>>>> + extern char _end; >>>>>> multiboot_memory_map_t *m; >>>>>> size_t offset, max_addr; >>>>> Reviewed-by: Sharan Snathanam <sharan.santhanam@xxxxxxxxx> >>> >>> Thanks! >>> >>>>> >>>>> >>>>> Thanks & Regards >>>>> Sharan Santhanam >>>>> >>>>> _______________________________________________ >>>>> Minios-devel mailing list >>>>> Minios-devel@xxxxxxxxxxxxxxxxxxxx >>>>> https://lists.xenproject.org/mailman/listinfo/minios-devel >>>> >>> >> Thanks & Regards >> Sharan Santhanam -- Yuri Volchkov Software Specialist NEC Europe Ltd Kurfürsten-Anlage 36 D-69115 Heidelberg _______________________________________________ Minios-devel mailing list Minios-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/minios-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |