commit-grub
[Top][All Lists]
Advanced

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

[1756] 2008-07-31 Robert Millan <address@hidden>


From: Robert Millan
Subject: [1756] 2008-07-31 Robert Millan <address@hidden>
Date: Thu, 31 Jul 2008 20:48:41 +0000

Revision: 1756
          http://svn.sv.gnu.org/viewvc/?view=rev&root=grub&revision=1756
Author:   robertmh
Date:     2008-07-31 20:48:40 +0000 (Thu, 31 Jul 2008)

Log Message:
-----------
2008-07-31  Robert Millan  <address@hidden>

        * loader/i386/pc/multiboot.c (grub_multiboot_load_elf32): When loading
        ELF segments, use a macro for arbitrarily accessing any of them instead
        of preparing a pointer that allows access to one at a time.
        (grub_multiboot_load_elf64): Likewise.

Modified Paths:
--------------
    trunk/grub2/ChangeLog
    trunk/grub2/loader/i386/pc/multiboot.c

Modified: trunk/grub2/ChangeLog
===================================================================
--- trunk/grub2/ChangeLog       2008-07-31 19:33:23 UTC (rev 1755)
+++ trunk/grub2/ChangeLog       2008-07-31 20:48:40 UTC (rev 1756)
@@ -1,3 +1,10 @@
+2008-07-31  Robert Millan  <address@hidden>
+
+       * loader/i386/pc/multiboot.c (grub_multiboot_load_elf32): When loading
+       ELF segments, use a macro for arbitrarily accessing any of them instead
+       of preparing a pointer that allows access to one at a time.
+       (grub_multiboot_load_elf64): Likewise.
+
 2008-07-31  Bean  <address@hidden>
 
        * boot/i386/pc/lnxboot.S (real_code_2): Replace 0x50 with

Modified: trunk/grub2/loader/i386/pc/multiboot.c
===================================================================
--- trunk/grub2/loader/i386/pc/multiboot.c      2008-07-31 19:33:23 UTC (rev 
1755)
+++ trunk/grub2/loader/i386/pc/multiboot.c      2008-07-31 20:48:40 UTC (rev 
1756)
@@ -97,7 +97,7 @@
 grub_multiboot_load_elf32 (grub_file_t file, void *buffer)
 {
   Elf32_Ehdr *ehdr = (Elf32_Ehdr *) buffer;
-  Elf32_Phdr *phdr;
+  char *phdr_base;
   grub_addr_t physical_entry_addr = 0;
   int i;
 
@@ -116,43 +116,45 @@
 
   entry = ehdr->e_entry;
 
+  phdr_base = (char *) buffer + ehdr->e_phoff;
+#define phdr(i)                        ((Elf32_Phdr *) (phdr_base + (i) * 
ehdr->e_phentsize))
+
   /* Load every loadable segment in memory.  */
   for (i = 0; i < ehdr->e_phnum; i++)
     {
-      phdr = (Elf32_Phdr *) ((char *) buffer + ehdr->e_phoff
-                            + i * ehdr->e_phentsize);
-      if (phdr->p_type == PT_LOAD)
+      if (phdr(i)->p_type == PT_LOAD)
         {
           /* The segment should fit in the area reserved for the OS.  */
-          if (phdr->p_paddr < grub_os_area_addr)
+          if (phdr(i)->p_paddr < grub_os_area_addr)
            return grub_error (GRUB_ERR_BAD_OS,
                               "segment doesn't fit in memory reserved for the 
OS (0x%lx < 0x%lx)",
-                              phdr->p_paddr, grub_os_area_addr);
-          if (phdr->p_paddr + phdr->p_memsz > grub_os_area_addr + 
grub_os_area_size)
+                              phdr(i)->p_paddr, grub_os_area_addr);
+          if (phdr(i)->p_paddr + phdr(i)->p_memsz > grub_os_area_addr + 
grub_os_area_size)
            return grub_error (GRUB_ERR_BAD_OS,
                               "segment doesn't fit in memory reserved for the 
OS (0x%lx > 0x%lx)",
-                              phdr->p_paddr + phdr->p_memsz,
+                              phdr(i)->p_paddr + phdr(i)->p_memsz,
                               grub_os_area_addr + grub_os_area_size);
 
-          if (grub_file_seek (file, (grub_off_t) phdr->p_offset)
+          if (grub_file_seek (file, (grub_off_t) phdr(i)->p_offset)
              == (grub_off_t) -1)
            return grub_error (GRUB_ERR_BAD_OS,
                               "invalid offset in program header");
 
-          if (grub_file_read (file, (void *) phdr->p_paddr, phdr->p_filesz)
-              != (grub_ssize_t) phdr->p_filesz)
+          if (grub_file_read (file, (void *) phdr(i)->p_paddr, 
phdr(i)->p_filesz)
+              != (grub_ssize_t) phdr(i)->p_filesz)
            return grub_error (GRUB_ERR_BAD_OS,
                               "couldn't read segment from file");
 
-          if (phdr->p_filesz < phdr->p_memsz)
-            grub_memset ((char *) phdr->p_paddr + phdr->p_filesz, 0,
-                        phdr->p_memsz - phdr->p_filesz);
+          if (phdr(i)->p_filesz < phdr(i)->p_memsz)
+            grub_memset ((char *) phdr(i)->p_paddr + phdr(i)->p_filesz, 0,
+                        phdr(i)->p_memsz - phdr(i)->p_filesz);
 
-          if ((entry >= phdr->p_vaddr) &&
-             (entry < phdr->p_vaddr + phdr->p_memsz))
-           physical_entry_addr = entry + phdr->p_paddr - phdr->p_vaddr;
+          if ((entry >= phdr(i)->p_vaddr) &&
+             (entry < phdr(i)->p_vaddr + phdr(i)->p_memsz))
+           physical_entry_addr = entry + phdr(i)->p_paddr - phdr(i)->p_vaddr;
         }
     }
