Got it, I will fix it, v2 incoming

//Hongxu

________________________________
From: Khem Raj <raj.k...@gmail.com>
Sent: Tuesday, April 26, 2022 1:47 PM
To: Jia, Hongxu <hongxu....@windriver.com>
Cc: openembeded-devel <openembedded-devel@lists.openembedded.org>
Subject: Re: [meta-oe][PATCH] cdrkit: add new option -eltorito-platform for 
genimageiso

[Please note: This e-mail is from an EXTERNAL e-mail address]

fails to build on clang/mips

https://errors.yoctoproject.org/Errors/Details/655476/

On Mon, Apr 25, 2022 at 8:17 PM Hongxu Jia <hongxu....@windriver.com> wrote:
>
> Mkisofs/genimageiso now correctly supports El Torito multi boot entries by
> introducing a Boot Dection Header before a list of alternate boot entries.
>
> New option -eltorito-platform allows to set the El Torito platform id
> for a boot entry or for a list of boot entries. Supported values for
> the parameter are:
> -   x86 the standard value vor x86 based PCs
> -   PPC the Power PC platform
> -   Mac The Apple Mac platform
> -   efi EFI based boot for PCs
> -   #   an arbitrary numerical value
>
> Port implement from cdrtools:
> https://github.com/jobermayr/cdrtools/commit/a50804fd61d75eb689a515dbfca6968ca2296fd7
>
> Signed-off-by: Hongxu Jia <hongxu....@windriver.com>
> ---
>  .../cdrkit/cdrkit_1.1.11.bb                   |   1 +
>  ...001-add-new-option-eltorito-platform.patch | 336 ++++++++++++++++++
>  2 files changed, 337 insertions(+)
>  create mode 100644 
> meta-oe/recipes-multimedia/cdrkit/files/0001-add-new-option-eltorito-platform.patch
>
> diff --git a/meta-oe/recipes-multimedia/cdrkit/cdrkit_1.1.11.bb 
> b/meta-oe/recipes-multimedia/cdrkit/cdrkit_1.1.11.bb
> index dd0405c95..757f99d1f 100644
> --- a/meta-oe/recipes-multimedia/cdrkit/cdrkit_1.1.11.bb
> +++ b/meta-oe/recipes-multimedia/cdrkit/cdrkit_1.1.11.bb
> @@ -11,6 +11,7 @@ SRC_URI = 
> "${DEBIAN_MIRROR}/main/c/${BPN}/${BPN}_${PV}.orig.tar.gz \
>             file://0001-define-__THROW-to-avoid-build-issue-with-musl.patch \
>             file://0002-Do-not-use-rcmd-on-build-with-musl.patch \
>             file://0001-genisoimage-Add-missing-extern-definition.patch \
> +           file://0001-add-new-option-eltorito-platform.patch \
>             "
>  SRC_URI:append:class-nativesdk = " \
>             file://0001-install-netscsid-to-bin-for-nativesdk.patch \
> diff --git 
> a/meta-oe/recipes-multimedia/cdrkit/files/0001-add-new-option-eltorito-platform.patch
>  
> b/meta-oe/recipes-multimedia/cdrkit/files/0001-add-new-option-eltorito-platform.patch
> new file mode 100644
> index 000000000..c0b0364bb
> --- /dev/null
> +++ 
> b/meta-oe/recipes-multimedia/cdrkit/files/0001-add-new-option-eltorito-platform.patch
> @@ -0,0 +1,336 @@
> +From 34de1b83f8000d95a10afcfdb7ec814cd75b12b2 Mon Sep 17 00:00:00 2001
> +From: Hongxu Jia <hongxu....@windriver.com>
> +Date: Mon, 25 Apr 2022 18:18:00 +0800
> +Subject: [PATCH] add new option -eltorito-platform
> +
> +Mkisofs now correctly supports El Torito multi boot entries by introducing
> +a Boot Dection Header before a list of alternate boot entries.
> +
> +New option -eltorito-platform allows to set the El Torito platform id
> +for a boot entry or for a list of boot entries. Supported values for
> +the parameter are:
> +-   x86 the standard value vor x86 based PCs
> +-   PPC the Power PC platform
> +-   Mac The Apple Mac platform
> +-   efi EFI based boot for PCs
> +-   #   an arbitrary numerical value
> +
> +Upstream-Status: Inappropriate [port from cdrtools]
> +https://github.com/jobermayr/cdrtools/commit/a50804fd61d75eb689a515dbfca6968ca2296fd7
> +
> +Signed-off-by: Hongxu Jia <hongxu....@windriver.com>
> +---
> + genisoimage/eltorito.c    | 73 +++++++++++++++++++++++++++++++++++++--
> + genisoimage/genisoimage.c | 48 +++++++++++++++++++++++++
> + genisoimage/genisoimage.h |  8 +++++
> + genisoimage/iso9660.h     | 33 ++++++++++++++++--
> + 4 files changed, 158 insertions(+), 4 deletions(-)
> +
> +diff --git a/genisoimage/eltorito.c b/genisoimage/eltorito.c
> +index d52e17e..a804988 100644
> +--- a/genisoimage/eltorito.c
> ++++ b/genisoimage/eltorito.c
> +@@ -56,6 +56,7 @@ static unsigned int bcat_de_flags;
> + void  init_boot_catalog(const char *path);
> + void  insert_boot_cat(void);
> + static        void    get_torito_desc(struct eltorito_boot_descriptor 
> *boot_desc);
> ++static        void    fill_boot_shdr(struct eltorito_sectionheader_entry 
> *boot_shdr_entry, int arch);
> + static        void    fill_boot_desc(struct eltorito_defaultboot_entry 
> *boot_desc_entry,
> +                                                                             
>   struct eltorito_boot_entry_info *boot_entry);
> + void  get_boot_entry(void);
> +@@ -282,7 +283,14 @@ get_torito_desc(struct eltorito_boot_descriptor 
> *boot_desc)
> +       struct directory_entry  *de2;   /* Boot catalog */
> +       int                     i;
> +       int                     offset;
> ++      int                     arch = 0;
> ++      int                     nentries = 0;
> +       struct eltorito_defaultboot_entry boot_desc_record;
> ++      struct eltorito_sectionheader_entry boot_shdr_record;
> ++#ifdef __needed__
> ++      struct eltorito_section_entry boot_section_record;
> ++#endif
> ++      struct eltorito_sectionheader_entry *last_section_header = 0;
> +
> +       memset(boot_desc, 0, sizeof (*boot_desc));
> +       boot_desc->type[0] = 0;
> +@@ -311,13 +319,22 @@ get_torito_desc(struct eltorito_boot_descriptor 
> *boot_desc)
> +       set_731(boot_desc->bootcat_ptr,
> +               (unsigned int) get_733(de2->isorec.extent));
> +
> ++      /*
> ++       * If the platform id for the first (default) boot entry has not been
> ++       * explicitly set, we default to EL_TORITO_ARCH_x86
> ++       */
> ++      if ((first_boot_entry->type & ELTORITO_BOOT_ID) == 0) {
> ++              first_boot_entry->boot_platform = EL_TORITO_ARCH_x86;
> ++      }
> ++      arch = first_boot_entry->boot_platform;
> ++
> +       /*
> +        * we have the boot image, so write boot catalog information
> +        * Next we write out the primary descriptor for the disc
> +        */
> +       memset(&valid_desc, 0, sizeof (valid_desc));
> +       valid_desc.headerid[0] = 1;
> +-      valid_desc.arch[0] = EL_TORITO_ARCH_x86;
> ++      valid_desc.arch[0] = arch;  /* Platform id for the default boot */
> +
> +       /*
> +        * we'll shove start of publisher id into id field,
> +@@ -351,8 +368,17 @@ get_torito_desc(struct eltorito_boot_descriptor 
> *boot_desc)
> +               current_boot_entry != NULL;
> +               current_boot_entry = current_boot_entry->next,
> +               offset += sizeof (boot_desc_record)) {
> ++              int newarch = arch;
> +
> +-              if (offset >= SECTOR_SIZE) {
> ++              if (current_boot_entry->type & ELTORITO_BOOT_ID)
> ++                      newarch = current_boot_entry->boot_platform;
> ++              else
> ++                      current_boot_entry->boot_platform = arch;
> ++
> ++              /*
> ++               * El Torito has no such limitation but we currently have...
> ++               */
> ++              if (offset >= (SECTOR_SIZE - sizeof (boot_desc_record))) {
> + #ifdef        USE_LIBSCHILY
> +                       comerrno(EX_BAD,
> +                       "Too many El Torito boot entries\n");
> +@@ -362,12 +388,53 @@ get_torito_desc(struct eltorito_boot_descriptor 
> *boot_desc)
> +                       exit(1);
> + #endif
> +               }
> ++
> ++              if (current_boot_entry == first_boot_entry) {
> ++                      ;
> ++                      /* EMPTY */
> ++              } else if ((current_boot_entry == first_boot_entry->next) ||
> ++                          (arch != newarch) ||
> ++                          (current_boot_entry->type & 
> ELTORITO_SECTION_HEADER)) {
> ++                      if (last_section_header)
> ++                              set_721(&last_section_header->entry_count, 
> nentries);
> ++                      nentries = 1;
> ++                      last_section_header = (struct 
> eltorito_sectionheader_entry *)
> ++                                                      (de2->table + offset);
> ++                      fill_boot_shdr(&boot_shdr_record, newarch);
> ++                      memcpy(de2->table + offset, &boot_shdr_record,
> ++                                              sizeof (boot_shdr_record));
> ++                      offset += sizeof (boot_desc_record);
> ++              } else {
> ++                      nentries++; /* Add entry to this section header */
> ++              }
> ++              /*
> ++               * This works because a section entry has the same essential
> ++               * layout as a default entry (and we do not populate the
> ++               * selection criteria fields).
> ++               */
> ++
> +               fill_boot_desc(&boot_desc_record, current_boot_entry);
> +               memcpy(de2->table + offset, &boot_desc_record,
> +                                       sizeof (boot_desc_record));
> +       }
> ++
> ++      if (last_section_header) {
> ++              set_721(&last_section_header->entry_count, nentries);
> ++              last_section_header->header_id[0] = 
> EL_TORITO_SHDR_ID_LAST_SHDR;
> ++      }
> ++
> + }/* get_torito_desc(... */
> +
> ++static void
> ++fill_boot_shdr(boot_shdr_entry, arch)
> ++      struct eltorito_sectionheader_entry *boot_shdr_entry;
> ++      int                 arch;
> ++{
> ++      memset(boot_shdr_entry, 0, sizeof(struct 
> eltorito_sectionheader_entry));
> ++      boot_shdr_entry->header_id[0] = EL_TORITO_SHDR_ID_SHDR;
> ++      boot_shdr_entry->platform_id[0] = arch;
> ++}
> ++
> + static void
> + fill_boot_desc(struct eltorito_defaultboot_entry *boot_desc_entry,
> +                                       struct eltorito_boot_entry_info 
> *boot_entry)
> +@@ -678,7 +745,9 @@ get_boot_entry()
> +       if (!first_boot_entry) {
> +               first_boot_entry = current_boot_entry;
> +               last_boot_entry = current_boot_entry;
> ++              current_boot_entry->boot_platform = EL_TORITO_ARCH_x86;
> +       } else {
> ++              current_boot_entry->boot_platform = 
> last_boot_entry->boot_platform;
> +               last_boot_entry->next = current_boot_entry;
> +               last_boot_entry = current_boot_entry;
> +       }
> +diff --git a/genisoimage/genisoimage.c b/genisoimage/genisoimage.c
> +index 46f0cb7..bfa920e 100644
> +--- a/genisoimage/genisoimage.c
> ++++ b/genisoimage/genisoimage.c
> +@@ -271,6 +271,8 @@ struct rcopts {
> +       char            **variable;
> + };
> +
> ++static int get_boot_platid(opt_arg);
> ++
> + struct rcopts rcopt[] = {
> +       {"PREP", &preparer},
> +       {"PUBL", &publisher},
> +@@ -404,6 +406,7 @@ struct ld_option {
> +
> + #define       OPTION_ALLOW_LEADING_DOTS       1070
> + #define       OPTION_PUBLISHER                1071
> ++#define       OPTION_PLATFORM                 1072
> +
> + #ifdef                JIGDO_TEMPLATE
> + #define       OPTION_JTT_OUTPUT               1101
> +@@ -528,6 +531,8 @@ static const struct ld_option ld_options[] =
> +       'b', "FILE", "Set El Torito boot image name", ONE_DASH},
> +       {{"eltorito-alt-boot", no_argument, NULL, OPTION_ALT_BOOT},
> +       '\0', NULL, "Start specifying alternative El Torito boot parameters", 
> ONE_DASH},
> ++      {{"eltorito-platform", required_argument, NULL, OPTION_PLATFORM},
> ++      '\0', "ID", "Set El Torito platform id for the next boot entry", 
> ONE_DASH},
> +       {{"sparc-boot", required_argument, NULL, 'B'},
> +       'B', "FILES", "Set sparc boot image names", ONE_DASH},
> +       {{"sunx86-boot", required_argument, NULL, OPTION_SUNX86BOOT},
> +@@ -1558,6 +1563,9 @@ int main(int argc, char *argv[])
> +                        */
> +                       new_boot_entry();
> +                       break;
> ++              case OPTION_PLATFORM:
> ++                      get_boot_platid(optarg);
> ++                      break;
> +               case OPTION_BOOTALPHA:
> +                       use_alphaboot++;
> +                       /* list of pathnames of boot images */
> +@@ -3829,3 +3837,43 @@ e_malloc(size_t size)
> +      memset(pt, 0, size);
> +       return (pt);
> + }
> ++
> ++static int
> ++get_boot_platid(opt_arg)
> ++      char    *opt_arg;
> ++{
> ++      long    val;
> ++      char    *ptr;
> ++
> ++      use_eltorito++;
> ++      if (streql(opt_arg, "x86")) {
> ++              val = EL_TORITO_ARCH_x86;
> ++      } else if (streql(opt_arg, "PPC")) {
> ++              val = EL_TORITO_ARCH_PPC;
> ++      } else if (streql(opt_arg, "Mac")) {
> ++              val = EL_TORITO_ARCH_PPC;
> ++      } else if (streql(opt_arg, "efi")) {
> ++              val = EL_TORITO_ARCH_EFI;
> ++      } else {
> ++              val = strtol(opt_arg, &ptr, 0);
> ++              if (*ptr || val < 0 || val >= 0x100) {
> ++                      comerrno(EX_BAD, "Bad boot system ID.\n");
> ++              }
> ++      }
> ++
> ++      /*
> ++       * If there is already a boot entry and the boot file name has been 
> set
> ++       * for this boot entry and the new platform id differs from the
> ++       * previous value, we start a new boot section.
> ++       */
> ++      if (current_boot_entry &&
> ++          current_boot_entry->boot_image != NULL &&
> ++          current_boot_entry->boot_platform != val) {
> ++          new_boot_entry();
> ++      }
> ++      get_boot_entry();
> ++      current_boot_entry->type |= ELTORITO_BOOT_ID;
> ++      current_boot_entry->boot_platform = val;
> ++      return (1);
> ++}
> ++
> +diff --git a/genisoimage/genisoimage.h b/genisoimage/genisoimage.h
> +index bbedfb0..4dae1e8 100644
> +--- a/genisoimage/genisoimage.h
> ++++ b/genisoimage/genisoimage.h
> +@@ -299,6 +299,14 @@ struct eltorito_boot_entry_info {
> +       int             boot_info_table;
> +       int             load_size;
> +       int             load_addr;
> ++
> ++#define       ELTORITO_BOOT_ID    1
> ++#define       ELTORITO_SECTION_HEADER 2
> ++      int     type;
> ++      /*
> ++       * Valid if (type & ELTORITO_BOOT_ID) != 0
> ++       */
> ++      int     boot_platform;
> + };
> +
> + extern int    goof;
> +diff --git a/genisoimage/iso9660.h b/genisoimage/iso9660.h
> +index c74c2a9..61b6fc0 100644
> +--- a/genisoimage/iso9660.h
> ++++ b/genisoimage/iso9660.h
> +@@ -62,6 +62,7 @@ struct iso_volume_descriptor {
> + #define       EL_TORITO_ARCH_x86      0
> + #define       EL_TORITO_ARCH_PPC      1
> + #define       EL_TORITO_ARCH_MAC      2
> ++#define       EL_TORITO_ARCH_EFI      0xEF
> +
> + #define       EL_TORITO_BOOTABLE      0x88
> + #define       EL_TORITO_NOT_BOOTABLE  0
> +@@ -159,10 +160,15 @@ struct eltorito_boot_descriptor {
> + };
> +
> + /* Validation entry for El Torito */
> ++/*
> ++ * headerid must be 1
> ++ * id is the manufacturer ID
> ++ * cksum to make the sum of all shorts in this record 0
> ++ */
> + struct eltorito_validation_entry {
> +       char headerid                   [ISODCL(1,    1)]; /* 711 */
> +       char arch                       [ISODCL(2,    2)];
> +-      char pad1                       [ISODCL(3,    4)]; /* 711 */
> ++      char pad1                       [ISODCL(3,    4)]; /* 721 */
> +       char id                         [ISODCL(5,   28)]; /* CD devel/man*/
> +       char cksum                      [ISODCL(29,  30)];
> +       char key1                       [ISODCL(31,  31)];
> +@@ -173,7 +179,7 @@ struct eltorito_validation_entry {
> + struct eltorito_defaultboot_entry {
> +       char boot_id                    [ISODCL(1,    1)]; /* 711 */
> +       char boot_media                 [ISODCL(2,    2)];
> +-      char loadseg                    [ISODCL(3,    4)]; /* 711 */
> ++      char loadseg                    [ISODCL(3,    4)]; /* 721 */
> +       char sys_type                   [ISODCL(5,    5)];
> +       char pad1                       [ISODCL(6,    6)];
> +       char nsect                      [ISODCL(7,    8)];
> +@@ -181,6 +187,29 @@ struct eltorito_defaultboot_entry {
> +       char pad2                       [ISODCL(13,  32)];
> + };
> +
> ++/* El Torito section header entry in boot catalog */
> ++struct eltorito_sectionheader_entry {
> ++#define    EL_TORITO_SHDR_ID_SHDR      0x90
> ++#define    EL_TORITO_SHDR_ID_LAST_SHDR 0x91
> ++      char header_id          [ISODCL(1,    1)]; /* 711 */
> ++      char platform_id        [ISODCL(2,    2)];
> ++      char entry_count        [ISODCL(3,    4)]; /* 721 */
> ++      char id             [ISODCL(5,   32)];
> ++};
> ++
> ++/* El Torito section entry in boot catalog */
> ++struct eltorito_section_entry {
> ++      char boot_id            [ISODCL(1,    1)]; /* 711 */
> ++      char boot_media         [ISODCL(2,    2)];
> ++      char loadseg            [ISODCL(3,    4)]; /* 721 */
> ++      char sys_type           [ISODCL(5,    5)];
> ++      char pad1           [ISODCL(6,    6)];
> ++      char nsect          [ISODCL(7,    8)];
> ++      char bootoff            [ISODCL(9,   12)];
> ++      char sel_criteria       [ISODCL(13,  13)];
> ++      char vendor_sel_criteria    [ISODCL(14,  32)];
> ++};
> ++
> + /*
> +  * XXX JS: The next two structures have odd lengths!
> +  * Some compilers (e.g. on Sun3/mc68020) padd the structures to even length.
> +--
> +2.27.0
> +
> --
> 2.27.0
>
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#96793): 
https://lists.openembedded.org/g/openembedded-devel/message/96793
Mute This Topic: https://lists.openembedded.org/mt/90701146/21656
Group Owner: openembedded-devel+ow...@lists.openembedded.org
Unsubscribe: https://lists.openembedded.org/g/openembedded-devel/unsub 
[arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to