LoongArch: Calculate various sizes in the linker script
authorWANG Rui <wangrui@loongson.cn>
Thu, 29 Jun 2023 12:58:42 +0000 (20:58 +0800)
committerHuacai Chen <chenhuacai@loongson.cn>
Thu, 29 Jun 2023 12:58:42 +0000 (20:58 +0800)
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>
[chenhuacai: Fix build with !CONFIG_EFI_STUB]
Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
arch/loongarch/kernel/efi-header.S
arch/loongarch/kernel/head.S
arch/loongarch/kernel/vmlinux.lds.S

index 8c1d229..5f23b85 100644 (file)
@@ -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 */
index aa64b17..5e828a8 100644 (file)
@@ -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
 
index 0c7b041..b1686af 100644 (file)
@@ -136,6 +136,15 @@ SECTIONS
        DWARF_DEBUG
        ELF_DETAILS
 
+#ifdef CONFIG_EFI_STUB
+       /* header symbols */
+       _kernel_asize = _end - _text;
+       _kernel_fsize = _edata - _text;
+       _kernel_vsize = _end - __initdata_begin;
+       _kernel_rsize = _edata - __initdata_begin;
+       _kernel_offset = kernel_offset - _text;
+#endif
+
        .gptab.sdata : {
                *(.gptab.data)
                *(.gptab.sdata)