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

[Xen-devel] Re: [POWERPC/IA64] Updates required due to loader changes



On Fri, 2006-08-25 at 12:21 +0900, Horms wrote:
> On Thu, 24 Aug 2006 15:29:48 -0500, Hollis Blanchard wrote:
> > On Thu, 2006-08-24 at 14:16 -0600, Alex Williamson wrote:
> >> 
> >> diff -r d5eb5205ff35 tools/xcutils/readnotes.c
> >> --- a/tools/xcutils/readnotes.c       Thu Aug 24 16:25:49 2006 +0100
> >> +++ b/tools/xcutils/readnotes.c       Thu Aug 24 14:12:45 2006 -0600
> >> @@ -22,7 +22,7 @@ typedef Elf32_Nhdr Elf_Nhdr;
> >>  typedef Elf32_Nhdr Elf_Nhdr;
> >>  typedef Elf32_Half Elf_Half;
> >>  typedef Elf32_Word Elf_Word;
> >> -#elif defined(__x86_64__)
> >> +#elif defined(__x86_64__) || defined(__ia64__)
> >>  typedef Elf64_Ehdr Elf_Ehdr;
> >>  typedef Elf64_Nhdr Elf_Nhdr;
> >>  typedef Elf64_Half Elf_Half;
> > 
> > Are we doing this again? Ian, please use ELFSIZE, as seen in the
> > following files:
> >        tools/libxc/xg_private.h
> >        tools/libxc/xc_elf.h
> >        tools/libxc/xc_load_elf.c
> >        config/powerpc64.mk
> > 
> 
> Is the patch below what you had in mind?

Nearly, we need to define ELFSIZE if it isn't already since not all
architectures define it.

I checked in the below. I got rid of Elf_Ehdr while I was there since it
is only used the e_ident field which is unsigned char [] for both
ELFSIZEs. As it happens all the remaining types are the same on 32 and
64 but nevermind...

Ian.

changeset:   11256:9091331dfb353212781622f3c9020492cb049178
tag:         tip
user:        Ian Campbell <ian.campbell@xxxxxxxxxxxxx>
date:        Fri Aug 25 10:39:24 2006 +0100
files:       tools/xcutils/readnotes.c
description:
[TOOLS] Use ELFSIZE to pick the ELF structures to use in readnotes.c

We can remove Elf_Ehdr since it is only used for e_ident which is an
unsigned char array.

Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxxxxx>


diff -r 23a0a408edb9f0675eaec0493c9063c19a14b9cb -r 
9091331dfb353212781622f3c9020492cb049178 tools/xcutils/readnotes.c
--- a/tools/xcutils/readnotes.c Fri Aug 25 10:06:24 2006 +0100
+++ b/tools/xcutils/readnotes.c Fri Aug 25 10:39:24 2006 +0100
@@ -17,18 +17,25 @@
 #define ELFNOTE_DESC(_n_) (ELFNOTE_NAME(_n_) + (((_n_)->n_namesz+3)&~3))
 #define ELFNOTE_NEXT(_n_) (ELFNOTE_DESC(_n_) + (((_n_)->n_descsz+3)&~3))
 
-#if defined(__i386__)
-typedef Elf32_Ehdr Elf_Ehdr;
+#ifndef ELFSIZE
+#include <limits.h>
+#if UINT_MAX == ULONG_MAX
+#define ELFSIZE 32
+#else
+#define ELFSIZE 64
+#endif
+#endif
+
+#if (ELFSIZE == 32)
 typedef Elf32_Nhdr Elf_Nhdr;
 typedef Elf32_Half Elf_Half;
 typedef Elf32_Word Elf_Word;
-#elif defined(__x86_64__)
-typedef Elf64_Ehdr Elf_Ehdr;
+#elif (ELFSIZE == 64)
 typedef Elf64_Nhdr Elf_Nhdr;
 typedef Elf64_Half Elf_Half;
 typedef Elf64_Word Elf_Word;
 #else
-#error "Unknown architecture"
+#error "Unknown ELFSIZE"
 #endif
 
 static void print_string_note(const char *prefix, Elf_Nhdr *note)
@@ -54,18 +61,35 @@ static void print_numeric_note(const cha
        }
 }
 
+static inline int is_elf(void *image)
+{
+       /*
+        * Since we are only accessing the e_ident field we can
+        * acccess the bytes directly without needing to figure out
+        * which version of Elf*_Ehdr structure to use.
+        */
+       const unsigned char *hdr = image;
+       return ( hdr[EI_MAG0] == ELFMAG0 &&
+                hdr[EI_MAG1] == ELFMAG1 &&
+                hdr[EI_MAG2] == ELFMAG2 &&
+                hdr[EI_MAG3] == ELFMAG3 );
+}
+
 static inline unsigned char ehdr_class(void *image)
 {
-       Elf_Ehdr *ehdr = image;
-       switch (ehdr->e_ident[EI_CLASS])
-       {
-       case ELFCLASS32:
-       case ELFCLASS64:
-               return ehdr->e_ident[EI_CLASS];
-               break;
-       default:
-               fprintf(stderr, "Unknown ELF class %d\n",
-                       ehdr->e_ident[EI_CLASS]);
+       /*
+        * Since we are only accessing the e_ident field we can
+        * acccess the bytes directly without needing to figure out
+        * which version of Elf*_Ehdr structure to use.
+        */
+       const unsigned char *hdr = image;
+       switch (hdr[EI_CLASS])
+       {
+       case ELFCLASS32:
+       case ELFCLASS64:
+               return hdr[EI_CLASS];
+       default:
+               fprintf(stderr, "Unknown ELF class %d\n", hdr[EI_CLASS]);
                exit(1);
        }
 }
@@ -198,7 +222,6 @@ int main(int argc, char **argv)
        int fd,h;
        void *image;
        struct stat st;
-       Elf_Ehdr *ehdr;
        Elf_Nhdr *note;
 
        if (argc != 2)
@@ -228,11 +251,7 @@ int main(int argc, char **argv)
                return 1;
        }
 
-       ehdr = image;
-       if (ehdr->e_ident[EI_MAG0] != ELFMAG0 ||
-           ehdr->e_ident[EI_MAG1] != ELFMAG1 ||
-           ehdr->e_ident[EI_MAG2] != ELFMAG2 ||
-           ehdr->e_ident[EI_MAG3] != ELFMAG3)
+       if ( !is_elf(image) )
        {
                fprintf(stderr, "File %s is not an ELF image\n", f);
                return 1;




_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

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