diff -rupN powerpc/ieee1275/grub-mkimage.c sparc64/ieee1275/grub-mkimage.c --- powerpc/ieee1275/grub-mkimage.c 2005-07-03 11:34:45.000000000 +0200 +++ sparc64/ieee1275/grub-mkimage.c 2005-07-12 19:14:58.000000000 +0200 @@ -34,7 +34,7 @@ static char *kernel_path = "grubof"; -#define GRUB_IEEE1275_NOTE_NAME "PowerPC" +#define GRUB_IEEE1275_NOTE_NAME "Sparc64" #define GRUB_IEEE1275_NOTE_TYPE 0x1275 /* These structures are defined according to the CHRP binding to IEEE1275, @@ -42,20 +42,20 @@ static char *kernel_path = "grubof"; struct grub_ieee1275_note_hdr { - grub_uint32_t namesz; - grub_uint32_t descsz; - grub_uint32_t type; + grub_uint64_t namesz; + grub_uint64_t descsz; + grub_uint64_t type; char name[sizeof (GRUB_IEEE1275_NOTE_NAME)]; }; struct grub_ieee1275_note_desc { - grub_uint32_t real_mode; - grub_uint32_t real_base; - grub_uint32_t real_size; - grub_uint32_t virt_base; - grub_uint32_t virt_size; - grub_uint32_t load_base; + grub_uint64_t real_mode; + grub_uint64_t real_base; + grub_uint64_t real_size; + grub_uint64_t virt_base; + grub_uint64_t virt_size; + grub_uint64_t load_base; }; struct grub_ieee1275_note @@ -65,40 +65,40 @@ struct grub_ieee1275_note }; void -load_note (Elf32_Phdr *phdr, FILE *out) +load_note (Elf64_Phdr *phdr, FILE *out) { struct grub_ieee1275_note note; int note_size = sizeof (struct grub_ieee1275_note); 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 = grub_cpu_to_be64 (sizeof (GRUB_IEEE1275_NOTE_NAME)); + note.header.descsz = grub_cpu_to_be64 (note_size); + note.header.type = grub_cpu_to_be64 (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 = grub_cpu_to_be64 (0xffffffff); + note.descriptor.real_base = grub_cpu_to_be64 (0x00c00000); + note.descriptor.real_size = grub_cpu_to_be64 (0xffffffff); + note.descriptor.virt_base = grub_cpu_to_be64 (0xffffffff); + note.descriptor.virt_size = grub_cpu_to_be64 (0xffffffff); + note.descriptor.load_base = grub_cpu_to_be64 (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_be_to_cpu64 (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 = grub_cpu_to_be64 (PT_NOTE); + phdr->p_flags = grub_cpu_to_be64 (PF_R); + phdr->p_align = grub_cpu_to_be64 (sizeof (long)); phdr->p_vaddr = 0; phdr->p_paddr = 0; - phdr->p_filesz = grub_cpu_to_be32 (note_size); + phdr->p_filesz = grub_cpu_to_be64 (note_size); phdr->p_memsz = 0; } void -load_modules (Elf32_Phdr *phdr, const char *dir, char *mods[], FILE *out) +load_modules (Elf64_Phdr *phdr, const char *dir, char *mods[], FILE *out) { char *module_img; struct grub_util_path_list *path_list; @@ -121,9 +121,9 @@ load_modules (Elf32_Phdr *phdr, const ch 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_cpu_to_be64 (GRUB_MODULE_MAGIC); + modinfo->offset = grub_cpu_to_be64 (sizeof (struct grub_module_info)); + modinfo->size = grub_cpu_to_be64 (total_module_size); /* Load all the modules, with headers, into module_img. */ for (p = path_list; p; p = p->next) @@ -136,8 +136,8 @@ load_modules (Elf32_Phdr *phdr, const ch 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 = grub_cpu_to_be64 (sizeof (*header)); + header->size = grub_cpu_to_be64 (mod_size + sizeof (*header)); grub_util_load_image (p->name, module_img + offset + sizeof (*header)); @@ -146,24 +146,24 @@ load_modules (Elf32_Phdr *phdr, const ch /* 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_cpu_to_be64 (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 (GRUB_IEEE1275_MODULE_BASE); - phdr->p_paddr = grub_cpu_to_be32 (GRUB_IEEE1275_MODULE_BASE); - phdr->p_filesz = grub_cpu_to_be32 (total_module_size); - phdr->p_memsz = grub_cpu_to_be32 (total_module_size); + phdr->p_type = grub_cpu_to_be64 (PT_LOAD); + phdr->p_flags = grub_cpu_to_be64 (PF_R | PF_W | PF_X); + phdr->p_align = grub_cpu_to_be64 (sizeof (long)); + phdr->p_vaddr = grub_cpu_to_be64 (GRUB_IEEE1275_MODULE_BASE); + phdr->p_paddr = grub_cpu_to_be64 (GRUB_IEEE1275_MODULE_BASE); + phdr->p_filesz = grub_cpu_to_be64 (total_module_size); + phdr->p_memsz = grub_cpu_to_be64 (total_module_size); } void add_segments (char *dir, FILE *out, int chrp, char *mods[]) { - Elf32_Ehdr ehdr; - Elf32_Phdr *phdrs = NULL; - Elf32_Phdr *phdr; + Elf64_Ehdr ehdr; + Elf64_Phdr *phdrs = NULL; + Elf64_Phdr *phdr; FILE *in; off_t phdroff; int i; @@ -185,20 +185,20 @@ add_segments (char *dir, FILE *out, int phdr = phdrs + i; /* Read segment header. */ - grub_util_read_at (phdr, sizeof (Elf32_Phdr), - (grub_be_to_cpu32 (ehdr.e_phoff) + grub_util_read_at (phdr, sizeof (Elf64_Phdr), + (grub_be_to_cpu64 (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)); + grub_be_to_cpu64 (phdr->p_type)); /* Read segment data and write it to new file. */ - segment_img = xmalloc (grub_be_to_cpu32 (phdr->p_filesz)); + segment_img = xmalloc (grub_be_to_cpu64 (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, grub_be_to_cpu64 (phdr->p_filesz), + grub_be_to_cpu64 (phdr->p_offset), in); + grub_util_write_image_at (segment_img, grub_be_to_cpu64 (phdr->p_filesz), + grub_be_to_cpu64 (phdr->p_offset), out); free (segment_img); } @@ -210,7 +210,7 @@ add_segments (char *dir, FILE *out, int ehdr.e_phnum = grub_cpu_to_be16 (grub_be_to_cpu16 (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), + phdr->p_offset = grub_cpu_to_be64 (ALIGN_UP (grub_util_get_fp_size (out), sizeof (long))); load_modules (phdr, dir, mods, out); @@ -223,7 +223,7 @@ add_segments (char *dir, FILE *out, int ehdr.e_phnum = grub_cpu_to_be16 (grub_be_to_cpu16 (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), + phdr->p_offset = grub_cpu_to_be64 (ALIGN_UP (grub_util_get_fp_size (out), sizeof (long))); load_note (phdr, out); @@ -241,7 +241,7 @@ add_segments (char *dir, FILE *out, int out); /* Write ELF header. */ - ehdr.e_phoff = grub_cpu_to_be32 (phdroff); + ehdr.e_phoff = grub_cpu_to_be64 (phdroff); grub_util_write_image_at (&ehdr, sizeof (ehdr), 0, out); free (phdrs);