/* * Copyright (c) 2008 Vreixo Formoso * Copyright (c) 2012 Thomas Schmitt * * This file is part of the libisofs project; you can redistribute it and/or * modify it under the terms of the GNU General Public License version 2 * or later as published by the Free Software Foundation. * See COPYING file for details. */ /* * Functions for dealing with the system area, this is, the first 16 blocks * of the image. * * At this time, this is only used for hybrid boot images with isolinux. */ #ifndef SYSTEM_AREA_H_ #define SYSTEM_AREA_H_ #include "ecma119.h" /* * Create a MBR for an isohybrid enabled ISOLINUX boot image. * * It is assumed that the caller has verified the readiness of the boot image * by checking for 0xfb 0xc0 0x78 0x70 at bytes 0x40 to 0x43 of isolinux.bin. * * @param bin_lba The predicted LBA of isolinux.bin within the emerging ISO. * @param img_blocks The predicted number of 2048 byte blocks in the ISO. * It will get rounded up to full MBs and that many blocks * must really be written as ISO 9660 image. * @param mbr A buffer of at least 512 bytes to take the result which is * to be written as the very beginning of the ISO. * @param flag unused yet, submit 0 * @return <0 = fatal, 0 = failed , 1 = ok , 2 = ok with size warning */ int make_isohybrid_mbr(int bin_lba, int *img_blocks, char *mbr, int flag); /** * Write the system area for the given image to the given buffer. * * @param buf * A buffer with at least 32 K allocated * @return * 1 if success, < 0 on error */ int iso_write_system_area(Ecma119Image *t, uint8_t *buf); /** * Adjust t->tail_blocks to the eventual alignment needs of isohybrid booting. */ int iso_align_isohybrid(Ecma119Image *t, int flag); /** * Read the necessary ELF information from the first MIPS boot file. * See doc/boot_sectors.txt "DEC Boot Block" for "MIPS Little Endian". */ int iso_read_mipsel_elf(Ecma119Image *t, int flag); /* Compute size and position of appended partitions. */ int iso_compute_append_partitions(Ecma119Image *t, int flag); /* The parameter struct for production of a single Apple Partition Map entry. See also the partial APM description in doc/boot_sectors.txt. The list of entries is stored in Ecma119Image.apm_req. The size of a block can be chosen by setting Ecma119Image.apm_block_size. If an entry has start_block <=1, then its block_count will be adjusted to the final size of the partition map. If no such entry is requested, then it will be prepended automatically with name "Apple" and type "Apple_partition_map". */ struct iso_apm_partition_request { /* Always given in blocks of 2 KiB. Written to the ISO image according to Ecma119Image.apm_block_size. */ uint32_t start_block; uint32_t block_count; /* All 32 bytes get copied to the system area. Take care to pad up short strings by 0. */ uint8_t name[32]; uint8_t type[32]; }; /* Copies the content of req and registers it in t.apm_req[]. I.e. after the call the submitted storage of req can be disposed or re-used. Submit 0 as value flag. */ int iso_register_apm_entry(Ecma119Image *t, struct iso_apm_partition_request *req, int flag); /* Convenience frontend for iso_register_apm_entry(). name and type are 0-terminated strings, which may get silently truncated. */ int iso_quick_apm_entry(Ecma119Image *t, uint32_t start_block, uint32_t block_count, char *name, char *type); #endif /* SYSTEM_AREA_H_ */