|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [RFC 5/7] WIP:arm64:armds: Build XEN with ARM Compiler 6.6
On Wed, 6 Nov 2019, Andrii Anisov wrote:
> From: Andrii Anisov <andrii_anisov@xxxxxxxx>
>
> Here several ARM Compiler 6.6 issues are solved or provided a work-around:
>
> - Scatter file is pretty primitive, it has no feature to define symbols
> - ARM linker defined symbols are not counted as referred if only mentioned
> in a steering file for rename or resolve, so a header file is used to
> redefine GNU linker script symbols into armlink defined symbols.
>
> - _srodata type clashes by type with __start_bug_frames so can not be both
> redefined as Load$$_rodata_bug_frames_0$$Base. Use resolve feature of
> armlink
> steering file.
Why _srodata and __start_bug_frames cannot both be defined as
Load$$_rodata_bug_frames_0$$Base when actually in the case of:
> +#define __per_cpu_data_end Load$$_bss_percpu$$Limit
> +#define __bss_end Load$$_bss_percpu$$Limit
> +#define _end Load$$_bss_percpu$$Limit
They are all defined as "Load$$_bss_percpu$$Limit"? And:
> +#define __init_end Load$$_bss$$Base
> +#define __bss_start Load$$_bss$$Base
They are both defined as "Load$$_bss$$Base"? What's special about
"Load$$_rodata_bug_frames_0$$Base"?
> - C style shift operators are missed among supported scatter file
> expressions,
> so some needed values are hardcoded in scatter file.
>
> - Rename correspondent ARM Linker defined symbols to those needed by
> `symbols` tool
> using steering file feature.
>
> - ARM Compiler 6.6 tools are not able to rename sections, so we still need
> GNU toolchain's objcopy for this.
>
> Signed-off-by: Andrii Anisov <andrii_anisov@xxxxxxxx>
> ---
> xen/Rules.mk | 6 +
> xen/arch/arm/Makefile | 24 ++++
> xen/arch/arm/xen.scat.S | 266
> ++++++++++++++++++++++++++++++++++++++++++++
I would strongly suggest to rename this file with something not
potentially related to scat
> xen/arch/arm/xen.steer | 5 +
> xen/include/asm-arm/armds.h | 91 +++++++++++++++
> 5 files changed, 392 insertions(+)
> create mode 100644 xen/arch/arm/xen.scat.S
> create mode 100644 xen/arch/arm/xen.steer
> create mode 100644 xen/include/asm-arm/armds.h
>
> diff --git a/xen/Rules.mk b/xen/Rules.mk
> index 41a1c26..67bedce 100644
> --- a/xen/Rules.mk
> +++ b/xen/Rules.mk
> @@ -60,6 +60,12 @@ CFLAGS += -nostdinc -fno-builtin -fno-common
> CFLAGS += -Werror -Wredundant-decls -Wno-pointer-arith
> $(call cc-option-add,CFLAGS,CC,-Wvla)
> CFLAGS += -pipe -D__XEN__ -include $(BASEDIR)/include/xen/config.h
> +
> +ifeq ($(armds),y)
> +CFLAGS += -nostdlibinc -nostdlib -Wno-unused-command-line-argument
> +CFLAGS += -include $(BASEDIR)/include/asm/armds.h
> +endif
> +
> CFLAGS-$(CONFIG_DEBUG_INFO) += -g
> CFLAGS += '-D__OBJECT_FILE__="$@"'
>
> diff --git a/xen/arch/arm/Makefile b/xen/arch/arm/Makefile
> index 70f532e..a5a3479 100644
> --- a/xen/arch/arm/Makefile
> +++ b/xen/arch/arm/Makefile
> @@ -83,11 +83,16 @@ else
> all_symbols =
> endif
>
> +ifeq ($(armds),y)
> +$(TARGET): $(TARGET)-syms
> + fromelf --bin $< --output $@
> +else
> $(TARGET): $(TARGET)-syms
> $(OBJCOPY) -O binary -S $< $@
> ifeq ($(CONFIG_ARM_64),y)
> ln -sf $(notdir $@) ../../$(notdir $@).efi
> endif
> +endif
>
> ifeq ($(CONFIG_LTO),y)
> # Gather all LTO objects together
> @@ -102,6 +107,19 @@ prelink.o: $(ALL_OBJS)
> $(LD) $(LDFLAGS) -r -o $@ $^
> endif
>
> +ifeq ($(armds),y)
> +$(TARGET)-syms: prelink.o xen.scat
> + armlink --scatter="xen.scat" --edit="xen.steer" --no_scanlib $(LDFLAGS)
> prelink.o $(BASEDIR)/common/symbols-dummy.o -o $(@D)/.$(@F).0
> + $(NM) -pa --format=sysv $(@D)/.$(@F).0 \
> + | $(BASEDIR)/tools/symbols $(all_symbols) --sysv --sort
> >$(@D)/.$(@F).0.S
> + $(MAKE) -f $(BASEDIR)/Rules.mk $(@D)/.$(@F).0.o
> + armlink --scatter="xen.scat" --edit="xen.steer" --no_scanlib $(LDFLAGS)
> prelink.o $(@D)/.$(@F).0.o -o $(@D)/.$(@F).1
> + $(NM) -pa --format=sysv $(@D)/.$(@F).1 \
> + | $(BASEDIR)/tools/symbols $(all_symbols) --sysv --sort
> >$(@D)/.$(@F).1.S
> + $(MAKE) -f $(BASEDIR)/Rules.mk $(@D)/.$(@F).1.o
> + armlink --scatter="xen.scat" --edit="xen.steer" --no_scanlib
> --symdefs="$(@D)/$(@F).map" $(LDFLAGS) prelink.o $(build_id_linker)
> $(@D)/.$(@F).1.o -o $@
> + rm -f $(@D)/.$(@F).[0-9]*
> +else
> $(TARGET)-syms: prelink.o xen.lds
> $(LD) $(LDFLAGS) -T xen.lds -N prelink.o \
> $(BASEDIR)/common/symbols-dummy.o -o $(@D)/.$(@F).0
> @@ -119,14 +137,20 @@ $(TARGET)-syms: prelink.o xen.lds
> | $(BASEDIR)/tools/symbols --xensyms --sysv --sort \
> >$(@D)/$(@F).map
> rm -f $(@D)/.$(@F).[0-9]*
> +endif
>
> asm-offsets.s: $(TARGET_SUBARCH)/asm-offsets.c
> $(CC) $(filter-out -flto,$(CFLAGS)) -S -o $@ $<
>
> +ifeq ($(armds),y)
> +xen.scat: xen.scat.S
> + $(CC) -P -E --target=aarch64-arm-none-eabi -o $@ $<
> +else
> xen.lds: xen.lds.S
> $(CC) -P -E -Ui386 $(AFLAGS) -o $@ $<
> sed -e 's/xen\.lds\.o:/xen\.lds:/g' <.xen.lds.d >.xen.lds.d.new
> mv -f .xen.lds.d.new .xen.lds.d
> +endif
>
> dtb.o: $(CONFIG_DTB_FILE)
>
> diff --git a/xen/arch/arm/xen.scat.S b/xen/arch/arm/xen.scat.S
> new file mode 100644
> index 0000000..3bb405f
> --- /dev/null
> +++ b/xen/arch/arm/xen.scat.S
> @@ -0,0 +1,266 @@
> +#if 0
#if 0 must be a mistake?
Also, is this basically the ARMCC version of a linker script? Is
xen.lds.S still used with ARMCC, or only xen.scat.S is used?
> +/*
> + * armlink does not understand shifts in scat file expressions
> + * so hardcode needed values
> + */
> +#include <xen/cache.h>
> +#include <asm/page.h>
> +#include <asm/percpu.h>
> +#undef ENTRY
> +#undef ALIGN
> +#else
> + #define PAGE_SIZE 4096
> + #define POINTER_ALIGN 8
> + #define SMP_CACHE_BYTES 128
> + #define STACK_SIZE 32768
> + #define XEN_VIRT_START 0x00200000
> +#endif
> +
> +LOAD XEN_VIRT_START
> +{
> +;_start
> +;_stext
> + _text AlignExpr(+0, PAGE_SIZE) PADVALUE 0x9090
> + {
> + *(.text*)
> + *(.text.cold)
> + *(.text.unlikely)
> + *(.fixup)
> + *(.gnu.warning)
> + }
> +;_etext
> +
> +;_srodata
> +;__start_bug_frames
> + _rodata_bug_frames_0 AlignExpr(+0, PAGE_SIZE) FIXED ZEROPAD
> + {
> + *(.bug_frames.0)
> + }
> +;__stop_bug_frames_0
> +
> + _rodata_bug_frames_1 +0 FIXED ZEROPAD
> + {
> + *(.bug_frames.1)
> + }
> +;__stop_bug_frames_1
> +
> + _rodata_bug_frames_2 +0 FIXED ZEROPAD
> + {
> + *(.bug_frames.2)
> + }
> +;__stop_bug_frames_2
> +
> + _rodata_data +0
> + {
> + *(.rodata)
> + *(.rodata.*)
> + *(.data.rel.ro)
> + *(.data.rel.ro.*)
> + }
> +
> +#ifdef CONFIG_LOCK_PROFILE
> +;__lock_profile_start
> + _rodata_lockprofile_data AlignExpr(+0, POINTER_ALIGN) FIXED ZEROPAD
> + {
> + *(.lockprofile.data)
> + }
> +;__lock_profile_end
> +#endif
Should be below
> +;__param_start
> + _rodata_data_param AlignExpr(+0, POINTER_ALIGN) FIXED ZEROPAD
> + {
> + *(.data.param)
> + }
> +;__param_end
> +
> +;__proc_info_start
> + _rodata_proc_info +0 FIXED ZEROPAD
> + {
> + *(.proc.info)
> + }
> +;__proc_info_end
> +
> +#if defined(CONFIG_HAS_VPCI) && defined(CONFIG_LATE_HWDOM)
> +;__start_vpci_array
> + _rodata_data_vpci AlignExpr(+0, POINTER_ALIGN) SORTTYPE Lexical FIXED
> ZEROPAD
> + {
> + *(SORT(.data.vpci.*))
> + }
> +;__end_vpci_array
> +#endif
> +
> +#if defined(BUILD_ID)
> +;__note_gnu_build_id_start
> + _note_gnu_build_id +0 FIXED ZEROPAD
> + {
> + *(.note.gnu.build-id)
> + }
> +;__note_gnu_build_id_end
> +#endif
> +
> +;_erodata
> +
> + _data AlignExpr(+0, PAGE_SIZE) FIXED ZEROPAD
> + {
> + *(.data.page_aligned.*)
> + *(.data.*)
> + }
> +
> +;__start_schedulers_array
> + _data_schedulers AlignExpr(+0, 8) FIXED ZEROPAD
> + {
> + *(.data.schedulers)
> + }
> +;__end_schedulers_array
> +
> + _data_rel +0 FIXED ZEROPAD
> + {
> + *(.data.rel)
> + *(.data.rel.*)
> +;#CONSTRUCTORS ????
Honestly I am not sure what this is either
> + }
> +
> +;__start___ex_table
> + _data_ex_table AlignExpr(+0, SMP_CACHE_BYTES) FIXED ZEROPAD
> + {
> + *(.ex_table)
> + }
> +;__stop___ex_table
> +
> +;__start___pre_ex_table
> + _data_ex_table_pre +0 FIXED ZEROPAD
> + {
> + *(.ex_table.pre)
> + }
> +;__stop___pre_ex_table
> +
> + _data_read_mostly +0 FIXED ZEROPAD
> + {
> + *(.data.read_mostly)
> + }
> +
> +;_splatform
> + _arch_info AlignExpr(+0, 8) FIXED ZEROPAD
> + {
> + *(.arch.info)
> + }
> +;_eplatform
> +
> +;_sdevice
> + _dev_info AlignExpr(+0, 8) FIXED ZEROPAD
> + {
> + *(.dev.info)
> + }
> +;_edevice
> +
> +;_asdevice
> + _adev_info AlignExpr(+0, 8) FIXED ZEROPAD
> + {
> + *(.adev.info)
> + }
> +;_aedevice
_steemediator/_eteemediator
> +;__init_begin
> +;_sinittext
> + _init_text AlignExpr(+0, PAGE_SIZE) FIXED ZEROPAD
> + {
> + *(.init.text)
> + }
> +;_einittext
> +
> + _init_rodata AlignExpr(+0, PAGE_SIZE) FIXED ZEROPAD
> + {
> + *(.init.rodata)
> + *(.init.rodata.rel)
> + *(.init.rodata.str*)
> + }
> +
> +;__setup_start
> + _init_setup AlignExpr(+0, POINTER_ALIGN) FIXED ZEROPAD
> + {
> + *(.init.setup)
> + }
> +;__setup_end
> +
> +;__initcall_start
> + _initcallpresmp_init +0 FIXED ZEROPAD
> + {
> + *(.initcallpresmp.init)
> + }
> +;__presmp_initcall_end
> +
> + _initcall1_init +0 FIXED ZEROPAD
> + {
> + *(.initcall1.init)
> + }
> +;__initcall_end
> +
> +;__alt_instructions
> + _altinstructions AlignExpr(+0, 4) FIXED ZEROPAD
> + {
> + *(.altinstructions)
> + }
> +;__alt_instructions_end
> +
> + _altinstr_replacement AlignExpr(+0, 4) FIXED ZEROPAD
> + {
> + *(.altinstr_replacement)
> + }
__lock_profile_start should be here
> +
> + _init_data +0 FIXED ZEROPAD
> + {
> + *(.init.data)
> + *(.init.data.rel)
> + *(.init.data.rel.*)
> + }
> +
> +;__ctors_start
> + _ctors AlignExpr(+0, 8) FIXED ZEROPAD
> + {
> + *(.ctors)
> + *(.init_array)
> + }
> +
> + _init_array_sorted AlignExpr(+0, 8) SORTTYPE Lexical FIXED ZEROPAD
> + {
> + *(.init_array.*)
> + }
> +;__ctors_end
> +
> +#if defined(CONFIG_HAS_VPCI) && !defined(CONFIG_LATE_HWDOM)
> + _data_vpci AlignExpr(+0, POINTER_ALIGN) SORTTYPE Lexical FIXED ZEROPAD
> + {
> + *(.data.vpci.*)
> + }
> +#endif
__start_vpci_array/__end_vpci_array?
> +;__init_end_efi
> +
> +;__init_end
> +;__bss_start
> + _bss AlignExpr(+0, STACK_SIZE) FIXED ZEROPAD
> + {
> + *(.bss.stack_aligned*)
> + *(.bss.page_aligned*, OVERALIGN PAGE_SIZE)
> + *(.bss*)
> + }
> +
> +;__per_cpu_start
this should be page aligned too?
> + _bss_percpu AlignExpr(+0, SMP_CACHE_BYTES) FIXED ZEROPAD
> + {
> + *(.bss.percpu)
> + *(.bss.percpu.read_mostly, OVERALIGN SMP_CACHE_BYTES)
> + }
> +;__per_cpu_data_end
> +;__bss_end
__bss_end should be page aligned?
> +;_end
> +
> +#ifdef CONFIG_DTB_FILE
> +;_sdtb
> + _dtb FIXED ZEROPAD
> + {
> + *(.dtb)
> + }
> +#endif
> +
> +}
> diff --git a/xen/arch/arm/xen.steer b/xen/arch/arm/xen.steer
> new file mode 100644
> index 0000000..646e912
> --- /dev/null
> +++ b/xen/arch/arm/xen.steer
> @@ -0,0 +1,5 @@
> +RESOLVE _srodata AS Load$$_rodata_bug_frames_0$$Base
> +RENAME Load$$_text$$Base AS _stext
> +RENAME Load$$_text$$Limit AS _etext
> +RENAME Load$$_init_text$$Base AS _sinittext
> +RENAME Load$$_init_text$$Limit AS _einittext
I don't get why some if the "symbols" get renamed using RENAME here, and
some other we are using a #define in xen/include/asm-arm/armds.h. Can't
we rename them all here?
> diff --git a/xen/include/asm-arm/armds.h b/xen/include/asm-arm/armds.h
> new file mode 100644
> index 0000000..5ee2e5d
> --- /dev/null
> +++ b/xen/include/asm-arm/armds.h
Missing guards. Also, probably you want to make sure this is only #ifdef
ARMCC.
Is this meant to be used when building C files, asm files, or both?
I would avoid this header file if we can get away with just xen.steer.
> @@ -0,0 +1,91 @@
> +#define _start Load$$_text$$Base
> +#define _stext Load$$_text$$Base
> +
> +#define _etext Load$$_text$$Limit
> +
> +//#define _srodata Load$$_rodata_bug_frames_0$$Base
> +#define __start_bug_frames Load$$_rodata_bug_frames_0$$Base
> +
> +#define __stop_bug_frames_0 Load$$_rodata_bug_frames_0$$Limit
> +#define __stop_bug_frames_1 Load$$_rodata_bug_frames_1$$Limit
> +#define __stop_bug_frames_2 Load$$_rodata_bug_frames_2$$Limit
> +
> +#ifdef CONFIG_LOCK_PROFILE
> +#define __lock_profile_start Load$$_rodata_lockprofile_data$$Base
> +#define __lock_profile_end Load$$_rodata_lockprofile_data$$Limit
> +#endif
> +
> +#define __param_start Load$$_rodata_data_param$$Base
> +#define __param_end Load$$_rodata_data_param$$Limit
> +
> +#define __proc_info_start Load$$_rodata_proc_info$$Base
> +#define __proc_info_end Load$$_rodata_proc_info$$Limit
> +
> +#define _erodata Load$$_rodata_proc_info$$Limit
> +
> +#if defined(CONFIG_HAS_VPCI) && defined(CONFIG_LATE_HWDOM)
> +#define __start_vpci_array Load$$_rodata_data_vpci$$Base
> +#define __end_vpci_array Load$$_rodata_data_vpci$$Limit
> +
> +#undef _erodata
> +#define _erodata Load$$_rodata_data_vpci$$Limit
> +#endif
> +
> +#if defined(BUILD_ID)
> +#define __note_gnu_build_id_start Load$$_note_gnu_build_id$$Base
> +#define __note_gnu_build_id_end Load$$_note_gnu_build_id$$Limit
> +
> +#undef _erodata
> +#define _erodata Load$$_note_gnu_build_id$$Limit
> +#endif
> +
> +#define __start_schedulers_array Load$$_data_schedulers$$Base
> +#define __end_schedulers_array Load$$_data_schedulers$$Limit
> +
> +/* Does not exist for ARM
> +#define __start___ex_table Load$$_data_ex_table$$Base
> +#define __stop___ex_table Load$$_data_ex_table$$Limit
> +*/
> +
> +#define __start___pre_ex_table Load$$_data_ex_table_pre$$Base
> +#define __stop___pre_ex_table Load$$_data_ex_table_pre$$Limit
> +
> +#define _splatform Load$$_arch_info$$Base
> +#define _eplatform Load$$_arch_info$$Limit
> +
> +#define _sdevice Load$$_dev_info$$Base
> +#define _edevice Load$$_dev_info$$Limit
> +
> +#define _asdevice Load$$_adev_info$$Base
> +#define _aedevice Load$$_adev_info$$Limit
> +
> +#define __init_begin Load$$_init_text$$Base
> +#define _sinittext Load$$_init_text$$Base
> +#define _einittext Load$$_init_text$$Limit
> +
> +#define __setup_start Load$$_init_setup$$Base
> +#define __setup_end Load$$_init_setup$$Limit
> +
> +#define __initcall_start Load$$_initcallpresmp_init$$Base
> +#define __presmp_initcall_end Load$$_initcallpresmp_init$$Limit
> +#define __initcall_end Load$$_initcall1_init$$Limit
> +
> +#define __alt_instructions Load$$_altinstructions$$Base
> +#define __alt_instructions_end Load$$_altinstructions$$Limit
> +
> +#define __ctors_start Load$$_ctors$$Base
> +#define __ctors_end Load$$_init_array_sorted$$Limit
> +#define __init_end_efi Load$$_init_array_sorted$$Limit
> +
> +#if defined(CONFIG_HAS_VPCI) && !defined(CONFIG_LATE_HWDOM)
> +#undef __init_end_efi
> +#define __init_end_efi Load$$_data_vpci$$Limit
> +#endif
> +
> +#define __init_end Load$$_bss$$Base
> +#define __bss_start Load$$_bss$$Base
> +
> +#define __per_cpu_start Load$$_bss_percpu$$Base
> +#define __per_cpu_data_end Load$$_bss_percpu$$Limit
> +#define __bss_end Load$$_bss_percpu$$Limit
> +#define _end Load$$_bss_percpu$$Limit
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |