54
64
IMAGE_I386_PC, IMAGE_EFI, IMAGE_COREBOOT,
55
65
IMAGE_SPARC64_AOUT, IMAGE_SPARC64_RAW, IMAGE_I386_IEEE1275,
56
IMAGE_YEELOONG_ELF, IMAGE_QEMU, IMAGE_PPC, IMAGE_YEELOONG_FLASH
66
IMAGE_YEELOONG_ELF, IMAGE_QEMU, IMAGE_PPC, IMAGE_YEELOONG_FLASH,
60
71
PLATFORM_FLAGS_NONE = 0,
61
PLATFORM_FLAGS_LZMA = 1
72
PLATFORM_FLAGS_LZMA = 1,
73
PLATFORM_FLAGS_DECOMPRESSORS = 2
66
78
unsigned total_module_size;
67
79
unsigned kernel_image_size;
84
97
.id = IMAGE_COREBOOT,
85
98
.flags = PLATFORM_FLAGS_NONE,
86
99
.prefix = GRUB_KERNEL_I386_COREBOOT_PREFIX,
87
.data_end = GRUB_KERNEL_I386_COREBOOT_DATA_END,
100
.prefix_end = GRUB_KERNEL_I386_COREBOOT_PREFIX_END,
89
102
.total_module_size = TARGET_NO_FIELD,
90
103
.kernel_image_size = TARGET_NO_FIELD,
106
119
.id = IMAGE_COREBOOT,
107
120
.flags = PLATFORM_FLAGS_NONE,
108
.prefix = GRUB_KERNEL_I386_COREBOOT_PREFIX,
109
.data_end = GRUB_KERNEL_I386_COREBOOT_DATA_END,
121
.prefix = GRUB_KERNEL_I386_MULTIBOOT_PREFIX,
122
.prefix_end = GRUB_KERNEL_I386_MULTIBOOT_PREFIX_END,
111
124
.total_module_size = TARGET_NO_FIELD,
112
125
.kernel_image_size = TARGET_NO_FIELD,
128
141
.id = IMAGE_I386_PC,
129
142
.flags = PLATFORM_FLAGS_LZMA,
130
143
.prefix = GRUB_KERNEL_I386_PC_PREFIX,
131
.data_end = GRUB_KERNEL_I386_PC_DATA_END,
144
.prefix_end = GRUB_KERNEL_I386_PC_PREFIX_END,
145
.raw_size = GRUB_KERNEL_I386_PC_RAW_SIZE,
146
.total_module_size = GRUB_KERNEL_I386_PC_TOTAL_MODULE_SIZE,
147
.kernel_image_size = GRUB_KERNEL_I386_PC_KERNEL_IMAGE_SIZE,
148
.compressed_size = GRUB_KERNEL_I386_PC_COMPRESSED_SIZE,
151
.install_dos_part = GRUB_KERNEL_I386_PC_INSTALL_DOS_PART,
152
.install_bsd_part = GRUB_KERNEL_I386_PC_INSTALL_BSD_PART,
153
.link_addr = GRUB_KERNEL_I386_PC_LINK_ADDR
156
.name = "i386-pc-pxe",
159
.id = IMAGE_I386_PC_PXE,
160
.flags = PLATFORM_FLAGS_LZMA,
161
.prefix = GRUB_KERNEL_I386_PC_PREFIX,
162
.prefix_end = GRUB_KERNEL_I386_PC_PREFIX_END,
132
163
.raw_size = GRUB_KERNEL_I386_PC_RAW_SIZE,
133
164
.total_module_size = GRUB_KERNEL_I386_PC_TOTAL_MODULE_SIZE,
134
165
.kernel_image_size = GRUB_KERNEL_I386_PC_KERNEL_IMAGE_SIZE,
147
178
.flags = PLATFORM_FLAGS_NONE,
148
179
.prefix = GRUB_KERNEL_I386_EFI_PREFIX,
149
.data_end = GRUB_KERNEL_I386_EFI_DATA_END,
180
.prefix_end = GRUB_KERNEL_I386_EFI_PREFIX_END,
151
182
.total_module_size = TARGET_NO_FIELD,
152
183
.kernel_image_size = TARGET_NO_FIELD,
168
199
.id = IMAGE_I386_IEEE1275,
169
200
.flags = PLATFORM_FLAGS_NONE,
170
201
.prefix = GRUB_KERNEL_I386_IEEE1275_PREFIX,
171
.data_end = GRUB_KERNEL_I386_IEEE1275_DATA_END,
202
.prefix_end = GRUB_KERNEL_I386_IEEE1275_PREFIX_END,
173
204
.total_module_size = TARGET_NO_FIELD,
174
205
.kernel_image_size = TARGET_NO_FIELD,
190
221
.id = IMAGE_QEMU,
191
222
.flags = PLATFORM_FLAGS_NONE,
192
223
.prefix = GRUB_KERNEL_I386_QEMU_PREFIX,
193
.data_end = GRUB_KERNEL_I386_QEMU_DATA_END,
224
.prefix_end = GRUB_KERNEL_I386_QEMU_PREFIX_END,
195
226
.total_module_size = TARGET_NO_FIELD,
196
227
.compressed_size = TARGET_NO_FIELD,
209
240
.flags = PLATFORM_FLAGS_NONE,
210
241
.prefix = GRUB_KERNEL_X86_64_EFI_PREFIX,
211
.data_end = GRUB_KERNEL_X86_64_EFI_DATA_END,
242
.prefix_end = GRUB_KERNEL_X86_64_EFI_PREFIX_END,
213
244
.total_module_size = TARGET_NO_FIELD,
214
245
.kernel_image_size = TARGET_NO_FIELD,
228
259
.voidp_sizeof = 4,
230
261
.id = IMAGE_YEELOONG_FLASH,
231
.flags = PLATFORM_FLAGS_NONE,
262
.flags = PLATFORM_FLAGS_DECOMPRESSORS,
232
263
.prefix = GRUB_KERNEL_MIPS_YEELOONG_PREFIX,
233
.data_end = GRUB_KERNEL_MIPS_YEELOONG_DATA_END,
234
.raw_size = GRUB_KERNEL_MIPS_YEELOONG_RAW_SIZE,
264
.prefix_end = GRUB_KERNEL_MIPS_YEELOONG_PREFIX_END,
235
266
.total_module_size = GRUB_KERNEL_MIPS_YEELOONG_TOTAL_MODULE_SIZE,
236
.compressed_size = GRUB_KERNEL_MIPS_YEELOONG_COMPRESSED_SIZE,
237
.kernel_image_size = GRUB_KERNEL_MIPS_YEELOONG_KERNEL_IMAGE_SIZE,
267
.compressed_size = TARGET_NO_FIELD,
268
.kernel_image_size = TARGET_NO_FIELD,
238
269
.section_align = 1,
239
270
.vaddr_offset = 0,
240
271
.install_dos_part = TARGET_NO_FIELD,
241
272
.install_bsd_part = TARGET_NO_FIELD,
242
273
.link_addr = GRUB_KERNEL_MIPS_YEELOONG_LINK_ADDR,
243
274
.elf_target = EM_MIPS,
244
.link_align = GRUB_KERNEL_MIPS_YEELOONG_LINK_ALIGN
275
.link_align = GRUB_KERNEL_MIPS_YEELOONG_LINK_ALIGN,
276
.default_compression = COMPRESSION_NONE
247
279
.name = "mipsel-yeeloong-elf",
248
280
.voidp_sizeof = 4,
250
282
.id = IMAGE_YEELOONG_ELF,
251
.flags = PLATFORM_FLAGS_NONE,
283
.flags = PLATFORM_FLAGS_DECOMPRESSORS,
252
284
.prefix = GRUB_KERNEL_MIPS_YEELOONG_PREFIX,
253
.data_end = GRUB_KERNEL_MIPS_YEELOONG_DATA_END,
254
.raw_size = GRUB_KERNEL_MIPS_YEELOONG_RAW_SIZE,
285
.prefix_end = GRUB_KERNEL_MIPS_YEELOONG_PREFIX_END,
255
287
.total_module_size = GRUB_KERNEL_MIPS_YEELOONG_TOTAL_MODULE_SIZE,
256
.compressed_size = GRUB_KERNEL_MIPS_YEELOONG_COMPRESSED_SIZE,
257
.kernel_image_size = GRUB_KERNEL_MIPS_YEELOONG_KERNEL_IMAGE_SIZE,
288
.compressed_size = TARGET_NO_FIELD,
289
.kernel_image_size = TARGET_NO_FIELD,
258
290
.section_align = 1,
259
291
.vaddr_offset = 0,
260
292
.install_dos_part = TARGET_NO_FIELD,
261
293
.install_bsd_part = TARGET_NO_FIELD,
262
294
.link_addr = GRUB_KERNEL_MIPS_YEELOONG_LINK_ADDR,
263
295
.elf_target = EM_MIPS,
264
.link_align = GRUB_KERNEL_MIPS_YEELOONG_LINK_ALIGN
296
.link_align = GRUB_KERNEL_MIPS_YEELOONG_LINK_ALIGN,
297
.default_compression = COMPRESSION_NONE
267
300
.name = "powerpc-ieee1275",
271
304
.flags = PLATFORM_FLAGS_NONE,
272
305
.prefix = GRUB_KERNEL_POWERPC_IEEE1275_PREFIX,
273
.data_end = GRUB_KERNEL_POWERPC_IEEE1275_DATA_END,
306
.prefix_end = GRUB_KERNEL_POWERPC_IEEE1275_PREFIX_END,
275
308
.total_module_size = TARGET_NO_FIELD,
276
309
.kernel_image_size = TARGET_NO_FIELD,
292
325
.id = IMAGE_SPARC64_RAW,
293
326
.flags = PLATFORM_FLAGS_NONE,
294
327
.prefix = GRUB_KERNEL_SPARC64_IEEE1275_PREFIX,
295
.data_end = GRUB_KERNEL_SPARC64_IEEE1275_DATA_END,
328
.prefix_end = GRUB_KERNEL_SPARC64_IEEE1275_PREFIX_END,
296
329
.raw_size = GRUB_KERNEL_SPARC64_IEEE1275_RAW_SIZE,
297
330
.total_module_size = GRUB_KERNEL_SPARC64_IEEE1275_TOTAL_MODULE_SIZE,
298
331
.kernel_image_size = GRUB_KERNEL_SPARC64_IEEE1275_KERNEL_IMAGE_SIZE,
310
343
.id = IMAGE_SPARC64_AOUT,
311
344
.flags = PLATFORM_FLAGS_NONE,
312
345
.prefix = GRUB_KERNEL_SPARC64_IEEE1275_PREFIX,
313
.data_end = GRUB_KERNEL_SPARC64_IEEE1275_DATA_END,
346
.prefix_end = GRUB_KERNEL_SPARC64_IEEE1275_PREFIX_END,
314
347
.raw_size = GRUB_KERNEL_SPARC64_IEEE1275_RAW_SIZE,
315
348
.total_module_size = GRUB_KERNEL_SPARC64_IEEE1275_TOTAL_MODULE_SIZE,
316
349
.kernel_image_size = GRUB_KERNEL_SPARC64_IEEE1275_KERNEL_IMAGE_SIZE,
473
506
*core_size += raw_size;
511
compress_kernel_xz (char *kernel_img, size_t kernel_size,
512
char **core_img, size_t *core_size, size_t raw_size)
514
lzma_stream strm = LZMA_STREAM_INIT;
516
lzma_options_lzma lzopts = {
517
.dict_size = 1 << 16,
519
.preset_dict_size = 0,
523
.mode = LZMA_MODE_NORMAL,
528
lzma_filter fltrs[] = {
529
{ .id = LZMA_FILTER_LZMA2, .options = &lzopts},
530
{ .id = LZMA_VLI_UNKNOWN, .options = NULL}
533
if (kernel_size < raw_size)
534
grub_util_error (_("the core image is too small"));
536
xzret = lzma_stream_encoder (&strm, fltrs, LZMA_CHECK_NONE);
537
if (xzret != LZMA_OK)
538
grub_util_error (_("cannot compress the kernel image"));
540
*core_img = xmalloc (kernel_size);
541
memcpy (*core_img, kernel_img, raw_size);
543
*core_size = kernel_size - raw_size;
544
strm.next_in = (unsigned char *) kernel_img + raw_size;
545
strm.avail_in = kernel_size - raw_size;
546
strm.next_out = (unsigned char *) *core_img + raw_size;
547
strm.avail_out = *core_size;
551
xzret = lzma_code (&strm, LZMA_FINISH);
552
if (xzret == LZMA_OK)
554
if (xzret == LZMA_STREAM_END)
556
grub_util_error (_("cannot compress the kernel image"));
559
*core_size -= strm.avail_out;
561
*core_size += raw_size;
477
566
compress_kernel (struct image_target_desc *image_target, char *kernel_img,
478
size_t kernel_size, char **core_img, size_t *core_size)
567
size_t kernel_size, char **core_img, size_t *core_size,
568
grub_compression_t comp)
480
570
if (image_target->flags & PLATFORM_FLAGS_LZMA)
578
if (image_target->flags & PLATFORM_FLAGS_DECOMPRESSORS
579
&& (comp == COMPRESSION_XZ))
581
compress_kernel_xz (kernel_img, kernel_size, core_img,
582
core_size, image_target->raw_size);
587
if (image_target->flags & PLATFORM_FLAGS_DECOMPRESSORS
588
&& (comp != COMPRESSION_NONE))
589
grub_util_error ("unknown compression %d\n", comp);
487
591
*core_img = xmalloc (kernel_size);
488
592
memcpy (*core_img, kernel_img, kernel_size);
489
593
*core_size = kernel_size;
508
612
generate_image (const char *dir, char *prefix, FILE *out, char *mods[],
509
char *memdisk_path, char *font_path, char *config_path,
510
struct image_target_desc *image_target, int note)
613
char *memdisk_path, char *config_path,
614
struct image_target_desc *image_target, int note,
615
grub_compression_t comp)
512
617
char *kernel_img, *core_img;
513
618
size_t kernel_size, total_module_size, core_size, exec_size;
514
size_t memdisk_size = 0, font_size = 0, config_size = 0, config_size_pure = 0;
619
size_t memdisk_size = 0, config_size = 0, config_size_pure = 0;
515
620
char *kernel_path;
517
622
struct grub_util_path_list *path_list, *p, *next;
519
624
grub_uint64_t start_address;
520
625
void *rel_section;
521
626
grub_size_t reloc_size, align;
628
if (comp == COMPRESSION_AUTO)
629
comp = image_target->default_compression;
522
631
path_list = grub_util_resolve_dependencies (dir, "moddep.lst", mods);
524
633
kernel_path = grub_util_get_path (dir, "kernel.img");
564
667
total_module_size, &start_address, &rel_section,
565
668
&reloc_size, &align, image_target);
567
if (image_target->prefix + strlen (prefix) + 1 > image_target->data_end)
670
if (image_target->prefix + strlen (prefix) + 1 > image_target->prefix_end)
568
671
grub_util_error (_("prefix is too long"));
569
672
strcpy (kernel_img + image_target->prefix, prefix);
624
727
offset += memdisk_size;
629
struct grub_module_header *header;
631
header = (struct grub_module_header *) (kernel_img + offset);
632
memset (header, 0, sizeof (struct grub_module_header));
633
header->type = grub_host_to_target32 (OBJ_TYPE_FONT);
634
header->size = grub_host_to_target32 (font_size + sizeof (*header));
635
offset += sizeof (*header);
637
grub_util_load_image (font_path, kernel_img + offset);
643
732
struct grub_module_header *header;
653
742
offset += config_size;
745
if ((image_target->flags & PLATFORM_FLAGS_DECOMPRESSORS)
746
&& (image_target->total_module_size != TARGET_NO_FIELD))
747
*((grub_uint32_t *) (kernel_img + image_target->total_module_size))
748
= grub_host_to_target32 (total_module_size);
656
750
grub_util_info ("kernel_img=%p, kernel_size=0x%x", kernel_img, kernel_size);
657
751
compress_kernel (image_target, kernel_img, kernel_size + total_module_size,
658
&core_img, &core_size);
752
&core_img, &core_size, comp);
660
754
grub_util_info ("the core size is 0x%x", core_size);
662
if (image_target->total_module_size != TARGET_NO_FIELD)
756
if (!(image_target->flags & PLATFORM_FLAGS_DECOMPRESSORS)
757
&& image_target->total_module_size != TARGET_NO_FIELD)
663
758
*((grub_uint32_t *) (core_img + image_target->total_module_size))
664
759
= grub_host_to_target32 (total_module_size);
665
760
if (image_target->kernel_image_size != TARGET_NO_FIELD)
680
775
= grub_host_to_target32 (-2);
778
if (image_target->flags & PLATFORM_FLAGS_DECOMPRESSORS)
782
char *decompress_path, *decompress_img;
783
size_t decompress_size;
789
name = "xz_decompress.img";
791
case COMPRESSION_NONE:
792
name = "none_decompress.img";
795
grub_util_error ("unknown compression %d\n", comp);
798
decompress_path = grub_util_get_path (dir, name);
799
decompress_size = grub_util_get_image_size (decompress_path);
800
decompress_img = grub_util_read_image (decompress_path);
802
*((grub_uint32_t *) (decompress_img + GRUB_KERNEL_MIPS_YEELOONG_COMPRESSED_SIZE))
803
= grub_host_to_target32 (core_size);
805
*((grub_uint32_t *) (decompress_img + GRUB_KERNEL_MIPS_YEELOONG_UNCOMPRESSED_SIZE))
806
= grub_host_to_target32 (kernel_size + total_module_size);
808
full_size = core_size + decompress_size;
810
full_img = xmalloc (full_size);
811
memset (full_img, 0, full_size);
813
memcpy (full_img, decompress_img, decompress_size);
815
memcpy (full_img + decompress_size, core_img, core_size);
817
memset (full_img + decompress_size + core_size, 0,
818
full_size - (decompress_size + core_size));
822
core_size = full_size;
683
825
switch (image_target->id)
685
827
case IMAGE_I386_PC:
828
case IMAGE_I386_PC_PXE:
688
831
char *boot_path, *boot_img;
697
840
if (num > 0xffff)
698
841
grub_util_error (_("the core image is too big"));
843
if (image_target->id == IMAGE_I386_PC_PXE)
845
char *pxeboot_path, *pxeboot_img;
848
pxeboot_path = grub_util_get_path (dir, "pxeboot.img");
849
pxeboot_size = grub_util_get_image_size (pxeboot_path);
850
pxeboot_img = grub_util_read_image (pxeboot_path);
852
grub_util_write_image (pxeboot_img, pxeboot_size, out);
700
857
boot_path = grub_util_get_path (dir, "diskboot.img");
701
858
boot_size = grub_util_get_image_size (boot_path);
702
859
if (boot_size != GRUB_DISK_SECTOR_SIZE)
1203
1360
{"output", required_argument, 0, 'o'},
1204
1361
{"note", no_argument, 0, 'n'},
1205
1362
{"format", required_argument, 0, 'O'},
1363
{"compression", required_argument, 0, 'C'},
1206
1364
{"help", no_argument, 0, 'h'},
1207
1365
{"version", no_argument, 0, 'V'},
1208
1366
{"verbose", no_argument, 0, 'v'},
1240
1398
-d, --directory=DIR use images and modules under DIR [default=%s/@platform@]\n\
1241
1399
-p, --prefix=DIR set grub_prefix directory [default=%s]\n\
1242
1400
-m, --memdisk=FILE embed FILE as a memdisk image\n\
1243
-f, --font=FILE embed FILE as a boot font\n\
1244
1401
-c, --config=FILE embed FILE as boot config\n\
1245
1402
-n, --note add NOTE segment for CHRP Open Firmware\n\
1246
1403
-o, --output=FILE output a generated image to FILE [default=stdout]\n\
1247
1404
-O, --format=FORMAT generate an image in format\n\
1248
1405
available formats: %s\n\
1406
-C, --compression=(xz|none|auto) choose the compression to use\n\
1249
1407
-h, --help display this message and exit\n\
1250
1408
-V, --version print version information and exit\n\
1251
1409
-v, --verbose print verbose messages\n\
1402
1570
generate_image (dir, prefix ? : DEFAULT_DIRECTORY, fp,
1403
argv + optind, memdisk, font, config,
1404
image_target, note);
1571
argv + optind, memdisk, config,
1572
image_target, note, comp);