From: Robert Millan <rmh@aybabtu.com>
To: The development of GRUB 2 <grub-devel@gnu.org>
Cc: Patrick Georgi <patrick@georgi-clan.de>
Subject: Re: [PATCH] generic ELF version of grub-mkimage
Date: Mon, 1 Oct 2007 16:53:54 +0200 [thread overview]
Message-ID: <20071001145354.GA1483@thorin> (raw)
In-Reply-To: <fb64lu$h0k$1@sea.gmane.org>
[-- Attachment #1: Type: text/plain, Size: 1803 bytes --]
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 <rmh@aybabtu.com>
* 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 <rmh@aybabtu.com>
* 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 /.)
[-- Attachment #2: mkimage.diff --]
[-- Type: text/x-diff, Size: 10207 bytes --]
2007-10-01 Robert Millan <rmh@aybabtu.com>
* 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 <rmh@aybabtu.com>
* 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 (¬e, note_size,
- grub_be_to_cpu32 (phdr->p_offset), out);
+ grub_util_write_image_at (¬e, 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);
next prev parent reply other threads:[~2007-10-01 14:54 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-08-30 10:03 [PATCH] generic ELF version of grub-mkimage Patrick Georgi
2007-10-01 14:53 ` Robert Millan [this message]
2007-10-11 22:58 ` Robert Millan
2007-10-12 10:52 ` Marco Gerards
2007-10-12 15:55 ` Robert Millan
2007-10-12 16:07 ` Robert Millan
2007-11-10 17:29 ` Marco Gerards
2007-11-10 20:12 ` Robert Millan
2007-11-18 11:39 ` Marco Gerards
2007-11-18 11:54 ` Robert Millan
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20071001145354.GA1483@thorin \
--to=rmh@aybabtu.com \
--cc=grub-devel@gnu.org \
--cc=patrick@georgi-clan.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.