|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Minios-devel] [UNIKRAFT PATCH v3 3/7] plat/kvm: Add preinit_array and init_array sections (x86)
Reviewed-by: Yuri Volchkov <yuri.volchkov@xxxxxxxxx>
Simon Kuenzer <simon.kuenzer@xxxxxxxxx> writes:
> Adds preinit_array and init_array sections with the linker script.
> Those sections are populated by the compiler/linker with function
> pointer arrays. Such functions are typically part of initializing
> the language runtime (e.g., C++) and have to be called early during
> bootstrapping. However, they can also be used by Unikraft libraries
> for early initializations (functions with constructor attribute).
>
> Signed-off-by: Simon Kuenzer <simon.kuenzer@xxxxxxxxx>
> ---
> plat/kvm/memory.c | 22 ++++++++++++++++------
> plat/kvm/x86/link64.ld | 18 ++++++++++++++++++
> 2 files changed, 34 insertions(+), 6 deletions(-)
>
> diff --git a/plat/kvm/memory.c b/plat/kvm/memory.c
> index 705c6df..d2fd235 100644
> --- a/plat/kvm/memory.c
> +++ b/plat/kvm/memory.c
> @@ -32,13 +32,13 @@ extern void *_libkvmplat_mem_end;
>
> int ukplat_memregion_count(void)
> {
> - return 6;
> + return 7;
> }
>
> int ukplat_memregion_get(int i, struct ukplat_memregion_desc *m)
> {
> extern char _text, _etext, _data, _edata, _rodata, _erodata,
> - __bss_start, _end;
> + _ctors, _ectors, __bss_start, _end;
> int ret;
>
> UK_ASSERT(m);
> @@ -64,7 +64,17 @@ int ukplat_memregion_get(int i, struct
> ukplat_memregion_desc *m)
> #endif
> ret = 0;
> break;
> - case 2: /* data */
> + case 2: /* ctors */
> + m->base = &_ctors;
> + m->len = (size_t) &_ectors - (size_t) &_ctors;
> + m->flags = (UKPLAT_MEMRF_RESERVED
> + | UKPLAT_MEMRF_READABLE);
> +#if UKPLAT_MEMRNAME
> + m->name = "ctors";
> +#endif
> + ret = 0;
> + break;
> + case 3: /* data */
> m->base = &_data;
> m->len = (size_t) &_edata - (size_t) &_data;
> m->flags = (UKPLAT_MEMRF_RESERVED
> @@ -75,7 +85,7 @@ int ukplat_memregion_get(int i, struct
> ukplat_memregion_desc *m)
> #endif
> ret = 0;
> break;
> - case 3: /* bss */
> + case 4: /* bss */
> m->base = &__bss_start;
> m->len = (size_t) &_end - (size_t) &__bss_start;
> m->flags = (UKPLAT_MEMRF_RESERVED
> @@ -86,7 +96,7 @@ int ukplat_memregion_get(int i, struct
> ukplat_memregion_desc *m)
> #endif
> ret = 0;
> break;
> - case 4: /* heap */
> + case 5: /* heap */
> m->base = _libkvmplat_heap_start;
> m->len = (size_t) _libkvmplat_stack_top
> - (size_t) _libkvmplat_heap_start;
> @@ -96,7 +106,7 @@ int ukplat_memregion_get(int i, struct
> ukplat_memregion_desc *m)
> #endif
> ret = 0;
> break;
> - case 5: /* stack */
> + case 6: /* stack */
> m->base = _libkvmplat_stack_top;
> m->len = (size_t) _libkvmplat_mem_end
> - (size_t) _libkvmplat_stack_top;
> diff --git a/plat/kvm/x86/link64.ld b/plat/kvm/x86/link64.ld
> index a9f3ac3..d1bfa73 100644
> --- a/plat/kvm/x86/link64.ld
> +++ b/plat/kvm/x86/link64.ld
> @@ -50,6 +50,24 @@ SECTIONS
> }
> _erodata = .;
>
> + /* Constructor tables (read-only) */
> + _ctors = .;
> + .preinit_array : {
> + . = ALIGN(0x8);
> + PROVIDE_HIDDEN (__preinit_array_start = .);
> + KEEP (*(.preinit_array))
> + PROVIDE_HIDDEN (__preinit_array_end = .);
> + }
> +
> + .init_array : {
> + . = ALIGN(0x8);
> + PROVIDE_HIDDEN (__init_array_start = .);
> + KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*)
> SORT_BY_INIT_PRIORITY(.ctors.*)))
> + KEEP (*(.init_array .ctors))
> + PROVIDE_HIDDEN (__init_array_end = .);
> + }
> + _ectors = .;
> +
> /* Read-write data (initialized) */
> . = ALIGN(0x1000);
> _data = .;
> --
> 2.7.4
>
>
> _______________________________________________
> 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 |