diff options
author | Joakim Hernberg | 2018-05-31 11:10:36 +0200 |
---|---|---|
committer | Joakim Hernberg | 2018-05-31 11:10:36 +0200 |
commit | c43563a6b9165fc2fb12c7616415e0764050bc70 (patch) | |
tree | 84d9af14ad7612c9a07d4443d40facf05966aaea | |
parent | 6a17e19dd67d35bdfa9d9d90e5641c4bf0b968bf (diff) | |
download | aur-c43563a6b9165fc2fb12c7616415e0764050bc70.tar.gz |
bump to 4.16.12_rt5-1 and fix a gcc8 problem
-rw-r--r-- | .SRCINFO | 24 | ||||
-rw-r--r-- | 0001-objtool_Fix_noreturn_detection_for_recursive_sibling_calls.patch | 43 | ||||
-rw-r--r-- | 0002-objtool_support_GCC8_cold_subfunctions.patch | 323 | ||||
-rw-r--r-- | 0003-objtool_support_GCC8_switch_tables.patch | 80 | ||||
-rw-r--r-- | PKGBUILD | 20 |
5 files changed, 477 insertions, 13 deletions
@@ -1,7 +1,7 @@ -# Generated by makepkg 5.0.2 -# Fri May 18 22:06:04 UTC 2018 +# Generated by makepkg 5.1.0 +# Thu May 31 09:10:17 UTC 2018 pkgbase = linux-rt - pkgver = 4.16.8_rt3 + pkgver = 4.16.12_rt5 pkgrel = 1 url = https://www.kernel.org/ arch = x86_64 @@ -14,10 +14,10 @@ pkgbase = linux-rt options = !strip source = https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.16.tar.xz source = https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.16.tar.sign - source = https://www.kernel.org/pub/linux/kernel/v4.x/patch-4.16.8.xz - source = https://www.kernel.org/pub/linux/kernel/v4.x/patch-4.16.8.sign - source = https://www.kernel.org/pub/linux/kernel/projects/rt/4.16/older/patch-4.16.8-rt3.patch.xz - source = https://www.kernel.org/pub/linux/kernel/projects/rt/4.16/older/patch-4.16.8-rt3.patch.sign + source = https://www.kernel.org/pub/linux/kernel/v4.x/patch-4.16.12.xz + source = https://www.kernel.org/pub/linux/kernel/v4.x/patch-4.16.12.sign + source = https://www.kernel.org/pub/linux/kernel/projects/rt/4.16/older/patch-4.16.12-rt5.patch.xz + source = https://www.kernel.org/pub/linux/kernel/projects/rt/4.16/older/patch-4.16.12-rt5.patch.sign source = config source = 60-linux-rt.hook source = 90-linux-rt.hook @@ -25,6 +25,9 @@ pkgbase = linux-rt source = 0001-add-sysctl-to-disallow-unprivileged-CLONE_NEWUSER-by.patch source = 0002-drm-i915-edp-Only-use-the-alternate-fixed-mode-if-it.patch source = 0003-Partially-revert-swiotlb-remove-various-exports.patch + source = 0001-objtool_Fix_noreturn_detection_for_recursive_sibling_calls.patch + source = 0002-objtool_support_GCC8_cold_subfunctions.patch + source = 0003-objtool_support_GCC8_switch_tables.patch source = fix-race-in-PRT-wait-for-completion-simple-wait-code_Nvidia-RT-160319.patch validpgpkeys = ABAF11C65A2970B130ABE3C479BE3E4300411886 validpgpkeys = 647F28654894E3BD457199BE38DBBDC86092693E @@ -33,9 +36,9 @@ pkgbase = linux-rt validpgpkeys = E644E2F1D45FA0B2EAA02F33109F098506FF0B14 sha256sums = 63f6dc8e3c9f3a0273d5d6f4dca38a2413ca3a5f689329d05b750e4c87bb21b9 sha256sums = SKIP - sha256sums = 6fb2db1e38f762e6a028dfa5e6d094f0eb4324572667923aca3d64c87117772d + sha256sums = 70a6381aca28b1d271e85bc38fab05af4525d9fdc2c5bb87182b3351db8c4fa2 sha256sums = SKIP - sha256sums = 7db2144b16314b1dcc3aefc993d6c9c54690de342a043d0b02d0f114713e880d + sha256sums = 753a22311c369dd10d26b7c8696494f14c5015c6723e4bf81eb11687d196332e sha256sums = SKIP sha256sums = bac64c4b5d015f5f047e2dd558f4643dc2a2afafbfe5bbd124f68811da07c484 sha256sums = ae2e95db94ef7176207c690224169594d49445e04249d2499e9d2fbc117a0b21 @@ -44,6 +47,9 @@ pkgbase = linux-rt sha256sums = 7fb607fe384dd814e9e45d7fc28f7b5b23a51d80784c54bf9209486ad428be14 sha256sums = ceaa19e0af3842c62eb666a4ac5c79d89b3e6d00593442f18d6508ca6d74bbaa sha256sums = 5b397cf9eccdad0c1f2865842c29ba6f4e32ad7dbe4e0c6ef6ca6f07d2963cea + sha256sums = 558b63fa72c1b62cdab92812b279f24188308e0e89b5a8ae0c5f23cef1e2f75e + sha256sums = 31d95ce07a1635251fdc8a1d0ba67c2397d1c035d21cf3ac8c0d08a564aafcee + sha256sums = cd54a177a70788d385f02d934ac4501a31334615c9c81917d6e711f7ec7e7baa sha256sums = 85f7612edfa129210343d6a4fe4ba2a4ac3542d98b7e28c8896738e7e6541c06 pkgname = linux-rt diff --git a/0001-objtool_Fix_noreturn_detection_for_recursive_sibling_calls.patch b/0001-objtool_Fix_noreturn_detection_for_recursive_sibling_calls.patch new file mode 100644 index 000000000000..17f445f1e246 --- /dev/null +++ b/0001-objtool_Fix_noreturn_detection_for_recursive_sibling_calls.patch @@ -0,0 +1,43 @@ +Objtool has some crude logic for detecting static "noreturn" functions +(aka "dead ends"). This is necessary for being able to correctly follow +GCC code flow when such functions are called. + +It's remotely possible for two functions to call each other via sibling +calls. If they don't have RET instructions, objtool's noreturn +detection logic goes into a recursive loop: + + drivers/char/ipmi/ipmi_ssif.o: warning: objtool: return_hosed_msg()+0x0: infinite recursion (objtool bug!) + drivers/char/ipmi/ipmi_ssif.o: warning: objtool: deliver_recv_msg()+0x0: infinite recursion (objtool bug!) + +Instead of reporting an error in this case, consider the functions to be +non-dead-ends. + +Reported-and-tested-by: Randy Dunlap <rdunlap@xxxxxxxxxxxxx> +Signed-off-by: Josh Poimboeuf <jpoimboe@xxxxxxxxxx> +--- + tools/objtool/check.c | 10 +++++++--- + 1 file changed, 7 insertions(+), 3 deletions(-) + +diff --git a/tools/objtool/check.c b/tools/objtool/check.c +index 5409f6f6c48d..264522d4e4af 100644 +--- a/tools/objtool/check.c ++++ b/tools/objtool/check.c +@@ -190,9 +190,13 @@ static int __dead_end_function(struct objtool_file *file, struct symbol *func, + continue; + + if (recursion == 5) { +- WARN_FUNC("infinite recursion (objtool bug!)", +- dest->sec, dest->offset); +- return -1; ++ /* ++ * Infinite recursion: two functions ++ * have sibling calls to each other. ++ * This is a very rare case. It means ++ * they aren't dead ends. ++ */ ++ return 0; + } + + return __dead_end_function(file, dest_func, +-- +2.17.0
\ No newline at end of file diff --git a/0002-objtool_support_GCC8_cold_subfunctions.patch b/0002-objtool_support_GCC8_cold_subfunctions.patch new file mode 100644 index 000000000000..50181837fee5 --- /dev/null +++ b/0002-objtool_support_GCC8_cold_subfunctions.patch @@ -0,0 +1,323 @@ +GCC 8 moves a lot of unlikely code out of line to "cold" subfunctions in +.text.unlikely. Properly detect the new subfunctions and treat them as +extensions of the original functions. + +This fixes a bunch of warnings like: + + kernel/cgroup/cgroup.o: warning: objtool: parse_cgroup_root_flags()+0x33: sibling call from callable instruction with modified stack frame + kernel/cgroup/cgroup.o: warning: objtool: cgroup_addrm_files()+0x290: sibling call from callable instruction with modified stack frame + kernel/cgroup/cgroup.o: warning: objtool: cgroup_apply_control_enable()+0x25b: sibling call from callable instruction with modified stack frame + kernel/cgroup/cgroup.o: warning: objtool: rebind_subsystems()+0x325: sibling call from callable instruction with modified stack frame + +Reported-by: Arnd Bergmann <arnd@xxxxxxxx> +Reported-and-tested-by: damian <damian.tometzki@xxxxxxxxxx> +Signed-off-by: Josh Poimboeuf <jpoimboe@xxxxxxxxxx> +--- + tools/objtool/check.c | 93 ++++++++++++++++++++++++------------------- + tools/objtool/elf.c | 42 ++++++++++++++++++- + tools/objtool/elf.h | 2 + + 3 files changed, 93 insertions(+), 44 deletions(-) + +diff --git a/tools/objtool/check.c b/tools/objtool/check.c +index 264522d4e4af..14daf6a27d9f 100644 +--- a/tools/objtool/check.c ++++ b/tools/objtool/check.c +@@ -59,6 +59,31 @@ static struct instruction *next_insn_same_sec(struct objtool_file *file, + return next; + } + ++static struct instruction *next_insn_same_func(struct objtool_file *file, ++ struct instruction *insn) ++{ ++ struct instruction *next = list_next_entry(insn, list); ++ struct symbol *func = insn->func; ++ ++ if (!func) ++ return NULL; ++ ++ if (&next->list != &file->insn_list && next->func == func) ++ return next; ++ ++ /* Check if we're already in the subfunction: */ ++ if (func == func->cfunc) ++ return NULL; ++ ++ /* Move to the subfunction: */ ++ return find_insn(file, func->cfunc->sec, func->cfunc->offset); ++} ++ ++#define func_for_each_insn_all(file, func, insn) \ ++ for (insn = find_insn(file, func->sec, func->offset); \ ++ insn; \ ++ insn = next_insn_same_func(file, insn)) ++ + #define func_for_each_insn(file, func, insn) \ + for (insn = find_insn(file, func->sec, func->offset); \ + insn && &insn->list != &file->insn_list && \ +@@ -149,10 +174,14 @@ static int __dead_end_function(struct objtool_file *file, struct symbol *func, + if (!strcmp(func->name, global_noreturns[i])) + return 1; + +- if (!func->sec) ++ if (!func->len) + return 0; + +- func_for_each_insn(file, func, insn) { ++ insn = find_insn(file, func->sec, func->offset); ++ if (!insn->func) ++ return 0; ++ ++ func_for_each_insn_all(file, func, insn) { + empty = false; + + if (insn->type == INSN_RETURN) +@@ -167,28 +196,17 @@ static int __dead_end_function(struct objtool_file *file, struct symbol *func, + * case, the function's dead-end status depends on whether the target + * of the sibling call returns. + */ +- func_for_each_insn(file, func, insn) { +- if (insn->sec != func->sec || +- insn->offset >= func->offset + func->len) +- break; +- ++ func_for_each_insn_all(file, func, insn) { + if (insn->type == INSN_JUMP_UNCONDITIONAL) { + struct instruction *dest = insn->jump_dest; +- struct symbol *dest_func; + + if (!dest) + /* sibling call to another file */ + return 0; + +- if (dest->sec != func->sec || +- dest->offset < func->offset || +- dest->offset >= func->offset + func->len) { +- /* local sibling call */ +- dest_func = find_symbol_by_offset(dest->sec, +- dest->offset); +- if (!dest_func) +- continue; ++ if (dest->func && dest->func->pfunc != insn->func->pfunc) { + ++ /* local sibling call */ + if (recursion == 5) { + /* + * Infinite recursion: two functions +@@ -199,7 +217,7 @@ static int __dead_end_function(struct objtool_file *file, struct symbol *func, + return 0; + } + +- return __dead_end_function(file, dest_func, ++ return __dead_end_function(file, dest->func, + recursion + 1); + } + } +@@ -426,7 +444,7 @@ static void add_ignores(struct objtool_file *file) + if (!ignore_func(file, func)) + continue; + +- func_for_each_insn(file, func, insn) ++ func_for_each_insn_all(file, func, insn) + insn->ignore = true; + } + } +@@ -786,9 +804,8 @@ static int add_special_section_alts(struct objtool_file *file) + return ret; + } + +-static int add_switch_table(struct objtool_file *file, struct symbol *func, +- struct instruction *insn, struct rela *table, +- struct rela *next_table) ++static int add_switch_table(struct objtool_file *file, struct instruction *insn, ++ struct rela *table, struct rela *next_table) + { + struct rela *rela = table; + struct instruction *alt_insn; +@@ -798,18 +815,13 @@ static int add_switch_table(struct objtool_file *file, struct symbol *func, + if (rela == next_table) + break; + +- if (rela->sym->sec != insn->sec || +- rela->addend <= func->offset || +- rela->addend >= func->offset + func->len) ++ alt_insn = find_insn(file, rela->sym->sec, rela->addend); ++ if (!alt_insn) + break; + +- alt_insn = find_insn(file, insn->sec, rela->addend); +- if (!alt_insn) { +- WARN("%s: can't find instruction at %s+0x%x", +- file->rodata->rela->name, insn->sec->name, +- rela->addend); +- return -1; +- } ++ /* Make sure the jmp dest is in the function or subfunction: */ ++ if (alt_insn->func->pfunc != insn->func->pfunc) ++ break; + + alt = malloc(sizeof(*alt)); + if (!alt) { +@@ -947,7 +959,7 @@ static int add_func_switch_tables(struct objtool_file *file, + struct rela *rela, *prev_rela = NULL; + int ret; + +- func_for_each_insn(file, func, insn) { ++ func_for_each_insn_all(file, func, insn) { + if (!last) + last = insn; + +@@ -978,8 +990,7 @@ static int add_func_switch_tables(struct objtool_file *file, + * the beginning of another switch table in the same function. + */ + if (prev_jump) { +- ret = add_switch_table(file, func, prev_jump, prev_rela, +- rela); ++ ret = add_switch_table(file, prev_jump, prev_rela, rela); + if (ret) + return ret; + } +@@ -989,7 +1000,7 @@ static int add_func_switch_tables(struct objtool_file *file, + } + + if (prev_jump) { +- ret = add_switch_table(file, func, prev_jump, prev_rela, NULL); ++ ret = add_switch_table(file, prev_jump, prev_rela, NULL); + if (ret) + return ret; + } +@@ -1753,15 +1764,13 @@ static int validate_branch(struct objtool_file *file, struct instruction *first, + while (1) { + next_insn = next_insn_same_sec(file, insn); + +- +- if (file->c_file && func && insn->func && func != insn->func) { ++ if (file->c_file && func && insn->func && func != insn->func->pfunc) { + WARN("%s() falls through to next function %s()", + func->name, insn->func->name); + return 1; + } + +- if (insn->func) +- func = insn->func; ++ func = insn->func ? insn->func->pfunc : NULL; + + if (func && insn->ignore) { + WARN_FUNC("BUG: why am I validating an ignored function?", +@@ -1782,7 +1791,7 @@ static int validate_branch(struct objtool_file *file, struct instruction *first, + + i = insn; + save_insn = NULL; +- func_for_each_insn_continue_reverse(file, func, i) { ++ func_for_each_insn_continue_reverse(file, insn->func, i) { + if (i->save) { + save_insn = i; + break; +@@ -1869,7 +1878,7 @@ static int validate_branch(struct objtool_file *file, struct instruction *first, + case INSN_JUMP_UNCONDITIONAL: + if (insn->jump_dest && + (!func || !insn->jump_dest->func || +- func == insn->jump_dest->func)) { ++ insn->jump_dest->func->pfunc == func)) { + ret = validate_branch(file, insn->jump_dest, + state); + if (ret) +@@ -2064,7 +2073,7 @@ static int validate_functions(struct objtool_file *file) + + for_each_sec(file, sec) { + list_for_each_entry(func, &sec->symbol_list, list) { +- if (func->type != STT_FUNC) ++ if (func->type != STT_FUNC || func->pfunc != func) + continue; + + insn = find_insn(file, sec, func->offset); +diff --git a/tools/objtool/elf.c b/tools/objtool/elf.c +index c1c338661699..4e60e105583e 100644 +--- a/tools/objtool/elf.c ++++ b/tools/objtool/elf.c +@@ -79,6 +79,19 @@ struct symbol *find_symbol_by_offset(struct section *sec, unsigned long offset) + return NULL; + } + ++struct symbol *find_symbol_by_name(struct elf *elf, const char *name) ++{ ++ struct section *sec; ++ struct symbol *sym; ++ ++ list_for_each_entry(sec, &elf->sections, list) ++ list_for_each_entry(sym, &sec->symbol_list, list) ++ if (!strcmp(sym->name, name)) ++ return sym; ++ ++ return NULL; ++} ++ + struct symbol *find_symbol_containing(struct section *sec, unsigned long offset) + { + struct symbol *sym; +@@ -203,10 +216,11 @@ static int read_sections(struct elf *elf) + + static int read_symbols(struct elf *elf) + { +- struct section *symtab; +- struct symbol *sym; ++ struct section *symtab, *sec; ++ struct symbol *sym, *pfunc; + struct list_head *entry, *tmp; + int symbols_nr, i; ++ char *coldstr; + + symtab = find_section_by_name(elf, ".symtab"); + if (!symtab) { +@@ -281,6 +295,30 @@ static int read_symbols(struct elf *elf) + hash_add(sym->sec->symbol_hash, &sym->hash, sym->idx); + } + ++ /* Create parent/child links for any cold subfunctions */ ++ list_for_each_entry(sec, &elf->sections, list) { ++ list_for_each_entry(sym, &sec->symbol_list, list) { ++ if (sym->type != STT_FUNC) ++ continue; ++ sym->pfunc = sym->cfunc = sym; ++ coldstr = strstr(sym->name, ".cold."); ++ if (coldstr) { ++ coldstr[0] = '\0'; ++ pfunc = find_symbol_by_name(elf, sym->name); ++ coldstr[0] = '.'; ++ ++ if (!pfunc) { ++ WARN("%s(): can't find parent function", ++ sym->name); ++ goto err; ++ } ++ ++ sym->pfunc = pfunc; ++ pfunc->cfunc = sym; ++ } ++ } ++ } ++ + return 0; + + err: +diff --git a/tools/objtool/elf.h b/tools/objtool/elf.h +index d86e2ff14466..de5cd2ddded9 100644 +--- a/tools/objtool/elf.h ++++ b/tools/objtool/elf.h +@@ -61,6 +61,7 @@ struct symbol { + unsigned char bind, type; + unsigned long offset; + unsigned int len; ++ struct symbol *pfunc, *cfunc; + }; + + struct rela { +@@ -86,6 +87,7 @@ struct elf { + struct elf *elf_open(const char *name, int flags); + struct section *find_section_by_name(struct elf *elf, const char *name); + struct symbol *find_symbol_by_offset(struct section *sec, unsigned long offset); ++struct symbol *find_symbol_by_name(struct elf *elf, const char *name); + struct symbol *find_symbol_containing(struct section *sec, unsigned long offset); + struct rela *find_rela_by_dest(struct section *sec, unsigned long offset); + struct rela *find_rela_by_dest_range(struct section *sec, unsigned long offset, +-- +2.17.0 diff --git a/0003-objtool_support_GCC8_switch_tables.patch b/0003-objtool_support_GCC8_switch_tables.patch new file mode 100644 index 000000000000..6bc8effc49ed --- /dev/null +++ b/0003-objtool_support_GCC8_switch_tables.patch @@ -0,0 +1,80 @@ +Add some additional checks to the switch jump table logic. This fixes +the following warnings with GCC 8: + + drivers/block/virtio_blk.o: warning: objtool: virtio_queue_rq()+0x0: stack state mismatch: cfa1=7+8 cfa2=7+72 + net/ipv6/icmp.o: warning: objtool: icmpv6_rcv()+0x0: stack state mismatch: cfa1=7+8 cfa2=7+64 + drivers/usb/core/quirks.o: warning: objtool: quirks_param_set()+0x0: stack state mismatch: cfa1=7+8 cfa2=7+48 + drivers/mtd/nand/raw/nand_hynix.o: warning: objtool: hynix_nand_decode_id()+0x0: stack state mismatch: cfa1=7+8 cfa2=7+24 + drivers/mtd/nand/raw/nand_samsung.o: warning: objtool: samsung_nand_decode_id()+0x0: stack state mismatch: cfa1=7+8 cfa2=7+32 + drivers/gpu/drm/nouveau/nvkm/subdev/top/gk104.o: warning: objtool: gk104_top_oneinit()+0x0: stack state mismatch: cfa1=7+8 cfa2=7+64 + +Reported-by: Arnd Bergmann <arnd@xxxxxxxx> +Reported-by: kbuild test robot <lkp@xxxxxxxxx> +Signed-off-by: Josh Poimboeuf <jpoimboe@xxxxxxxxxx> +--- + tools/objtool/check.c | 24 ++++++++++++++++++++++-- + 1 file changed, 22 insertions(+), 2 deletions(-) + +diff --git a/tools/objtool/check.c b/tools/objtool/check.c +index 14daf6a27d9f..6b6885e1e431 100644 +--- a/tools/objtool/check.c ++++ b/tools/objtool/check.c +@@ -810,17 +810,28 @@ static int add_switch_table(struct objtool_file *file, struct instruction *insn, + struct rela *rela = table; + struct instruction *alt_insn; + struct alternative *alt; ++ struct symbol *pfunc = insn->func->pfunc; ++ unsigned int prev_offset = 0; + + list_for_each_entry_from(rela, &file->rodata->rela->rela_list, list) { + if (rela == next_table) + break; + ++ /* Make sure the switch table entries are consecutive: */ ++ if (prev_offset && rela->offset != prev_offset + sizeof(long)) ++ break; ++ ++ /* Detect function pointers from contiguous objects: */ ++ if (rela->sym->sec == pfunc->sec && ++ rela->addend == pfunc->offset) ++ break; ++ + alt_insn = find_insn(file, rela->sym->sec, rela->addend); + if (!alt_insn) + break; + + /* Make sure the jmp dest is in the function or subfunction: */ +- if (alt_insn->func->pfunc != insn->func->pfunc) ++ if (alt_insn->func->pfunc != pfunc) + break; + + alt = malloc(sizeof(*alt)); +@@ -831,6 +842,13 @@ static int add_switch_table(struct objtool_file *file, struct instruction *insn, + + alt->insn = alt_insn; + list_add_tail(&alt->list, &insn->alts); ++ prev_offset = rela->offset; ++ } ++ ++ if (!prev_offset) { ++ WARN_FUNC("can't find switch jump table", ++ insn->sec, insn->offset); ++ return -1; + } + + return 0; +@@ -887,7 +905,9 @@ static struct rela *find_switch_table(struct objtool_file *file, + struct instruction *orig_insn = insn; + + text_rela = find_rela_by_dest_range(insn->sec, insn->offset, insn->len); +- if (text_rela && text_rela->sym == file->rodata->sym) { ++ if (text_rela && text_rela->sym == file->rodata->sym && ++ !find_symbol_containing(file->rodata, text_rela->addend)) { ++ + /* case 1 */ + rodata_rela = find_rela_by_dest(file->rodata, + text_rela->addend); +-- +2.17.0 + + @@ -8,8 +8,8 @@ #pkgbase=linux # Build stock -ARCH kernel pkgbase=linux-rt # Build kernel with a different name _srcname=linux-4.16 -_pkgver=4.16.8 -_rtpatchver=rt3 +_pkgver=4.16.12 +_rtpatchver=rt5 pkgver=${_pkgver}_${_rtpatchver} pkgrel=1 arch=('x86_64') @@ -31,6 +31,9 @@ source=( 0001-add-sysctl-to-disallow-unprivileged-CLONE_NEWUSER-by.patch 0002-drm-i915-edp-Only-use-the-alternate-fixed-mode-if-it.patch 0003-Partially-revert-swiotlb-remove-various-exports.patch + 0001-objtool_Fix_noreturn_detection_for_recursive_sibling_calls.patch + 0002-objtool_support_GCC8_cold_subfunctions.patch + 0003-objtool_support_GCC8_switch_tables.patch fix-race-in-PRT-wait-for-completion-simple-wait-code_Nvidia-RT-160319.patch ) validpgpkeys=( @@ -42,9 +45,9 @@ validpgpkeys=( ) sha256sums=('63f6dc8e3c9f3a0273d5d6f4dca38a2413ca3a5f689329d05b750e4c87bb21b9' 'SKIP' - '6fb2db1e38f762e6a028dfa5e6d094f0eb4324572667923aca3d64c87117772d' + '70a6381aca28b1d271e85bc38fab05af4525d9fdc2c5bb87182b3351db8c4fa2' 'SKIP' - '7db2144b16314b1dcc3aefc993d6c9c54690de342a043d0b02d0f114713e880d' + '753a22311c369dd10d26b7c8696494f14c5015c6723e4bf81eb11687d196332e' 'SKIP' 'bac64c4b5d015f5f047e2dd558f4643dc2a2afafbfe5bbd124f68811da07c484' 'ae2e95db94ef7176207c690224169594d49445e04249d2499e9d2fbc117a0b21' @@ -53,6 +56,9 @@ sha256sums=('63f6dc8e3c9f3a0273d5d6f4dca38a2413ca3a5f689329d05b750e4c87bb21b9' '7fb607fe384dd814e9e45d7fc28f7b5b23a51d80784c54bf9209486ad428be14' 'ceaa19e0af3842c62eb666a4ac5c79d89b3e6d00593442f18d6508ca6d74bbaa' '5b397cf9eccdad0c1f2865842c29ba6f4e32ad7dbe4e0c6ef6ca6f07d2963cea' + '558b63fa72c1b62cdab92812b279f24188308e0e89b5a8ae0c5f23cef1e2f75e' + '31d95ce07a1635251fdc8a1d0ba67c2397d1c035d21cf3ac8c0d08a564aafcee' + 'cd54a177a70788d385f02d934ac4501a31334615c9c81917d6e711f7ec7e7baa' '85f7612edfa129210343d6a4fe4ba2a4ac3542d98b7e28c8896738e7e6541c06') _kernelname=${pkgbase#linux} @@ -67,6 +73,12 @@ prepare() { # add latest fixes from stable queue, if needed # http://git.kernel.org/?p=linux/kernel/git/stable/stable-queue.git + # gcc8 ojtool patches + msg "gcc8 objtool patches..." + patch -p1 -i ../0001-objtool_Fix_noreturn_detection_for_recursive_sibling_calls.patch + patch -p1 -i ../0002-objtool_support_GCC8_cold_subfunctions.patch + patch -p1 -i ../0003-objtool_support_GCC8_switch_tables.patch + # disable USER_NS for non-root users by default patch -Np1 -i ../0001-add-sysctl-to-disallow-unprivileged-CLONE_NEWUSER-by.patch |