From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from list by lists.gnu.org with archive (Exim 4.71) id 1ZJXJT-00018O-6b for mharc-grub-devel@gnu.org; Sun, 26 Jul 2015 21:34:43 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:42405) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZJXJP-00017W-04 for grub-devel@gnu.org; Sun, 26 Jul 2015 21:34:41 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZJXJL-0007PX-Oa for grub-devel@gnu.org; Sun, 26 Jul 2015 21:34:38 -0400 Received: from e24smtp02.br.ibm.com ([32.104.18.86]:47531) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZJXJL-0007OZ-7h for grub-devel@gnu.org; Sun, 26 Jul 2015 21:34:35 -0400 Received: from /spool/local by e24smtp02.br.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Sun, 26 Jul 2015 22:34:31 -0300 Received: from d24dlp01.br.ibm.com (9.18.248.204) by e24smtp02.br.ibm.com (10.172.0.142) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Sun, 26 Jul 2015 22:34:29 -0300 X-Helo: d24dlp01.br.ibm.com X-MailFrom: pfsmorigo@linux.vnet.ibm.com X-RcptTo: grub-devel@gnu.org Received: from d24relay03.br.ibm.com (d24relay03.br.ibm.com [9.13.184.25]) by d24dlp01.br.ibm.com (Postfix) with ESMTP id B6EB0352005F for ; Sun, 26 Jul 2015 21:33:23 -0400 (EDT) Received: from d24av02.br.ibm.com (d24av02.br.ibm.com [9.8.31.93]) by d24relay03.br.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id t6R1X5WR64028870 for ; Sun, 26 Jul 2015 22:33:05 -0300 Received: from d24av02.br.ibm.com (localhost [127.0.0.1]) by d24av02.br.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id t6R1YRjF016322 for ; Sun, 26 Jul 2015 22:34:27 -0300 Received: from [9.78.137.52] ([9.78.137.52]) by d24av02.br.ibm.com (8.14.4/8.14.4/NCO v10.0 AVin) with ESMTP id t6R1YQlo016314; Sun, 26 Jul 2015 22:34:27 -0300 Message-ID: <55B58AA2.3080504@linux.vnet.ibm.com> Date: Sun, 26 Jul 2015 22:34:26 -0300 From: Paulo Flabiano Smorigo User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.7.0 MIME-Version: 1.0 To: The development of GNU GRUB Subject: Re: [PATCH v2] Suport for bi-endianess in elf file References: <1437660636-4027-1-git-send-email-pfsmorigo@linux.vnet.ibm.com> In-Reply-To: Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 8bit X-TM-AS-MML: disable X-Content-Scanned: Fidelis XPS MAILER x-cbid: 15072701-0021-0000-0000-00000335B0BA X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 32.104.18.86 Cc: Andrey Borzenkov X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.14 Precedence: list Reply-To: The development of GNU GRUB List-Id: The development of GNU GRUB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 27 Jul 2015 01:34:41 -0000 On 2015-07-24 16:00, Vladimir 'phcoder' Serbinenko wrote: > > Le 23 juil. 2015 16:11, "Paulo Flabiano Smorigo" > > a > écrit : > > > > Updated version with the suggestions from Andrei Borzenkov. > > > > * grub-core/kern/elf.c: check and switch endianess with grub_{be,le}_to > > cpu functions. > > * grub-core/kern/elfXX.c: Likewise. > > > > Also-by: Tomohiro B Berry > > > --- > > grub-core/kern/elf.c | 51 ++++++++++++++++++++++++++++++--- > > grub-core/kern/elfXX.c | 76 > ++++++++++++++++++++++++++++++++++++++++++++++++++ > > 2 files changed, 123 insertions(+), 4 deletions(-) > > > > diff --git a/grub-core/kern/elf.c b/grub-core/kern/elf.c > > index 5f99c43..1be9c1c 100644 > > --- a/grub-core/kern/elf.c > > +++ b/grub-core/kern/elf.c > > @@ -28,6 +28,11 @@ > > > > GRUB_MOD_LICENSE ("GPLv3+"); > > > > +#if defined(__powerpc__) && defined(GRUB_MACHINE_IEEE1275) > > +void grub_elf32_check_endianess (grub_elf_t elf); > > +void grub_elf64_check_endianess (grub_elf_t elf); > > +#endif /* defined(__powerpc__) && defined(GRUB_MACHINE_IEEE1275) */ > > + > > /* Check if EHDR is a valid ELF header. */ > > static grub_err_t > > grub_elf_check_header (grub_elf_t elf) > > @@ -38,8 +43,19 @@ grub_elf_check_header (grub_elf_t elf) > > || e->e_ident[EI_MAG1] != ELFMAG1 > > || e->e_ident[EI_MAG2] != ELFMAG2 > > || e->e_ident[EI_MAG3] != ELFMAG3 > > - || e->e_ident[EI_VERSION] != EV_CURRENT > > - || e->e_version != EV_CURRENT) > > + || e->e_ident[EI_VERSION] != EV_CURRENT) > > + return grub_error (GRUB_ERR_BAD_OS, N_("invalid arch-independent > ELF magic")); > > + > > +#if defined(__powerpc__) && defined(GRUB_MACHINE_IEEE1275) > > + if (grub_elf_is_elf32 (elf)) > > + grub_elf32_check_endianess (elf); > > + else if (grub_elf_is_elf64 (elf)) > > + grub_elf64_check_endianess (elf); > > + else > > + return grub_error (GRUB_ERR_BAD_OS, N_("Uknown ELF class")); > > +#endif /* defined(__powerpc__) && defined(GRUB_MACHINE_IEEE1275) */ > > + > > + if (e->e_version != EV_CURRENT) > > return grub_error (GRUB_ERR_BAD_OS, N_("invalid arch-independent > ELF magic")); > > > > return GRUB_ERR_NONE; > > @@ -116,7 +132,11 @@ grub_elf_open (const char *name) > > return elf; > > } > > > > - > > +#define grub_be_to_halfXX grub_be_to_cpu16 > > +#define grub_le_to_halfXX grub_le_to_cpu16 > > +#define grub_be_to_wordXX grub_be_to_cpu32 > > +#define grub_le_to_wordXX grub_le_to_cpu32 > > + > > /* 32-bit */ > > #define ehdrXX ehdr32 > > #define ELFCLASSXX ELFCLASS32 > > @@ -127,7 +147,15 @@ grub_elf_open (const char *name) > > #define grub_elf_is_elfXX grub_elf_is_elf32 > > #define grub_elfXX_load_phdrs grub_elf32_load_phdrs > > #define ElfXX_Phdr Elf32_Phdr > > +#define ElfXX_Ehdr Elf32_Ehdr > > #define grub_uintXX_t grub_uint32_t > > +#define grub_be_to_addrXX grub_be_to_cpu32 > > +#define grub_le_to_addrXX grub_le_to_cpu32 > > +#define grub_be_to_offXX grub_be_to_cpu32 > > +#define grub_le_to_offXX grub_le_to_cpu32 > > +#define grub_be_to_XwordXX grub_be_to_cpu32 > > +#define grub_le_to_XwordXX grub_le_to_cpu32 > > +#define grub_elfXX_check_endianess grub_elf32_check_endianess > > > > #include "elfXX.c" > > > > @@ -140,9 +168,16 @@ grub_elf_open (const char *name) > > #undef grub_elf_is_elfXX > > #undef grub_elfXX_load_phdrs > > #undef ElfXX_Phdr > > +#undef ElfXX_Ehdr > > #undef grub_uintXX_t > > +#undef grub_be_to_addrXX > > +#undef grub_le_to_addrXX > > +#undef grub_be_to_offXX > > +#undef grub_le_to_offXX > > +#undef grub_be_to_XwordXX > > +#undef grub_le_to_XwordXX > > +#undef grub_elfXX_check_endianess > > > > - > > /* 64-bit */ > > #define ehdrXX ehdr64 > > #define ELFCLASSXX ELFCLASS64 > > @@ -153,6 +188,14 @@ grub_elf_open (const char *name) > > #define grub_elf_is_elfXX grub_elf_is_elf64 > > #define grub_elfXX_load_phdrs grub_elf64_load_phdrs > > #define ElfXX_Phdr Elf64_Phdr > > +#define ElfXX_Ehdr Elf64_Ehdr > > #define grub_uintXX_t grub_uint64_t > > +#define grub_be_to_addrXX grub_be_to_cpu64 > > +#define grub_le_to_addrXX grub_le_to_cpu64 > > +#define grub_be_to_offXX grub_be_to_cpu64 > > +#define grub_le_to_offXX grub_le_to_cpu64 > > +#define grub_be_to_XwordXX grub_be_to_cpu64 > > +#define grub_le_to_XwordXX grub_le_to_cpu64 > > +#define grub_elfXX_check_endianess grub_elf64_check_endianess > > > > #include "elfXX.c" > > diff --git a/grub-core/kern/elfXX.c b/grub-core/kern/elfXX.c > > index 1d09971..c14e071 100644 > > --- a/grub-core/kern/elfXX.c > > +++ b/grub-core/kern/elfXX.c > > @@ -31,6 +31,39 @@ grub_elfXX_load_phdrs (grub_elf_t elf) > > return grub_errno; > > } > > > > +#if defined(__powerpc__) && defined(GRUB_MACHINE_IEEE1275) > > + ElfXX_Phdr *phdr; > > + for (phdr = elf->phdrs; > > + phdr && phdr < (ElfXX_Phdr *) elf->phdrs + > elf->ehdr.ehdrXX.e_phnum; > > + phdr++) > > + { > > + if (elf->ehdr.ehdrXX.e_ident[EI_DATA] == ELFDATA2LSB) > > + { > > + phdr->p_type = grub_le_to_wordXX (phdr->p_type); > > + phdr->p_flags = grub_le_to_wordXX (phdr->p_flags); > > + phdr->p_offset = grub_le_to_offXX (phdr->p_offset); > > + phdr->p_vaddr = grub_le_to_addrXX (phdr->p_vaddr); > > + phdr->p_paddr = grub_le_to_addrXX (phdr->p_paddr); > > + phdr->p_filesz = grub_le_to_XwordXX (phdr->p_filesz); > > + phdr->p_memsz = grub_le_to_XwordXX (phdr->p_memsz); > > + phdr->p_align = grub_le_to_XwordXX (phdr->p_align); > > + } > > +#if !defined(GRUB_CPU_WORDS_BIGENDIAN) && 0 > &&0. Really. AFAICT this breaks bigendian elf support. Please test your > patch with be kernel I built and tested in both endianess. No problem found. Will double check it. > > + else if (elf->ehdr.ehdrXX.e_ident[EI_DATA] == ELFDATA2MSB) > > + { > > + phdr->p_type = grub_be_to_wordXX (phdr->p_type); > > + phdr->p_flags = grub_be_to_wordXX (phdr->p_flags); > > + phdr->p_offset = grub_be_to_offXX (phdr->p_offset); > > + phdr->p_vaddr = grub_be_to_addrXX (phdr->p_vaddr); > > + phdr->p_paddr = grub_be_to_addrXX (phdr->p_paddr); > > + phdr->p_filesz = grub_be_to_XwordXX (phdr->p_filesz); > > + phdr->p_memsz = grub_be_to_XwordXX (phdr->p_memsz); > > + phdr->p_align = grub_be_to_XwordXX (phdr->p_align); > > + } > > +#endif /* !defined(GRUB_CPU_WORDS_BIGENDIAN) && 0 */ > > + } > > +#endif /* defined(__powerpc__) && defined(GRUB_MACHINE_IEEE1275) */ > > + > > return GRUB_ERR_NONE; > > } > > > > @@ -154,3 +187,46 @@ grub_elfXX_load (grub_elf_t elf, const char > *filename, > > > > return grub_errno; > > } > > + > > +#if defined(__powerpc__) && defined(GRUB_MACHINE_IEEE1275) > > +void > > +grub_elfXX_check_endianess (grub_elf_t elf) > > +{ > > + ElfXX_Ehdr *e = &(elf->ehdr.ehdrXX); > > + > > + if (e->e_ident[EI_DATA] == ELFDATA2LSB) > > + { > > + e->e_type = grub_le_to_halfXX (e->e_type); > This is more than just check. Please reflect it in function name for > code readability. Agree. Maybe grub_check_convert_endianess? > > + e->e_machine = grub_le_to_halfXX (e->e_machine); > > + e->e_version = grub_le_to_wordXX (e->e_version); > > + e->e_entry = grub_le_to_addrXX (e->e_entry); > > + e->e_phoff = grub_le_to_offXX (e->e_phoff); > > + e->e_shoff = grub_le_to_offXX (e->e_shoff); > > + e->e_flags = grub_le_to_wordXX (e->e_flags); > > + e->e_ehsize = grub_le_to_halfXX (e->e_ehsize); > > + e->e_phentsize = grub_le_to_halfXX (e->e_phentsize); > > + e->e_phnum = grub_le_to_halfXX (e->e_phnum); > > + e->e_shentsize = grub_le_to_halfXX (e->e_shentsize); > > + e->e_shnum = grub_le_to_halfXX (e->e_shnum); > > + e->e_shstrndx = grub_le_to_halfXX (e->e_shstrndx); > > + } > > +#if !defined(GRUB_CPU_WORDS_BIGENDIAN) && 0 > > + else if (e->e_ident[EI_DATA] == ELFDATA2MSB) > > + { > > + e->e_type = grub_be_to_halfXX (e->e_type); > > + e->e_machine = grub_be_to_halfXX (e->e_machine); > > + e->e_version = grub_be_to_wordXX (e->e_version); > > + e->e_entry = grub_be_to_addrXX (e->e_entry); > > + e->e_phoff = grub_be_to_offXX (e->e_phoff); > > + e->e_shoff = grub_be_to_offXX (e->e_shoff); > > + e->e_flags = grub_be_to_wordXX (e->e_flags); > > + e->e_ehsize = grub_be_to_halfXX (e->e_ehsize); > > + e->e_phentsize = grub_be_to_halfXX (e->e_phentsize); > > + e->e_phnum = grub_be_to_halfXX (e->e_phnum); > > + e->e_shentsize = grub_be_to_halfXX (e->e_shentsize); > > + e->e_shnum = grub_be_to_halfXX (e->e_shnum); > > + e->e_shstrndx = grub_be_to_halfXX (e->e_shstrndx); > > + } > > +#endif /* !defined(GRUB_CPU_WORDS_BIGENDIAN) && 0 */ > > +} > > +#endif /* defined(__powerpc__) && defined(GRUB_MACHINE_IEEE1275) */ > > -- > > 2.1.0 > > > > > > _______________________________________________ > > Grub-devel mailing list > > Grub-devel@gnu.org > > https://lists.gnu.org/mailman/listinfo/grub-devel > > > > _______________________________________________ > Grub-devel mailing list > Grub-devel@gnu.org > https://lists.gnu.org/mailman/listinfo/grub-devel > -- Paulo Flabiano Smorigo IBM Linux Technology Center