[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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |