Hi Nathan,
On Mon, Nov 04, 2024 at 04:27:41PM -0700, Nathan Chancellor wrote:
Hi Mike,
On Wed, Oct 23, 2024 at 07:27:09PM +0300, Mike Rapoport wrote:
From: "Mike Rapoport (Microsoft)" <rppt@xxxxxxxxxx>
When module text memory will be allocated with ROX permissions, the
memory at the actual address where the module will live will contain
invalid instructions and there will be a writable copy that contains the
actual module code.
Update relocations and alternatives patching to deal with it.
Signed-off-by: Mike Rapoport (Microsoft) <rppt@xxxxxxxxxx>
Tested-by: kdevops <kdevops@xxxxxxxxxxxxxxx>
Hopefully the last time you have to hear from me, as I am only
experiencing issues with only one of my test machines at this point and
it is my only machine that supports IBT, so it seems to point to
something specific with the IBT part of the FineIBT support. I notice
either a boot hang or an almost immediate reboot (triple fault?). I
guess this is how I missed reporting this earlier, as my machine was
falling back to the default distribution kernel after the restart and I
did not notice I was not actually testing a -next kernel.
Checking out the version of this change that is in next-20241104, commit
7ca6ed09db62 ("x86/module: prepare module loading for ROX allocations of
text"), it boots with either 'cfi=off' or 'cfi=kcfi' but it exhibits the
issues noted above with 'cfi=fineibt'. At the immediate parent, commit
b575d981092f ("arch: introduce set_direct_map_valid_noflush()"), all
three combinations boot fine.
$ uname -r; tr ' ' '\n' </proc/cmdline | grep cfi=
6.12.0-rc5-debug-00214-g7ca6ed09db62
cfi=kcfi
6.12.0-rc5-debug-00214-g7ca6ed09db62
cfi=off
6.12.0-rc5-debug-00213-gb575d981092f
cfi=fineibt
6.12.0-rc5-debug-00213-gb575d981092f
cfi=kcfi
6.12.0-rc5-debug-00213-gb575d981092f
cfi=off
I do not think this machine has an accessible serial port and I do not
think IBT virtualization is supported via either KVM or TCG in QEMU, so
I am not sure how to get more information about what is going on here. I
wanted to try reverting these changes on top of next-20241104 but there
was a non-trivial conflict in mm/execmem.c due to some changes on top,
so I just tested in the mm history.
If there is any other information I can provide or patches I can test, I
am more than happy to do so.
Yes, please :)
There's a silly mistake in cfi_rewrite_endbr() in that commit, the patch
below should fix it. Can you please test?
diff --git a/arch/x86/kernel/alternative.c b/arch/x86/kernel/alternative.c
index 3407efc26528..243843e44e89 100644
--- a/arch/x86/kernel/alternative.c
+++ b/arch/x86/kernel/alternative.c
@@ -1241,7 +1241,7 @@ static void cfi_rewrite_endbr(s32 *start, s32 *end, struct module *mod)
void *addr = (void *)s + *s;
void *wr_addr = module_writable_address(mod, addr);
- poison_endbr(addr+16, wr_addr, false);
+ poison_endbr(addr + 16, wr_addr + 16, false);
}
}
Cheers,
Nathan
--
Sincerely yours,
Mike.