[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
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); } >> 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 & Regards > Sharan Santhanam > > _______________________________________________ > Minios-devel mailing list > Minios-devel@xxxxxxxxxxxxxxxxxxxx > https://lists.xenproject.org/mailman/listinfo/minios-devel -- 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 |