[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH] x86/EFI: warn about r/o sections requiring relocations



EFI implementations may write-protect r/o sections, but we need to
apply relocations. Eliminate the one present case of a r/o section
with relocations (.init.text, which is now being combined with
.init.data into just .init).

Also correct a few other format strings (to account for the possibly
missing NUL in section names).

Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>

--- a/xen/arch/x86/efi/mkreloc.c
+++ b/xen/arch/x86/efi/mkreloc.c
@@ -66,8 +66,9 @@ struct coff_section {
     uint16_t relocation_count;
     uint16_t line_number_count;
     uint32_t flags;
-#define COFF_SECTION_BSS         0x00000080
-#define COFF_SECTION_DISCARDABLE 0x02000000
+#define COFF_SECTION_BSS         0x00000080U
+#define COFF_SECTION_DISCARDABLE 0x02000000U
+#define COFF_SECTION_WRITEABLE   0x80000000U
 };
 
 static void usage(const char *cmd, int rc)
@@ -224,7 +225,7 @@ static void diff_sections(const unsigned
         if ( i < disp || i + width - disp > sec->file_size )
         {
             fprintf(stderr,
-                    "Bogus difference at %s:%08" PRIxFAST32 "\n",
+                    "Bogus difference at %.8s:%08" PRIxFAST32 "\n",
                     sec->name, i);
             exit(3);
         }
@@ -235,7 +236,7 @@ static void diff_sections(const unsigned
         if ( delta != diff )
         {
             fprintf(stderr,
-                    "Difference at %s:%08" PRIxFAST32 " is %#" PRIxFAST64
+                    "Difference at %.8s:%08" PRIxFAST32 " is %#" PRIxFAST64
                     " (expected %#" PRIxFAST64 ")\n",
                     sec->name, i, delta, diff);
             continue;
@@ -261,11 +262,16 @@ static void diff_sections(const unsigned
         else if ( rva != cur_rva )
         {
             fprintf(stderr,
-                    "Cannot handle decreasing RVA (at %s:%08" PRIxFAST32 ")\n",
+                    "Cannot handle decreasing RVA (at %.8s:%08" PRIxFAST32 
")\n",
                     sec->name, i);
             exit(3);
         }
 
+        if ( !(sec->flags & COFF_SECTION_WRITEABLE) )
+            fprintf(stderr,
+                    "Warning: relocation to r/o section %.8s:%08" PRIxFAST32 
"\n",
+                    sec->name, i);
+
         printf("\t.word (%u << 12) | 0x%03" PRIxFAST32 "\n",
                reloc, sec->rva + i - disp - rva);
         reloc_size += 2;
--- a/xen/arch/x86/xen.lds.S
+++ b/xen/arch/x86/xen.lds.S
@@ -155,7 +155,11 @@ SECTIONS
   __2M_init_start = .;         /* Start of 2M superpages, mapped RWX (boot 
only). */
   . = ALIGN(PAGE_SIZE);             /* Init code and data */
   __init_begin = .;
+#ifndef EFI
   .init.text : {
+#else
+  .init : {
+#endif
        _sinittext = .;
        *(.init.text)
        /*
@@ -165,8 +169,12 @@ SECTIONS
         */
        *(.altinstr_replacement)
        _einittext = .;
+#ifndef EFI
   } :text
   .init.data : {
+#else
+       . = ALIGN(SMP_CACHE_BYTES);
+#endif
        *(.init.rodata)
        *(.init.rodata.rel)
        *(.init.rodata.str*)




_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.