Hi!

On Thu, Aug 30, 2007 at 12:03:47PM +0200, Patrick Georgi wrote:
> Hi,
> 
> the attached patch makes powerpc-ieee1275's grub-mkimage work with 
> little endian ELF images, too.
> I did this, as I need basically the same functionality for 
> i386-linuxbios, just with little endian ELFs. I first copied and changed 
> the file for my needs, but it might be more generally useful (other 
> architectures), and having to maintain two very similar files seems like 
> a waste of time to me - hence the merged version.
> I also moved the file to util/elf, to denote that it's a generic ELF 
> mangler now and adapted the powerpc makefile.

I think the endianess checks are overkill.  AFAICT grub-mkimage isn't really
meant for non-native use (as exemplified by the fact that it's not called
grub-mkelfimage vs grub-mkaoutimage).

I propose the following:

2007-10-01  Robert Millan  <[EMAIL PROTECTED]>

        * conf/powerpc-ieee1275.rmk (grub_mkimage_SOURCES): Replace reference
        to util/powerpc/ieee1275/grub-mkimage.c with util/elf/grub-mkimage.c.

        * include/grub/powerpc/ieee1275/kernel.h: Rename
        GRUB_IEEE1275_MOD_ALIGN to GRUB_MOD_ALIGN.
        * kern/powerpc/ieee1275/init.c: Replace GRUB_IEEE1275_MOD_ALIGN with
        GRUB_MOD_ALIGN.
        * util/elf/grub-mkimage.c: Replace GRUB_IEEE1275_MOD_ALIGN with
        GRUB_MOD_ALIGN.  Remove all use of endian conversion macros, since
        they break LE platforms and grub-mkimage is only meant for native
        use anyway.

2007-10-01  Robert Millan  <[EMAIL PROTECTED]>

        * util/powerpc/ieee1275/grub-mkimage.c: Moved to ...
        * util/elf/grub-mkimage.c: ... here.

The attached patch has been tested on Qemu/LinuxBIOS and on my Efika
(powerpc).

-- 
Robert Millan

<GPLv2> I know my rights; I want my phone call!
<DRM> What use is a phone call, if you are unable to speak?
(as seen on /.)
2007-10-01  Robert Millan  <[EMAIL PROTECTED]>

	* conf/powerpc-ieee1275.rmk (grub_mkimage_SOURCES): Replace reference
	to util/powerpc/ieee1275/grub-mkimage.c with util/elf/grub-mkimage.c.

	* include/grub/powerpc/ieee1275/kernel.h: Rename
	GRUB_IEEE1275_MOD_ALIGN to GRUB_MOD_ALIGN.
	* kern/powerpc/ieee1275/init.c: Replace GRUB_IEEE1275_MOD_ALIGN with
	GRUB_MOD_ALIGN.
	* util/elf/grub-mkimage.c: Replace GRUB_IEEE1275_MOD_ALIGN with
	GRUB_MOD_ALIGN.  Remove all use of endian conversion macros, since
	they break LE platforms and grub-mkimage is only meant for native
	use anyway.

2007-10-01  Robert Millan  <[EMAIL PROTECTED]>

	* util/powerpc/ieee1275/grub-mkimage.c: Moved to ...
	* util/elf/grub-mkimage.c: ... here.

Index: conf/powerpc-ieee1275.rmk
===================================================================
RCS file: /sources/grub/grub2/conf/powerpc-ieee1275.rmk,v
retrieving revision 1.71
diff -u -r1.71 powerpc-ieee1275.rmk
--- conf/powerpc-ieee1275.rmk	29 Aug 2007 10:39:42 -0000	1.71
+++ conf/powerpc-ieee1275.rmk	1 Oct 2007 14:38:31 -0000
@@ -32,7 +32,7 @@
 endif
  
 # For grub-mkimage.
-grub_mkimage_SOURCES = util/powerpc/ieee1275/grub-mkimage.c util/misc.c \
+grub_mkimage_SOURCES = util/elf/grub-mkimage.c util/misc.c \
         util/resolve.c 
 
 # For grub-mkdevicemap.
