summarylogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoakim Hernberg2018-05-31 11:10:36 +0200
committerJoakim Hernberg2018-05-31 11:10:36 +0200
commitc43563a6b9165fc2fb12c7616415e0764050bc70 (patch)
tree84d9af14ad7612c9a07d4443d40facf05966aaea
parent6a17e19dd67d35bdfa9d9d90e5641c4bf0b968bf (diff)
downloadaur-c43563a6b9165fc2fb12c7616415e0764050bc70.tar.gz
bump to 4.16.12_rt5-1 and fix a gcc8 problem
-rw-r--r--.SRCINFO24
-rw-r--r--0001-objtool_Fix_noreturn_detection_for_recursive_sibling_calls.patch43
-rw-r--r--0002-objtool_support_GCC8_cold_subfunctions.patch323
-rw-r--r--0003-objtool_support_GCC8_switch_tables.patch80
-rw-r--r--PKGBUILD20
5 files changed, 477 insertions, 13 deletions
diff --git a/.SRCINFO b/.SRCINFO
index f24d77f122e6..19a1448e4fb5 100644
--- a/.SRCINFO
+++ b/.SRCINFO
@@ -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
+
+
diff --git a/PKGBUILD b/PKGBUILD
index dd7dac612807..25e8a5c92b01 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -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