From 2b7e58499356fd535ddb3a42029f929bd1e19a9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ertu=C4=9Frul=20Erata?= Date: Sun, 3 Apr 2016 00:39:40 +0300 Subject: [PATCH] syslinux update --- system/boot/syslinux/files/btrfs-fix.patch | 150 +++++++++ .../syslinux/files/dont-guess-alignment.patch | 292 ++++++++++++++++++ .../syslinux/files/gcc-fix-alignment.patch | 81 +++++ system/boot/syslinux/pspec.xml | 7 +- 4 files changed, 527 insertions(+), 3 deletions(-) create mode 100644 system/boot/syslinux/files/btrfs-fix.patch create mode 100644 system/boot/syslinux/files/dont-guess-alignment.patch create mode 100644 system/boot/syslinux/files/gcc-fix-alignment.patch diff --git a/system/boot/syslinux/files/btrfs-fix.patch b/system/boot/syslinux/files/btrfs-fix.patch new file mode 100644 index 0000000000..ac4682cdb0 --- /dev/null +++ b/system/boot/syslinux/files/btrfs-fix.patch @@ -0,0 +1,150 @@ +From 548386049cd41e887079cdb904d3954365eb28f3 Mon Sep 17 00:00:00 2001 +From: Paulo Alcantara +Date: Thu, 24 Dec 2015 01:48:13 -0200 +Subject: [PATCH 1/1] btrfs: Fix logical to physical block address mapping + +The current btrfs support did not handled multiple stripes stored in +chunk items, hence skipping the physical addresses that were needed to +do the mapping. + +Besides, the chunk tree may contain DEV_ITEM keys which store +information on all of the underlying block devices, so we must skip them +instead of finishing lookup. + +The bug was reproduced with btrfs-progs v4.2.2. + +Cc: Gene Cumm +Cc: H. Peter Anvin +Signed-off-by: Paulo Alcantara +--- +v1 -> v2: + * Do not set ignore_key multiple times. Set it before parsing chunk + tree. +v2 -> v3: + * Replace an unnecessary goto with a continue statement. +--- + core/fs/btrfs/btrfs.c | 49 +++++++++++++++++++++++++++++++++---------------- + core/fs/btrfs/btrfs.h | 2 ++ + 2 files changed, 35 insertions(+), 16 deletions(-) + +diff --git a/core/fs/btrfs/btrfs.c b/core/fs/btrfs/btrfs.c +index 53e1105..58e1fe6 100644 +--- a/core/fs/btrfs/btrfs.c ++++ b/core/fs/btrfs/btrfs.c +@@ -81,7 +81,8 @@ static int btrfs_comp_chunk_map(struct btrfs_chunk_map_item *m1, + } + + /* insert a new chunk mapping item */ +-static void insert_map(struct fs_info *fs, struct btrfs_chunk_map_item *item) ++static void insert_chunk_item(struct fs_info *fs, ++ struct btrfs_chunk_map_item *item) + { + struct btrfs_info * const bfs = fs->fs_info; + struct btrfs_chunk_map *chunk_map = &bfs->chunk_map; +@@ -113,6 +114,22 @@ static void insert_map(struct fs_info *fs, struct btrfs_chunk_map_item *item) + chunk_map->cur_length++; + } + ++static inline void insert_map(struct fs_info *fs, struct btrfs_disk_key *key, ++ struct btrfs_chunk *chunk) ++{ ++ struct btrfs_stripe *stripe = &chunk->stripe; ++ struct btrfs_stripe *stripe_end = stripe + chunk->num_stripes; ++ struct btrfs_chunk_map_item item; ++ ++ item.logical = key->offset; ++ item.length = chunk->length; ++ for ( ; stripe < stripe_end; stripe++) { ++ item.devid = stripe->devid; ++ item.physical = stripe->offset; ++ insert_chunk_item(fs, &item); ++ } ++} ++ + /* + * from sys_chunk_array or chunk_tree, we can convert a logical address to + * a physical address we can not support multi device case yet +@@ -330,7 +347,6 @@ static int next_slot(struct fs_info *fs, struct btrfs_disk_key *key, + static void btrfs_read_sys_chunk_array(struct fs_info *fs) + { + struct btrfs_info * const bfs = fs->fs_info; +- struct btrfs_chunk_map_item item; + struct btrfs_disk_key *key; + struct btrfs_chunk *chunk; + int cur; +@@ -342,12 +358,7 @@ static void btrfs_read_sys_chunk_array(struct fs_info *fs) + cur += sizeof(*key); + chunk = (struct btrfs_chunk *)(bfs->sb.sys_chunk_array + cur); + cur += btrfs_chunk_item_size(chunk->num_stripes); +- /* insert to mapping table, ignore multi stripes */ +- item.logical = key->offset; +- item.length = chunk->length; +- item.devid = chunk->stripe.devid; +- item.physical = chunk->stripe.offset;/*ignore other stripes */ +- insert_map(fs, &item); ++ insert_map(fs, key, chunk); + } + } + +@@ -355,14 +366,18 @@ static void btrfs_read_sys_chunk_array(struct fs_info *fs) + static void btrfs_read_chunk_tree(struct fs_info *fs) + { + struct btrfs_info * const bfs = fs->fs_info; ++ struct btrfs_disk_key ignore_key; + struct btrfs_disk_key search_key; + struct btrfs_chunk *chunk; +- struct btrfs_chunk_map_item item; + struct btrfs_path path; + + if (!(bfs->sb.flags & BTRFS_SUPER_FLAG_METADUMP)) { + if (bfs->sb.num_devices > 1) + printf("warning: only support single device btrfs\n"); ++ ++ ignore_key.objectid = BTRFS_DEV_ITEMS_OBJECTID; ++ ignore_key.type = BTRFS_DEV_ITEM_KEY; ++ + /* read chunk from chunk_tree */ + search_key.objectid = BTRFS_FIRST_CHUNK_TREE_OBJECTID; + search_key.type = BTRFS_CHUNK_ITEM_KEY; +@@ -371,16 +386,18 @@ static void btrfs_read_chunk_tree(struct fs_info *fs) + search_tree(fs, bfs->sb.chunk_root, &search_key, &path); + do { + do { ++ /* skip information about underlying block ++ * devices. ++ */ ++ if (!btrfs_comp_keys_type(&ignore_key, ++ &path.item.key)) ++ continue; + if (btrfs_comp_keys_type(&search_key, +- &path.item.key)) ++ &path.item.key)) + break; ++ + chunk = (struct btrfs_chunk *)(path.data); +- /* insert to mapping table, ignore stripes */ +- item.logical = path.item.key.offset; +- item.length = chunk->length; +- item.devid = chunk->stripe.devid; +- item.physical = chunk->stripe.offset; +- insert_map(fs, &item); ++ insert_map(fs, &path.item.key, chunk); + } while (!next_slot(fs, &search_key, &path)); + if (btrfs_comp_keys_type(&search_key, &path.item.key)) + break; +diff --git a/core/fs/btrfs/btrfs.h b/core/fs/btrfs/btrfs.h +index 8f519a9..32e7c70 100644 +--- a/core/fs/btrfs/btrfs.h ++++ b/core/fs/btrfs/btrfs.h +@@ -56,6 +56,8 @@ typedef u64 __le64; + #define BTRFS_MAX_LEVEL 8 + #define BTRFS_MAX_CHUNK_ENTRIES 256 + ++#define BTRFS_DEV_ITEMS_OBJECTID 1ULL ++ + #define BTRFS_FT_REG_FILE 1 + #define BTRFS_FT_DIR 2 + #define BTRFS_FT_SYMLINK 7 +-- +2.5.5.GIT + diff --git a/system/boot/syslinux/files/dont-guess-alignment.patch b/system/boot/syslinux/files/dont-guess-alignment.patch new file mode 100644 index 0000000000..6a9171f4dd --- /dev/null +++ b/system/boot/syslinux/files/dont-guess-alignment.patch @@ -0,0 +1,292 @@ +From 0cc9a99e560a2f52bcf052fd85b1efae35ee812f Mon Sep 17 00:00:00 2001 +From: Sylvain Gault +Date: Tue, 29 Sep 2015 04:45:09 +0200 +Subject: [PATCH 1/1] bios: Don't try to guess the sections alignment + +For the compression / decompression to succeed, the sections layout must +be the same between the virtual memory and load memory. The section +alignment was kept in sync by introducing aligment that should be +greater or equal to the actual section alignment. + +This patch compute the load memory addresses of the sections so that +the layout is the same as the virtual memory addresses. + +Signed-off-by: Sylvain Gault +Tested-by: poma +Signed-off-by: Paulo Alcantara +--- + core/i386/syslinux.ld | 63 ++++++++++--------------------------------------- + core/x86_64/syslinux.ld | 63 ++++++++++--------------------------------------- + 2 files changed, 24 insertions(+), 102 deletions(-) + +diff --git a/core/i386/syslinux.ld b/core/i386/syslinux.ld +index 7390451..92b75b1 100644 +--- a/core/i386/syslinux.ld ++++ b/core/i386/syslinux.ld +@@ -255,10 +255,9 @@ SECTIONS + . = 0x100000; + + __pm_code_start = .; ++ __vma_to_lma = __pm_code_lma - __pm_code_start; + +- __text_vma = .; +- __text_lma = __pm_code_lma; +- .text : AT(__text_lma) { ++ .text : AT(ADDR(.text) + __vma_to_lma) { + FILL(0x90909090) + __text_start = .; + *(.text) +@@ -266,106 +265,68 @@ SECTIONS + __text_end = .; + } + +- . = ALIGN(32); +- +- __rodata_vma = .; +- __rodata_lma = __rodata_vma + __text_lma - __text_vma; +- .rodata : AT(__rodata_lma) { ++ .rodata : AT(ADDR(.rodata) + __vma_to_lma) { + __rodata_start = .; + *(.rodata) + *(.rodata.*) + __rodata_end = .; + } + +- . = ALIGN(4); +- +- __ctors_vma = .; +- __ctors_lma = __ctors_vma + __text_lma - __text_vma; +- .ctors : AT(__ctors_lma) { ++ .ctors : AT(ADDR(.ctors) + __vma_to_lma) { + __ctors_start = .; + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __ctors_end = .; + } + +- __dtors_vma = .; +- __dtors_lma = __dtors_vma + __text_lma - __text_vma; +- .dtors : AT(__dtors_lma) { ++ .dtors : AT(ADDR(.dtors) + __vma_to_lma) { + __dtors_start = .; + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __dtors_end = .; + } + +- . = ALIGN(4); +- +- __dynsym_vma = .; +- __dynsym_lma = __dynsym_vma + __text_lma - __text_vma; +- .dynsym : AT(__dynsym_lma) { ++ .dynsym : AT(ADDR(.dynsym) + __vma_to_lma) { + __dynsym_start = .; + *(.dynsym) + __dynsym_end = .; + } + __dynsym_len = __dynsym_end - __dynsym_start; + +- . = ALIGN(4); +- +- __dynstr_vma = .; +- __dynstr_lma = __dynstr_vma + __text_lma - __text_vma; +- .dynstr : AT(__dynstr_lma) { ++ .dynstr : AT(ADDR(.dynstr) + __vma_to_lma) { + __dynstr_start = .; + *(.dynstr) + __dynstr_end = .; + } + __dynstr_len = __dynstr_end - __dynstr_start; + +- . = ALIGN(4); +- +- __gnu_hash_vma = .; +- __gnu_hash_lma = __gnu_hash_vma + __text_lma - __text_vma; +- .gnu.hash : AT(__gnu_hash_lma) { ++ .gnu.hash : AT(ADDR(.gnu.hash) + __vma_to_lma) { + __gnu_hash_start = .; + *(.gnu.hash) + __gnu_hash_end = .; + } + + +- . = ALIGN(4); +- +- __dynlink_vma = .; +- __dynlink_lma = __dynlink_vma + __text_lma - __text_vma; +- .dynlink : AT(__dynlink_lma) { ++ .dynlink : AT(ADDR(.dynlink) + __vma_to_lma) { + __dynlink_start = .; + *(.dynlink) + __dynlink_end = .; + } + +- . = ALIGN(4); +- +- __got_vma = .; +- __got_lma = __got_vma + __text_lma - __text_vma; +- .got : AT(__got_lma) { ++ .got : AT(ADDR(.got) + __vma_to_lma) { + __got_start = .; + KEEP (*(.got.plt)) + KEEP (*(.got)) + __got_end = .; + } + +- . = ALIGN(4); +- +- __dynamic_vma = .; +- __dynamic_lma = __dynamic_vma + __text_lma - __text_vma; +- .dynamic : AT(__dynamic_lma) { ++ .dynamic : AT(ADDR(.dynamic) + __vma_to_lma) { + __dynamic_start = .; + *(.dynamic) + __dynamic_end = .; + } + +- . = ALIGN(32); +- +- __data_vma = .; +- __data_lma = __data_vma + __text_lma - __text_vma; +- .data : AT(__data_lma) { ++ .data : AT(ADDR(.data) + __vma_to_lma) { + __data_start = .; + *(.data) + *(.data.*) +diff --git a/core/x86_64/syslinux.ld b/core/x86_64/syslinux.ld +index bf815c4..70c6e00 100644 +--- a/core/x86_64/syslinux.ld ++++ b/core/x86_64/syslinux.ld +@@ -255,10 +255,9 @@ SECTIONS + . = 0x100000; + + __pm_code_start = .; ++ __vma_to_lma = __pm_code_lma - __pm_code_start; + +- __text_vma = .; +- __text_lma = __pm_code_lma; +- .text : AT(__text_lma) { ++ .text : AT(ADDR(.text) + __vma_to_lma) { + FILL(0x90909090) + __text_start = .; + *(.text) +@@ -266,106 +265,68 @@ SECTIONS + __text_end = .; + } + +- . = ALIGN(32); +- +- __rodata_vma = .; +- __rodata_lma = __rodata_vma + __text_lma - __text_vma; +- .rodata : AT(__rodata_lma) { ++ .rodata : AT(ADDR(.rodata) + __vma_to_lma) { + __rodata_start = .; + *(.rodata) + *(.rodata.*) + __rodata_end = .; + } + +- . = ALIGN(4); +- +- __ctors_vma = .; +- __ctors_lma = __ctors_vma + __text_lma - __text_vma; +- .ctors : AT(__ctors_lma) { ++ .ctors : AT(ADDR(.ctors) + __vma_to_lma) { + __ctors_start = .; + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __ctors_end = .; + } + +- __dtors_vma = .; +- __dtors_lma = __dtors_vma + __text_lma - __text_vma; +- .dtors : AT(__dtors_lma) { ++ .dtors : AT(ADDR(.dtors) + __vma_to_lma) { + __dtors_start = .; + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __dtors_end = .; + } + +- . = ALIGN(4); +- +- __dynsym_vma = .; +- __dynsym_lma = __dynsym_vma + __text_lma - __text_vma; +- .dynsym : AT(__dynsym_lma) { ++ .dynsym : AT(ADDR(.dynsym) + __vma_to_lma) { + __dynsym_start = .; + *(.dynsym) + __dynsym_end = .; + } + __dynsym_len = __dynsym_end - __dynsym_start; + +- . = ALIGN(4); +- +- __dynstr_vma = .; +- __dynstr_lma = __dynstr_vma + __text_lma - __text_vma; +- .dynstr : AT(__dynstr_lma) { ++ .dynstr : AT(ADDR(.dynstr) + __vma_to_lma) { + __dynstr_start = .; + *(.dynstr) + __dynstr_end = .; + } + __dynstr_len = __dynstr_end - __dynstr_start; + +- . = ALIGN(4); +- +- __gnu_hash_vma = .; +- __gnu_hash_lma = __gnu_hash_vma + __text_lma - __text_vma; +- .gnu.hash : AT(__gnu_hash_lma) { ++ .gnu.hash : AT(ADDR(.gnu.hash) + __vma_to_lma) { + __gnu_hash_start = .; + *(.gnu.hash) + __gnu_hash_end = .; + } + + +- . = ALIGN(4); +- +- __dynlink_vma = .; +- __dynlink_lma = __dynlink_vma + __text_lma - __text_vma; +- .dynlink : AT(__dynlink_lma) { ++ .dynlink : AT(ADDR(.dynlink) + __vma_to_lma) { + __dynlink_start = .; + *(.dynlink) + __dynlink_end = .; + } + +- . = ALIGN(4); +- +- __got_vma = .; +- __got_lma = __got_vma + __text_lma - __text_vma; +- .got : AT(__got_lma) { ++ .got : AT(ADDR(.got) + __vma_to_lma) { + __got_start = .; + KEEP (*(.got.plt)) + KEEP (*(.got)) + __got_end = .; + } + +- . = ALIGN(4); +- +- __dynamic_vma = .; +- __dynamic_lma = __dynamic_vma + __text_lma - __text_vma; +- .dynamic : AT(__dynamic_lma) { ++ .dynamic : AT(ADDR(.dynamic) + __vma_to_lma) { + __dynamic_start = .; + *(.dynamic) + __dynamic_end = .; + } + +- . = ALIGN(32); +- +- __data_vma = .; +- __data_lma = __data_vma + __text_lma - __text_vma; +- .data : AT(__data_lma) { ++ .data : AT(ADDR(.data) + __vma_to_lma) { + __data_start = .; + *(.data) + *(.data.*) +-- +2.5.5.GIT + diff --git a/system/boot/syslinux/files/gcc-fix-alignment.patch b/system/boot/syslinux/files/gcc-fix-alignment.patch new file mode 100644 index 0000000000..64325777d6 --- /dev/null +++ b/system/boot/syslinux/files/gcc-fix-alignment.patch @@ -0,0 +1,81 @@ +From e5f2b577ded109291c9632dacb6eaa621d8a59fe Mon Sep 17 00:00:00 2001 +From: Sylvain Gault +Date: Tue, 29 Sep 2015 02:38:25 +0200 +Subject: [PATCH 1/1] bios: Fix alignment change with gcc 5 + +The section aligment specified in the ld scripts have to be greater or +equal to those in the .o files generated by gcc. + +Signed-off-by: Sylvain Gault +Tested-by: poma +Signed-off-by: Paulo Alcantara +--- + core/i386/syslinux.ld | 6 +++--- + core/x86_64/syslinux.ld | 6 +++--- + 2 files changed, 6 insertions(+), 6 deletions(-) + +diff --git a/core/i386/syslinux.ld b/core/i386/syslinux.ld +index 7b4e012..7390451 100644 +--- a/core/i386/syslinux.ld ++++ b/core/i386/syslinux.ld +@@ -266,7 +266,7 @@ SECTIONS + __text_end = .; + } + +- . = ALIGN(16); ++ . = ALIGN(32); + + __rodata_vma = .; + __rodata_lma = __rodata_vma + __text_lma - __text_vma; +@@ -361,7 +361,7 @@ SECTIONS + __dynamic_end = .; + } + +- . = ALIGN(16); ++ . = ALIGN(32); + + __data_vma = .; + __data_lma = __data_vma + __text_lma - __text_vma; +@@ -377,7 +377,7 @@ SECTIONS + __pm_code_dwords = (__pm_code_len + 3) >> 2; + + . = ALIGN(128); +- ++ + __bss_vma = .; + __bss_lma = .; /* Dummy */ + .bss (NOLOAD) : AT (__bss_lma) { +diff --git a/core/x86_64/syslinux.ld b/core/x86_64/syslinux.ld +index 1057112..bf815c4 100644 +--- a/core/x86_64/syslinux.ld ++++ b/core/x86_64/syslinux.ld +@@ -266,7 +266,7 @@ SECTIONS + __text_end = .; + } + +- . = ALIGN(16); ++ . = ALIGN(32); + + __rodata_vma = .; + __rodata_lma = __rodata_vma + __text_lma - __text_vma; +@@ -361,7 +361,7 @@ SECTIONS + __dynamic_end = .; + } + +- . = ALIGN(16); ++ . = ALIGN(32); + + __data_vma = .; + __data_lma = __data_vma + __text_lma - __text_vma; +@@ -377,7 +377,7 @@ SECTIONS + __pm_code_dwords = (__pm_code_len + 3) >> 2; + + . = ALIGN(128); +- ++ + __bss_vma = .; + __bss_lma = .; /* Dummy */ + .bss (NOLOAD) : AT (__bss_lma) { +-- +2.5.5.GIT + diff --git a/system/boot/syslinux/pspec.xml b/system/boot/syslinux/pspec.xml index c959891c68..ed46ca18e1 100644 --- a/system/boot/syslinux/pspec.xml +++ b/system/boot/syslinux/pspec.xml @@ -13,14 +13,15 @@ app:console SysLinux, IsoLinux and PXELinux bootloader Lightweight bootloaders for floppy media (SYSLINUX), network booting (PXELINUX), and bootable "El Torito" CD-ROMs (ISOLINUX). The project also includes MEMDISK, a tool to boot legacy operating systems (such as DOS) from nontraditional media; it is usually used in conjunction with PXELINUX and ISOLINUX. - https://www.kernel.org/pub/linux/utils/boot/syslinux/4.xx/syslinux-4.07.tar.xz + https://www.kernel.org/pub/linux/utils/boot/syslinux/syslinux-6.03.tar.xz nasm libutil-linux-devel - nopie.patch - fixisohybrid.patch + btrfs-fix.patch + dont-guess-alignment.patch + gcc-fix-alignment.patch