Index: include/grub/powerpc/ieee1275/kernel.h
===================================================================
RCS file: /sources/grub/grub2/include/grub/powerpc/ieee1275/kernel.h,v
retrieving revision 1.6
diff -u -r1.6 kernel.h
--- include/grub/powerpc/ieee1275/kernel.h	21 Jul 2007 23:32:24 -0000	1.6
+++ include/grub/powerpc/ieee1275/kernel.h	1 Oct 2007 14:38:31 -0000
@@ -21,7 +21,7 @@
 
 #include <grub/symbol.h>
 
-#define GRUB_IEEE1275_MOD_ALIGN 0x1000
+#define GRUB_MOD_ALIGN 0x1000
 
 void EXPORT_FUNC (grub_reboot) (void);
 void EXPORT_FUNC (grub_halt) (void);
Index: kern/powerpc/ieee1275/init.c
===================================================================
RCS file: /sources/grub/grub2/kern/powerpc/ieee1275/init.c,v
retrieving revision 1.31
diff -u -r1.31 init.c
--- kern/powerpc/ieee1275/init.c	21 Jul 2007 23:32:27 -0000	1.31
+++ kern/powerpc/ieee1275/init.c	1 Oct 2007 14:38:31 -0000
@@ -205,5 +205,5 @@
 grub_addr_t
 grub_arch_modules_addr (void)
 {
-  return ALIGN_UP(_end, GRUB_IEEE1275_MOD_ALIGN);
+  return ALIGN_UP(_end, GRUB_MOD_ALIGN);
 }
Index: util/powerpc/ieee1275/grub-mkimage.c
===================================================================
RCS file: /sources/grub/grub2/util/powerpc/ieee1275/grub-mkimage.c,v
retrieving revision 1.9
diff -u -r1.9 grub-mkimage.c
--- util/powerpc/ieee1275/grub-mkimage.c	21 Jul 2007 23:32:32 -0000	1.9
+++ util/powerpc/ieee1275/grub-mkimage.c	1 Oct 2007 14:38:31 -0000
@@ -70,28 +70,27 @@
 
   grub_util_info ("adding CHRP NOTE segment");
 
-  note.header.namesz = grub_cpu_to_be32 (sizeof (GRUB_IEEE1275_NOTE_NAME));
-  note.header.descsz = grub_cpu_to_be32 (note_size);
-  note.header.type = grub_cpu_to_be32 (GRUB_IEEE1275_NOTE_TYPE);
+  note.header.namesz = sizeof (GRUB_IEEE1275_NOTE_NAME);
+  note.header.descsz = note_size;
+  note.header.type = GRUB_IEEE1275_NOTE_TYPE;
   strcpy (note.header.name, GRUB_IEEE1275_NOTE_NAME);
-  note.descriptor.real_mode = grub_cpu_to_be32 (0xffffffff);
-  note.descriptor.real_base = grub_cpu_to_be32 (0x00c00000);
-  note.descriptor.real_size = grub_cpu_to_be32 (0xffffffff);
-  note.descriptor.virt_base = grub_cpu_to_be32 (0xffffffff);
-  note.descriptor.virt_size = grub_cpu_to_be32 (0xffffffff);
-  note.descriptor.load_base = grub_cpu_to_be32 (0x00004000);
+  note.descriptor.real_mode = 0xffffffff;
+  note.descriptor.real_base = 0x00c00000;
+  note.descriptor.real_size = 0xffffffff;
+  note.descriptor.virt_base = 0xffffffff;
+  note.descriptor.virt_size = 0xffffffff;
+  note.descriptor.load_base = 0x00004000;
 
   /* Write the note data to the new segment.  */
-  grub_util_write_image_at (&note, note_size,
-			    grub_be_to_cpu32 (phdr->p_offset), out);
+  grub_util_write_image_at (&note, note_size, phdr->p_offset, out);
 
   /* Fill in the rest of the segment header.  */
