diff mbox series

[v3,1/8] LoongArch: Calculate various sizes in the linker script

Message ID 20230625095644.3156349-2-kernel@xen0n.name (mailing list archive)
State New, archived
Headers show
Series LoongArch: Preliminary ClangBuiltLinux enablement | expand

Commit Message

WANG Xuerui June 25, 2023, 9:56 a.m. UTC
From: WANG Rui <wangrui@loongson.cn>

Taking the address delta between symbols in different sections is not
supported by the LLVM IAS. Instead, do this in the linker script, so
the same data can be properly referenced in assembly.

Signed-off-by: WANG Rui <wangrui@loongson.cn>
Signed-off-by: WANG Xuerui <git@xen0n.name>
---
 arch/loongarch/kernel/efi-header.S  | 6 +++---
 arch/loongarch/kernel/head.S        | 8 ++++----
 arch/loongarch/kernel/vmlinux.lds.S | 7 +++++++
 3 files changed, 14 insertions(+), 7 deletions(-)

Comments

Huacai Chen June 28, 2023, 9:33 a.m. UTC | #1
On Sun, Jun 25, 2023 at 5:57 PM WANG Xuerui <kernel@xen0n.name> wrote:
>
> From: WANG Rui <wangrui@loongson.cn>
>
> Taking the address delta between symbols in different sections is not
> supported by the LLVM IAS. Instead, do this in the linker script, so
> the same data can be properly referenced in assembly.
>
> Signed-off-by: WANG Rui <wangrui@loongson.cn>
> Signed-off-by: WANG Xuerui <git@xen0n.name>
> ---
>  arch/loongarch/kernel/efi-header.S  | 6 +++---
>  arch/loongarch/kernel/head.S        | 8 ++++----
>  arch/loongarch/kernel/vmlinux.lds.S | 7 +++++++
>  3 files changed, 14 insertions(+), 7 deletions(-)
>
> diff --git a/arch/loongarch/kernel/efi-header.S b/arch/loongarch/kernel/efi-header.S
> index 8c1d229a2afa..5f23b85d78ca 100644
> --- a/arch/loongarch/kernel/efi-header.S
> +++ b/arch/loongarch/kernel/efi-header.S
> @@ -24,7 +24,7 @@
>         .byte   0x02                                    /* MajorLinkerVersion */
>         .byte   0x14                                    /* MinorLinkerVersion */
>         .long   __inittext_end - .Lefi_header_end       /* SizeOfCode */
> -       .long   _end - __initdata_begin                 /* SizeOfInitializedData */
> +       .long   _kernel_vsize                           /* SizeOfInitializedData */
>         .long   0                                       /* SizeOfUninitializedData */
>         .long   __efistub_efi_pe_entry - _head          /* AddressOfEntryPoint */
>         .long   .Lefi_header_end - _head                /* BaseOfCode */
> @@ -79,9 +79,9 @@
>                 IMAGE_SCN_MEM_EXECUTE                   /* Characteristics */
>
>         .ascii  ".data\0\0\0"
> -       .long   _end - __initdata_begin                 /* VirtualSize */
> +       .long   _kernel_vsize                           /* VirtualSize */
>         .long   __initdata_begin - _head                /* VirtualAddress */
> -       .long   _edata - __initdata_begin               /* SizeOfRawData */
> +       .long   _kernel_rsize                           /* SizeOfRawData */
>         .long   __initdata_begin - _head                /* PointerToRawData */
>
>         .long   0                                       /* PointerToRelocations */
> diff --git a/arch/loongarch/kernel/head.S b/arch/loongarch/kernel/head.S
> index 0d8180153ec0..53b883db0786 100644
> --- a/arch/loongarch/kernel/head.S
> +++ b/arch/loongarch/kernel/head.S
> @@ -23,7 +23,7 @@ _head:
>         .word   MZ_MAGIC                /* "MZ", MS-DOS header */
>         .org    0x8
>         .dword  kernel_entry            /* Kernel entry point */
> -       .dword  _end - _text            /* Kernel image effective size */
> +       .dword  _kernel_asize           /* Kernel image effective size */
>         .quad   PHYS_LINK_KADDR         /* Kernel image load offset from start of RAM */
>         .org    0x38                    /* 0x20 ~ 0x37 reserved */
>         .long   LINUX_PE_MAGIC
> @@ -32,9 +32,9 @@ _head:
>  pe_header:
>         __EFI_PE_HEADER
>
> -SYM_DATA(kernel_asize, .long _end - _text);
> -SYM_DATA(kernel_fsize, .long _edata - _text);
> -SYM_DATA(kernel_offset, .long kernel_offset - _text);
> +SYM_DATA(kernel_asize, .long _kernel_asize);
> +SYM_DATA(kernel_fsize, .long _kernel_fsize);
> +SYM_DATA(kernel_offset, .long _kernel_offset);
>
>  #endif
>
> diff --git a/arch/loongarch/kernel/vmlinux.lds.S b/arch/loongarch/kernel/vmlinux.lds.S
> index 0c7b041be9d8..79f238df029e 100644
> --- a/arch/loongarch/kernel/vmlinux.lds.S
> +++ b/arch/loongarch/kernel/vmlinux.lds.S
> @@ -136,6 +136,13 @@ SECTIONS
>         DWARF_DEBUG
>         ELF_DETAILS
>
> +       /* header symbols */
> +       _kernel_asize = _end - _text;
> +       _kernel_fsize = _edata - _text;
> +       _kernel_offset = kernel_offset - _text;
When !CONFIG_EFI_STUB there is a build error, I fixed it when I applied.

