| From foo@baz Thu Mar 22 14:40:24 CET 2018 |
| From: Sergei Trofimovich <slyfox@gentoo.org> |
| Date: Mon, 1 May 2017 11:51:55 -0700 |
| Subject: ia64: fix module loading for gcc-5.4 |
| |
| From: Sergei Trofimovich <slyfox@gentoo.org> |
| |
| |
| [ Upstream commit a25fb8508c1b80dce742dbeaa4d75a1e9f2c5617 ] |
| |
| Starting from gcc-5.4+ gcc generates MLX instructions in more cases to |
| refer local symbols: |
| |
| https://gcc.gnu.org/PR60465 |
| |
| That caused ia64 module loader to choke on such instructions: |
| |
| fuse: invalid slot number 1 for IMM64 |
| |
| The Linux kernel used to handle only case where relocation pointed to |
| slot=2 instruction in the bundle. That limitation was fixed in linux by |
| commit 9c184a073bfd ("[IA64] Fix 2.6 kernel for the new ia64 assembler") |
| See |
| |
| http://sources.redhat.com/bugzilla/show_bug.cgi?id=1433 |
| |
| This change lifts the slot=2 restriction from the kernel module loader. |
| |
| Tested on 'fuse' and 'btrfs' kernel modules. |
| |
| Cc: Markus Elfring <elfring@users.sourceforge.net> |
| Cc: H J Lu <hjl.tools@gmail.com> |
| Cc: Fenghua Yu <fenghua.yu@intel.com> |
| Cc: Andrew Morton <akpm@linux-foundation.org> |
| Bug: https://bugs.gentoo.org/601014 |
| Tested-by: Émeric MASCHINO <emeric.maschino@gmail.com> |
| Signed-off-by: Sergei Trofimovich <slyfox@gentoo.org> |
| Signed-off-by: Tony Luck <tony.luck@intel.com> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| arch/ia64/kernel/module.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/arch/ia64/kernel/module.c |
| +++ b/arch/ia64/kernel/module.c |
| @@ -153,7 +153,7 @@ slot (const struct insn *insn) |
| static int |
| apply_imm64 (struct module *mod, struct insn *insn, uint64_t val) |
| { |
| - if (slot(insn) != 2) { |
| + if (slot(insn) != 1 && slot(insn) != 2) { |
| printk(KERN_ERR "%s: invalid slot number %d for IMM64\n", |
| mod->name, slot(insn)); |
| return 0; |
| @@ -165,7 +165,7 @@ apply_imm64 (struct module *mod, struct |
| static int |
| apply_imm60 (struct module *mod, struct insn *insn, uint64_t val) |
| { |
| - if (slot(insn) != 2) { |
| + if (slot(insn) != 1 && slot(insn) != 2) { |
| printk(KERN_ERR "%s: invalid slot number %d for IMM60\n", |
| mod->name, slot(insn)); |
| return 0; |