Author: dim
Date: Mon Mar  7 07:54:48 2016
New Revision: 296438
URL: https://svnweb.freebsd.org/changeset/base/296438

Log:
  MFC r296419 (by kib):
  
  In the link_elf_obj.c, handle sections of type SHT_AMD64_UNWIND same
  as SHT_PROGBITS.  This is needed after the clang 3.8 import, which
  generates that type for .eh_frame section, which had SHT_PROGBITS type
  before.
  
  Reported by:  Nikolai Lifanov <lifa...@mail.lifanov.com>
  PR:           207729
  Tested by:    dim (previous version)
  Sponsored by: The FreeBSD Foundation
  
  MFC r296428:
  
  Since kernel modules can now contain sections of type SHT_AMD64_UNWIND,
  the boot loader should not skip over these anymore while loading images.
  Otherwise the kernel can still panic when it doesn't find the .eh_frame
  section belonging to the .rela.eh_frame section.
  
  Unfortunately this will require installing boot loaders from sys/boot
  before attempting to boot with a new kernel.
  
  Reviewed by:  kib

Modified:
  stable/10/sys/boot/common/load_elf_obj.c
  stable/10/sys/kern/link_elf_obj.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/boot/common/load_elf_obj.c
==============================================================================
--- stable/10/sys/boot/common/load_elf_obj.c    Mon Mar  7 07:49:01 2016        
(r296437)
+++ stable/10/sys/boot/common/load_elf_obj.c    Mon Mar  7 07:54:48 2016        
(r296438)
@@ -221,6 +221,9 @@ __elfN(obj_loadimage)(struct preloaded_f
                switch (shdr[i].sh_type) {
                case SHT_PROGBITS:
                case SHT_NOBITS:
+#if defined(__i386__) || defined(__amd64__)
+               case SHT_AMD64_UNWIND:
+#endif
                        lastaddr = roundup(lastaddr, shdr[i].sh_addralign);
                        shdr[i].sh_addr = (Elf_Addr)lastaddr;
                        lastaddr += shdr[i].sh_size;

Modified: stable/10/sys/kern/link_elf_obj.c
==============================================================================
--- stable/10/sys/kern/link_elf_obj.c   Mon Mar  7 07:49:01 2016        
(r296437)
+++ stable/10/sys/kern/link_elf_obj.c   Mon Mar  7 07:54:48 2016        
(r296438)
@@ -257,6 +257,9 @@ link_elf_link_preload(linker_class_t cls
                switch (shdr[i].sh_type) {
                case SHT_PROGBITS:
                case SHT_NOBITS:
+#ifdef __amd64__
+               case SHT_AMD64_UNWIND:
+#endif
                        ef->nprogtab++;
                        break;
                case SHT_SYMTAB:
@@ -327,9 +330,16 @@ link_elf_link_preload(linker_class_t cls
                switch (shdr[i].sh_type) {
                case SHT_PROGBITS:
                case SHT_NOBITS:
+#ifdef __amd64__
+               case SHT_AMD64_UNWIND:
+#endif
                        ef->progtab[pb].addr = (void *)shdr[i].sh_addr;
                        if (shdr[i].sh_type == SHT_PROGBITS)
                                ef->progtab[pb].name = "<<PROGBITS>>";
+#ifdef __amd64__
+                       else if (shdr[i].sh_type == SHT_AMD64_UNWIND)
+                               ef->progtab[pb].name = "<<UNWIND>>";
+#endif
                        else
                                ef->progtab[pb].name = "<<NOBITS>>";
                        ef->progtab[pb].size = shdr[i].sh_size;
@@ -553,6 +563,9 @@ link_elf_load_file(linker_class_t cls, c
                switch (shdr[i].sh_type) {
                case SHT_PROGBITS:
                case SHT_NOBITS:
+#ifdef __amd64__
+               case SHT_AMD64_UNWIND:
+#endif
                        ef->nprogtab++;
                        break;
                case SHT_SYMTAB:
@@ -659,6 +672,9 @@ link_elf_load_file(linker_class_t cls, c
                switch (shdr[i].sh_type) {
                case SHT_PROGBITS:
                case SHT_NOBITS:
+#ifdef __amd64__
+               case SHT_AMD64_UNWIND:
+#endif
                        alignmask = shdr[i].sh_addralign - 1;
                        mapsize += alignmask;
                        mapsize &= ~alignmask;
@@ -726,6 +742,9 @@ link_elf_load_file(linker_class_t cls, c
                switch (shdr[i].sh_type) {
                case SHT_PROGBITS:
                case SHT_NOBITS:
+#ifdef __amd64__
+               case SHT_AMD64_UNWIND:
+#endif
                        alignmask = shdr[i].sh_addralign - 1;
                        mapbase += alignmask;
                        mapbase &= ~alignmask;
@@ -734,6 +753,10 @@ link_elf_load_file(linker_class_t cls, c
                                    ef->shstrtab + shdr[i].sh_name;
                        else if (shdr[i].sh_type == SHT_PROGBITS)
                                ef->progtab[pb].name = "<<PROGBITS>>";
+#ifdef __amd64__
+                       else if (shdr[i].sh_type == SHT_AMD64_UNWIND)
+                               ef->progtab[pb].name = "<<UNWIND>>";
+#endif
                        else
                                ef->progtab[pb].name = "<<NOBITS>>";
                        if (ef->progtab[pb].name != NULL && 
@@ -755,7 +778,11 @@ link_elf_load_file(linker_class_t cls, c
                        }
                        ef->progtab[pb].size = shdr[i].sh_size;
                        ef->progtab[pb].sec = i;
-                       if (shdr[i].sh_type == SHT_PROGBITS) {
+                       if (shdr[i].sh_type == SHT_PROGBITS
+#ifdef __amd64__
+                           || shdr[i].sh_type == SHT_AMD64_UNWIND
+#endif
+                           ) {
                                error = vn_rdwr(UIO_READ, nd.ni_vp,
                                    ef->progtab[pb].addr,
                                    shdr[i].sh_size, shdr[i].sh_offset,
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to