Huacai
> +       _kernel_vsize = _end - __initdata_begin;
> +       _kernel_rsize = _edata - __initdata_begin;
> +
>         .gptab.sdata : {
>                 *(.gptab.data)
>                 *(.gptab.sdata)
> --
> 2.40.0
>
>
diff mbox series

Patch

diff --git a/arch/loongarch/kernel/efi-header.S b/arch/loongarch/kernel/efi-header.S
index 8c1d229a2afa..5f23b85d78ca 100644
--- a/arch/loongarch/kernel/efi-header.S
+++ b/arch/loongarch/kernel/efi-header.S
@@ -24,7 +24,7 @@ 
 	.byte	0x02					/* MajorLinkerVersion */
 	.byte	0x14					/* MinorLinkerVersion */
 	.long	__inittext_end - .Lefi_header_end	/* SizeOfCode */
-	.long	_end - __initdata_begin			/* SizeOfInitializedData */
+	.long	_kernel_vsize				/* SizeOfInitializedData */
 	.long	0					/* SizeOfUninitializedData */
 	.long	__efistub_efi_pe_entry - _head		/* AddressOfEntryPoint */
 	.long	.Lefi_header_end - _head		/* BaseOfCode */
@@ -79,9 +79,9 @@ 
 		IMAGE_SCN_MEM_EXECUTE			/* Characteristics */
 
 	.ascii	".data\0\0\0"
-	.long	_end - __initdata_begin			/* VirtualSize */
+	.long	_kernel_vsize				/* VirtualSize */
 	.long	__initdata_begin - _head		/* VirtualAddress */
-	.long	_edata - __initdata_begin		/* SizeOfRawData */
+	.long	_kernel_rsize				/* SizeOfRawData */
 	.long	__initdata_begin - _head		/* PointerToRawData */
 
 	.long	0					/* PointerToRelocations */
diff --git a/arch/loongarch/kernel/head.S b/arch/loongarch/kernel/head.S
index 0d8180153ec0..53b883db0786 100644
--- a/arch/loongarch/kernel/head.S
+++ b/arch/loongarch/kernel/head.S
@@ -23,7 +23,7 @@  _head:
 	.word	MZ_MAGIC		/* "MZ", MS-DOS header */
 	.org	0x8
 	.dword	kernel_entry		/* Kernel entry point */
-	.dword	_end - _text		/* Kernel image effective size */
+	.dword	_kernel_asize		/* Kernel image effective size */
 	.quad	PHYS_LINK_KADDR		/* Kernel image load offset from start of RAM */
 	.org	0x38			/* 0x20 ~ 0x37 reserved */
 	.long	LINUX_PE_MAGIC
@@ -32,9 +32,9 @@  _head:
 pe_header:
 	__EFI_PE_HEADER
 
-SYM_DATA(kernel_asize, .long _end - _text);
-SYM_DATA(kernel_fsize, .long _edata - _text);
-SYM_DATA(kernel_offset, .long kernel_offset - _text);
+SYM_DATA(kernel_asize, .long _kernel_asize);
+SYM_DATA(kernel_fsize, .long _kernel_fsize);
+SYM_DATA(kernel_offset, .long _kernel_offset);
 
 #endif
 
diff --git a/arch/loongarch/kernel/vmlinux.lds.S b/arch/loongarch/kernel/vmlinux.lds.S
index 0c7b041be9d8..79f238df029e 100644
--- a/arch/loongarch/kernel/vmlinux.lds.S
+++ b/arch/loongarch/kernel/vmlinux.lds.S
@@ -136,6 +136,13 @@  SECTIONS
 	DWARF_DEBUG
 	ELF_DETAILS
 
+	/* header symbols */
+	_kernel_asize = _end - _text;
+	_kernel_fsize = _edata - _text;
+	_kernel_offset = kernel_offset - _text;
+	_kernel_vsize = _end - __initdata_begin;
+	_kernel_rsize = _edata - __initdata_begin;
+
 	.gptab.sdata : {
 		*(.gptab.data)
 		*(.gptab.sdata)