WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

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

To: Horms <horms@xxxxxxxxxxxx>
Subject: [Xen-devel] Re: [POWERPC/IA64] Updates required due to loader changes
From: Ian Campbell <Ian.Campbell@xxxxxxxxxxxxx>
Date: Fri, 25 Aug 2006 10:42:25 +0100
Cc: Jimi Xenidis <jimix@xxxxxxxxxxxxxx>, xen-devel <xen-devel@xxxxxxxxxxxxxxxxxxx>, Alex Williamson <alex.williamson@xxxxxx>, Hollis Blanchard <hollisb@xxxxxxxxxx>
Delivery-date: Fri, 25 Aug 2006 02:43:09 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
In-reply-to: <20060825032151.C2647340AE@xxxxxxxxxxxxxxxxx>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
References: <20060825032151.C2647340AE@xxxxxxxxxxxxxxxxx>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
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

<Prev in Thread] Current Thread [Next in Thread>