From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from list by lists.gnu.org with archive (Exim 4.71) id 1Z9zvq-0006rw-1H for mharc-grub-devel@gnu.org; Tue, 30 Jun 2015 14:06:54 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:43040) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Z9zvn-0006rg-7t for grub-devel@gnu.org; Tue, 30 Jun 2015 14:06:52 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Z9zvj-00056b-VO for grub-devel@gnu.org; Tue, 30 Jun 2015 14:06:51 -0400 Received: from e24smtp02.br.ibm.com ([32.104.18.86]:49790) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Z9zvj-00056J-Fj for grub-devel@gnu.org; Tue, 30 Jun 2015 14:06:47 -0400 Received: from /spool/local by e24smtp02.br.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Tue, 30 Jun 2015 15:06:52 -0300 Received: from d24dlp02.br.ibm.com (9.18.248.206) by e24smtp02.br.ibm.com (10.172.0.142) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Tue, 30 Jun 2015 15:06:50 -0300 X-Helo: d24dlp02.br.ibm.com X-MailFrom: pfsmorigo@linux.vnet.ibm.com X-RcptTo: grub-devel@gnu.org Received: from d24relay02.br.ibm.com (d24relay02.br.ibm.com [9.13.184.26]) by d24dlp02.br.ibm.com (Postfix) with ESMTP id 164081DC0057 for ; Tue, 30 Jun 2015 14:05:42 -0400 (EDT) Received: from d24av02.br.ibm.com (d24av02.br.ibm.com [9.8.31.93]) by d24relay02.br.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id t5UI5HeI852400 for ; Tue, 30 Jun 2015 15:05:18 -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 t5UI6g0J023592 for ; Tue, 30 Jun 2015 15:06:42 -0300 Received: from [9.8.9.255] ([9.8.9.255]) by d24av02.br.ibm.com (8.14.4/8.14.4/NCO v10.0 AVin) with ESMTP id t5UI6fJX023554 for ; Tue, 30 Jun 2015 15:06:42 -0300 Message-ID: <5592DAB1.7080209@linux.vnet.ibm.com> Date: Tue, 30 Jun 2015 15:06:41 -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: grub-devel@gnu.org Subject: Re: [PATCH 2/2] Suport for bi-endianess in elf file References: <1435669013-3741-1-git-send-email-pfsmorigo@linux.vnet.ibm.com> <1435669013-3741-3-git-send-email-pfsmorigo@linux.vnet.ibm.com> <0C55C7C2-351A-45C3-AA16-D5A9853A4AEA@gmail.com> In-Reply-To: <0C55C7C2-351A-45C3-AA16-D5A9853A4AEA@gmail.com> Content-Type: text/plain; charset=koi8-r; format=flowed Content-Transfer-Encoding: 8bit X-TM-AS-MML: disable X-Content-Scanned: Fidelis XPS MAILER x-cbid: 15063018-0021-0000-0000-00000301E9BF X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 32.104.18.86 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: Tue, 30 Jun 2015 18:06:53 -0000 On 2015-06-30 12:03, Andrei Borzenkov wrote: > Did you intentionally ignore my comments to previous version? OH no, sorry, I will take a look. > > Отправлено с iPhone > >> 30 июня 2015 г., в 15:56, Paulo Flabiano Smorigo написал(а): >> >> * 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 | 60 +++++++++++++++++++++++++++++++++++++++-- >> grub-core/kern/elfXX.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++ >> 2 files changed, 131 insertions(+), 2 deletions(-) >> >> diff --git a/grub-core/kern/elf.c b/grub-core/kern/elf.c >> index 5f99c43..de90811 100644 >> --- a/grub-core/kern/elf.c >> +++ b/grub-core/kern/elf.c >> @@ -28,6 +28,11 @@ >> >> GRUB_MOD_LICENSE ("GPLv3+"); >> >> +void grub_elf32_check_endianess (grub_elf_t elf); >> +void grub_elf64_check_endianess (grub_elf_t elf); >> +grub_err_t grub_elf32_check_version (grub_elf_t elf); >> +grub_err_t grub_elf64_check_version (grub_elf_t elf); >> + >> /* Check if EHDR is a valid ELF header. */ >> static grub_err_t >> grub_elf_check_header (grub_elf_t elf) >> @@ -38,10 +43,22 @@ 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 (grub_elf_is_elf32 (elf)) >> + { >> + grub_elf32_check_endianess (elf); >> + grub_elf32_check_version (elf); >> + } >> + else if (grub_elf_is_elf64 (elf)) >> + { >> + grub_elf64_check_endianess (elf); >> + grub_elf64_check_version (elf); >> + } >> + else >> + return grub_error (GRUB_ERR_BAD_OS, N_("invalid arch-dependent ELF magic")); >> + >> return GRUB_ERR_NONE; >> } >> >> @@ -127,7 +144,20 @@ 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_halfXX grub_be_to_cpu16 >> +#define grub_be_to_wordXX grub_be_to_cpu32 >> +#define grub_be_to_addrXX grub_be_to_cpu32 >> +#define grub_be_to_offXX grub_be_to_cpu32 >> +#define grub_be_to_XwordXX grub_be_to_wordXX >> +#define grub_le_to_halfXX grub_le_to_cpu16 >> +#define grub_le_to_wordXX grub_le_to_cpu32 >> +#define grub_le_to_addrXX grub_le_to_cpu32 >> +#define grub_le_to_offXX grub_le_to_cpu32 >> +#define grub_le_to_XwordXX grub_le_to_wordXX >> +#define grub_elfXX_check_endianess grub_elf32_check_endianess >> +#define grub_elfXX_check_version grub_elf32_check_version >> >> #include "elfXX.c" >> >> @@ -140,7 +170,20 @@ 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_halfXX >> +#undef grub_be_to_wordXX >> +#undef grub_be_to_addrXX >> +#undef grub_be_to_offXX >> +#undef grub_be_to_XwordXX >> +#undef grub_le_to_halfXX >> +#undef grub_le_to_wordXX >> +#undef grub_le_to_addrXX >> +#undef grub_le_to_offXX >> +#undef grub_le_to_XwordXX >> +#undef grub_elfXX_check_endianess >> +#undef grub_elfXX_check_version >> >> >> /* 64-bit */ >> @@ -153,6 +196,19 @@ 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_halfXX grub_be_to_cpu16 >> +#define grub_be_to_wordXX grub_be_to_cpu32 >> +#define grub_be_to_addrXX grub_be_to_cpu64 >> +#define grub_be_to_offXX grub_be_to_cpu64 >> +#define grub_be_to_XwordXX grub_be_to_cpu64 >> +#define grub_le_to_halfXX grub_le_to_cpu16 >> +#define grub_le_to_wordXX grub_le_to_cpu32 >> +#define grub_le_to_addrXX grub_le_to_cpu64 >> +#define grub_le_to_offXX grub_le_to_cpu64 >> +#define grub_le_to_XwordXX grub_le_to_cpu64 >> +#define grub_elfXX_check_endianess grub_elf64_check_endianess >> +#define grub_elfXX_check_version grub_elf64_check_version >> >> #include "elfXX.c" >> diff --git a/grub-core/kern/elfXX.c b/grub-core/kern/elfXX.c >> index 1d09971..ecf9df6 100644 >> --- a/grub-core/kern/elfXX.c >> +++ b/grub-core/kern/elfXX.c >> @@ -154,3 +154,76 @@ grub_elfXX_load (grub_elf_t elf, const char *filename, >> >> return grub_errno; >> } >> + >> +void >> +grub_elfXX_check_endianess (grub_elf_t elf) >> +{ >> + ElfXX_Ehdr *e = &(elf->ehdr.ehdrXX); >> + ElfXX_Phdr *phdr; >> + >> + 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); >> + >> + FOR_ELFXX_PHDRS (elf,phdr) >> + { >> + 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); >> + } >> + } >> + else if (e->e_ident[EI_DATA] == ELFDATA2LSB) >> + { >> + e->e_type = grub_le_to_halfXX (e->e_type); >> + 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); >> + >> + FOR_ELFXX_PHDRS (elf,phdr) >> + { >> + 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); >> + } >> + } >> +} >> + >> +grub_err_t >> +grub_elfXX_check_version (grub_elf_t elf) >> +{ >> + if (elf->ehdr.ehdrXX.e_version != EV_CURRENT) >> + return grub_error (GRUB_ERR_BAD_OS, N_("invalid arch-independent ELF magic")); >> + >> + return GRUB_ERR_NONE; >> +} >> -- >> 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