-  phdr->p_type = grub_cpu_to_be32 (PT_NOTE);
-  phdr->p_flags = grub_cpu_to_be32 (PF_R);
-  phdr->p_align = grub_cpu_to_be32 (sizeof (long));
+  phdr->p_type = PT_NOTE;
+  phdr->p_flags = PF_R;
+  phdr->p_align = sizeof (long);
   phdr->p_vaddr = 0;
   phdr->p_paddr = 0;
-  phdr->p_filesz = grub_cpu_to_be32 (note_size);
+  phdr->p_filesz = note_size;
   phdr->p_memsz = 0;
 }
 
@@ -120,9 +119,9 @@
 
   module_img = xmalloc (total_module_size);
   modinfo = (struct grub_module_info *) module_img;
-  modinfo->magic = grub_cpu_to_be32 (GRUB_MODULE_MAGIC);
-  modinfo->offset = grub_cpu_to_be32 (sizeof (struct grub_module_info));
-  modinfo->size = grub_cpu_to_be32 (total_module_size);
+  modinfo->magic = GRUB_MODULE_MAGIC;
+  modinfo->offset = sizeof (struct grub_module_info);
+  modinfo->size = total_module_size;
 
   /* Load all the modules, with headers, into module_img.  */
   for (p = path_list; p; p = p->next)
@@ -135,8 +134,8 @@
       mod_size = grub_util_get_image_size (p->name);
 
       header = (struct grub_module_header *) (module_img + offset);
-      header->offset = grub_cpu_to_be32 (sizeof (*header));
-      header->size = grub_cpu_to_be32 (mod_size + sizeof (*header));
+      header->offset = sizeof (*header);
+      header->size = mod_size + sizeof (*header);
 
       grub_util_load_image (p->name, module_img + offset + sizeof (*header));
 
@@ -144,17 +143,16 @@
     }
 
   /* Write the module data to the new segment.  */
-  grub_util_write_image_at (module_img, total_module_size,
-			    grub_cpu_to_be32 (phdr->p_offset), out);
+  grub_util_write_image_at (module_img, total_module_size, phdr->p_offset, out);
 
   /* Fill in the rest of the segment header.  */
-  phdr->p_type = grub_cpu_to_be32 (PT_LOAD);
-  phdr->p_flags = grub_cpu_to_be32 (PF_R | PF_W | PF_X);
-  phdr->p_align = grub_cpu_to_be32 (sizeof (long));
-  phdr->p_vaddr = grub_cpu_to_be32 (modbase);
-  phdr->p_paddr = grub_cpu_to_be32 (modbase);
-  phdr->p_filesz = grub_cpu_to_be32 (total_module_size);
-  phdr->p_memsz = grub_cpu_to_be32 (total_module_size);
+  phdr->p_type = PT_LOAD;
+  phdr->p_flags = PF_R | PF_W | PF_X;
+  phdr->p_align = sizeof (long);
+  phdr->p_vaddr = modbase;
+  phdr->p_paddr = modbase;
+  phdr->p_filesz = total_module_size;
+  phdr->p_memsz = total_module_size;
 }
 
 void
@@ -177,10 +175,10 @@
 
   grub_util_read_at (&ehdr, sizeof (ehdr), 0, in);
   
-  phdrs = xmalloc (grub_be_to_cpu16 (ehdr.e_phentsize)
-		   * (grub_be_to_cpu16 (ehdr.e_phnum) + 2));
+  phdrs = xmalloc (ehdr.e_phentsize
+		   * (ehdr.e_phnum + 2));
   /* Copy all existing segments.  */
-  for (i = 0; i < grub_be_to_cpu16 (ehdr.e_phnum); i++)
+  for (i = 0; i < ehdr.e_phnum; i++)
     {
       char *segment_img;
       grub_size_t segment_end;
@@ -189,26 +187,22 @@
 
       /* Read segment header.  */
       grub_util_read_at (phdr, sizeof (Elf32_Phdr),
-			 (grub_be_to_cpu32 (ehdr.e_phoff)
-			  + (i * grub_be_to_cpu16 (ehdr.e_phentsize))),
-			 in);
-      grub_util_info ("copying segment %d, type %d", i,
-		      grub_be_to_cpu32 (phdr->p_type));
+			 (ehdr.e_phoff + (i * ehdr.e_phentsize)), in);
+      grub_util_info ("copying segment %d, type %d", i, phdr->p_type);
 
       /* Locate _end.  */
