]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/commitdiff
efi: arm64: Add vmlinux debug link to the Image binary
authorArd Biesheuvel <ard.biesheuvel@linaro.org>
Thu, 2 Feb 2017 17:33:19 +0000 (17:33 +0000)
committerWill Deacon <will.deacon@arm.com>
Fri, 3 Feb 2017 15:22:37 +0000 (15:22 +0000)
When building with debugging symbols, take the absolute path to the
vmlinux binary and add it to the special PE/COFF debug table entry.
This allows a debug EFI build to find the vmlinux binary, which is
very helpful in debugging, given that the offset where the Image is
first loaded by EFI is highly unpredictable.

On implementations of UEFI that choose to implement it, this
information is exposed via the EFI debug support table, which is a UEFI
configuration table that is accessible both by the firmware at boot time
and by the OS at runtime, and lists all PE/COFF images loaded by the
system.

The format of the NB10 Codeview entry is based on the definition used
by EDK2, which is our primary reference when it comes to the use of
PE/COFF in the context of UEFI firmware.

Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
[will: use realpath instead of shell invocation, as discussed on list]
Signed-off-by: Will Deacon <will.deacon@arm.com>
arch/arm64/Kconfig.debug
arch/arm64/kernel/Makefile
arch/arm64/kernel/head.S

index d1ebd46872fdf746b1f2c84e0af3959522051009..f7f38b1aab14b318bc859be62fb3125dae65245b 100644 (file)
@@ -95,6 +95,14 @@ config DEBUG_ALIGN_RODATA
 
          If in doubt, say N.
 
+config DEBUG_EFI
+       depends on EFI && DEBUG_INFO
+       bool "UEFI debugging"
+       help
+         Enable this option to include EFI specific debugging features into
+         the kernel that are only useful when using a debug build of the
+         UEFI firmware
+
 source "drivers/hwtracing/coresight/Kconfig"
 
 endmenu
index 7d66bbaafc0c1c299cbf9ab109dedc1dbfdf9f7e..1606c6b2a28085f8725c33df0c55fe5b085a9948 100644 (file)
@@ -55,3 +55,7 @@ obj-y                                 += $(arm64-obj-y) vdso/ probes/
 obj-m                                  += $(arm64-obj-m)
 head-y                                 := head.o
 extra-y                                        += $(head-y) vmlinux.lds
+
+ifeq ($(CONFIG_DEBUG_EFI),y)
+AFLAGS_head.o += -DVMLINUX_PATH="\"$(realpath $(objtree)/vmlinux)\""
+endif
index d3b8f92de5c59f7eb83c3b1c9835036a978999ea..c6cc82ec190b5ccd2970b6133bd29c6c0878bf7a 100644 (file)
@@ -149,7 +149,7 @@ extra_header_fields:
        .quad   0                               // SizeOfHeapReserve
        .quad   0                               // SizeOfHeapCommit
        .long   0                               // LoaderFlags
-       .long   0x6                             // NumberOfRvaAndSizes
+       .long   (section_table - .) / 8         // NumberOfRvaAndSizes
 
        .quad   0                               // ExportTable
        .quad   0                               // ImportTable
@@ -158,6 +158,11 @@ extra_header_fields:
        .quad   0                               // CertificationTable
        .quad   0                               // BaseRelocationTable
 
+#ifdef CONFIG_DEBUG_EFI
+       .long   efi_debug_table - _head         // DebugTable
+       .long   efi_debug_table_size
+#endif
+
        // Section table
 section_table:
 
@@ -195,6 +200,46 @@ section_table:
        .short  0               // NumberOfLineNumbers  (0 for executables)
        .long   0xe0500020      // Characteristics (section flags)
 
+#ifdef CONFIG_DEBUG_EFI
+       /*
+        * The debug table is referenced via its Relative Virtual Address (RVA),
+        * which is only defined for those parts of the image that are covered
+        * by a section declaration. Since this header is not covered by any
+        * section, the debug table must be emitted elsewhere. So stick it in
+        * the .init.rodata section instead.
+        *
+        * Note that the EFI debug entry itself may legally have a zero RVA,
+        * which means we can simply put it right after the section headers.
+        */
+       __INITRODATA
+
+       .align  2
+efi_debug_table:
+       // EFI_IMAGE_DEBUG_DIRECTORY_ENTRY
+       .long   0                       // Characteristics
+       .long   0                       // TimeDateStamp
+       .short  0                       // MajorVersion
+       .short  0                       // MinorVersion
+       .long   2                       // Type == EFI_IMAGE_DEBUG_TYPE_CODEVIEW
+       .long   efi_debug_entry_size    // SizeOfData
+       .long   0                       // RVA
+       .long   efi_debug_entry - _head // FileOffset
+
+       .set    efi_debug_table_size, . - efi_debug_table
+       .previous
+
+efi_debug_entry:
+       // EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY
+       .ascii  "NB10"                  // Signature
+       .long   0                       // Unknown
+       .long   0                       // Unknown2
+       .long   0                       // Unknown3
+
+       .asciz  VMLINUX_PATH
+
+       .set    efi_debug_entry_size, . - efi_debug_entry
+#endif
+
        /*
         * EFI will load .text onwards at the 4k section alignment
         * described in the PE/COFF header. To ensure that instruction