+#undef phdr
 
   if (physical_entry_addr)
     entry = physical_entry_addr;
@@ -173,7 +175,7 @@
 grub_multiboot_load_elf64 (grub_file_t file, void *buffer)
 {
   Elf64_Ehdr *ehdr = (Elf64_Ehdr *) buffer;
-  Elf64_Phdr *phdr;
+  char *phdr_base;
   grub_addr_t physical_entry_addr = 0;
   int i;
 
@@ -202,47 +204,49 @@
 
   entry = ehdr->e_entry;
 
+  phdr_base = (char *) buffer + ehdr->e_phoff;
+#define phdr(i)                        ((Elf64_Phdr *) (phdr_base + (i) * 
ehdr->e_phentsize))
+
   /* Load every loadable segment in memory.  */
   for (i = 0; i < ehdr->e_phnum; i++)
     {
-      phdr = (Elf64_Phdr *) ((char *) buffer + ehdr->e_phoff
-                            + i * ehdr->e_phentsize);
-      if (phdr->p_type == PT_LOAD)
+      if (phdr(i)->p_type == PT_LOAD)
         {
           /* The segment should fit in the area reserved for the OS.  */
-          if (phdr->p_paddr < (grub_uint64_t) grub_os_area_addr)
+          if (phdr(i)->p_paddr < (grub_uint64_t) grub_os_area_addr)
            return grub_error (GRUB_ERR_BAD_OS,
                               "segment doesn't fit in memory reserved for the 
OS (0x%lx < 0x%lx)",
-                              phdr->p_paddr, (grub_uint64_t) 
grub_os_area_addr);
-          if (phdr->p_paddr + phdr->p_memsz
+                              phdr(i)->p_paddr, (grub_uint64_t) 
grub_os_area_addr);
+          if (phdr(i)->p_paddr + phdr(i)->p_memsz
                  > (grub_uint64_t) grub_os_area_addr + (grub_uint64_t) 
grub_os_area_size)
            return grub_error (GRUB_ERR_BAD_OS,
                               "segment doesn't fit in memory reserved for the 
OS (0x%lx > 0x%lx)",
-                              phdr->p_paddr + phdr->p_memsz,
+                              phdr(i)->p_paddr + phdr(i)->p_memsz,
                               (grub_uint64_t) grub_os_area_addr + 
(grub_uint64_t) grub_os_area_size);
 
-         if (grub_file_seek (file, (grub_off_t) phdr->p_offset)
+         if (grub_file_seek (file, (grub_off_t) phdr(i)->p_offset)
              == (grub_off_t) -1)
            return grub_error (GRUB_ERR_BAD_OS,
                               "invalid offset in program header");
 
-         if (grub_file_read (file, (void *) ((grub_uint32_t) phdr->p_paddr),
-                             phdr->p_filesz)
-              != (grub_ssize_t) phdr->p_filesz)
+         if (grub_file_read (file, (void *) ((grub_uint32_t) phdr(i)->p_paddr),
+                             phdr(i)->p_filesz)
+              != (grub_ssize_t) phdr(i)->p_filesz)
            return grub_error (GRUB_ERR_BAD_OS,
                               "couldn't read segment from file");
 
-          if (phdr->p_filesz < phdr->p_memsz)
-           grub_memset (((char *) ((grub_uint32_t) phdr->p_paddr)
-                         + phdr->p_filesz),
+          if (phdr(i)->p_filesz < phdr(i)->p_memsz)
+           grub_memset (((char *) ((grub_uint32_t) phdr(i)->p_paddr)
+                         + phdr(i)->p_filesz),
                         0,
-                        phdr->p_memsz - phdr->p_filesz);
+                        phdr(i)->p_memsz - phdr(i)->p_filesz);
 
-         if ((entry >= phdr->p_vaddr) &&
-             (entry < phdr->p_vaddr + phdr->p_memsz))
-           physical_entry_addr = entry + phdr->p_paddr - phdr->p_vaddr;
+         if ((entry >= phdr(i)->p_vaddr) &&
+             (entry < phdr(i)->p_vaddr + phdr(i)->p_memsz))
+           physical_entry_addr = entry + phdr(i)->p_paddr - phdr(i)->p_vaddr;
         }
     }
+#undef phdr
 
   if (physical_entry_addr)
     entry = physical_entry_addr;






reply via email to

[Prev in Thread] Current Thread [Next in Thread]