-      segment_end = grub_be_to_cpu32 (phdr->p_paddr)
-		    + grub_be_to_cpu32 (phdr->p_memsz);
+      segment_end = phdr->p_paddr
+		    + phdr->p_memsz;
       grub_util_info ("segment %u end 0x%lx", i, segment_end);
       if (segment_end > grub_end)
 	grub_end = segment_end;
 
       /* Read segment data and write it to new file.  */
-      segment_img = xmalloc (grub_be_to_cpu32 (phdr->p_filesz));
+      segment_img = xmalloc (phdr->p_filesz);
   
-      grub_util_read_at (segment_img, grub_be_to_cpu32 (phdr->p_filesz),
-			 grub_be_to_cpu32 (phdr->p_offset), in);
-      grub_util_write_image_at (segment_img, grub_be_to_cpu32 (phdr->p_filesz),
-				grub_be_to_cpu32 (phdr->p_offset), out);
+      grub_util_read_at (segment_img, phdr->p_filesz, phdr->p_offset, in);
+      grub_util_write_image_at (segment_img, phdr->p_filesz,
+				phdr->p_offset, out);
 
       free (segment_img);
     }
@@ -218,15 +212,14 @@
       grub_addr_t modbase;
 
       /* Place modules just after grub segment.  */
-      modbase = ALIGN_UP(grub_end, GRUB_IEEE1275_MOD_ALIGN);
+      modbase = ALIGN_UP(grub_end, GRUB_MOD_ALIGN);
 
       /* Construct new segment header for modules.  */
-      phdr = phdrs + grub_be_to_cpu16 (ehdr.e_phnum);
-      ehdr.e_phnum = grub_cpu_to_be16 (grub_be_to_cpu16 (ehdr.e_phnum) + 1);
+      phdr = phdrs + ehdr.e_phnum;
+      ehdr.e_phnum = ehdr.e_phnum + 1;
 
       /* Fill in p_offset so the callees know where to write.  */
-      phdr->p_offset = grub_cpu_to_be32 (ALIGN_UP (grub_util_get_fp_size (out),
-						   sizeof (long)));
+      phdr->p_offset = ALIGN_UP (grub_util_get_fp_size (out), sizeof (long));
 
       load_modules (modbase, phdr, dir, mods, out);
     }
@@ -234,12 +227,11 @@
   if (chrp)
     {
       /* Construct new segment header for the CHRP note.  */
-      phdr = phdrs + grub_be_to_cpu16 (ehdr.e_phnum);
-      ehdr.e_phnum = grub_cpu_to_be16 (grub_be_to_cpu16 (ehdr.e_phnum) + 1);
+      phdr = phdrs + ehdr.e_phnum;
+      ehdr.e_phnum = ehdr.e_phnum + 1;
 
       /* Fill in p_offset so the callees know where to write.  */
-      phdr->p_offset = grub_cpu_to_be32 (ALIGN_UP (grub_util_get_fp_size (out),
-						   sizeof (long)));
+      phdr->p_offset = ALIGN_UP (grub_util_get_fp_size (out), sizeof (long));
 
       load_note (phdr, out);
     }
@@ -251,12 +243,11 @@
 
   /* Append entire segment table to the file.  */
   phdroff = ALIGN_UP (grub_util_get_fp_size (out), sizeof (long));
-  grub_util_write_image_at (phdrs, grub_be_to_cpu16 (ehdr.e_phentsize)
-			    * grub_be_to_cpu16 (ehdr.e_phnum), phdroff,
-			    out);
+  grub_util_write_image_at (phdrs, ehdr.e_phentsize *
+				   ehdr.e_phnum, phdroff, out);
 
   /* Write ELF header.  */
-  ehdr.e_phoff = grub_cpu_to_be32 (phdroff);
+  ehdr.e_phoff = phdroff;
   grub_util_write_image_at (&ehdr, sizeof (ehdr), 0, out);
 
   free (phdrs);
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to