[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [linus:master] [x86/entry] be5341eb0d: WARNING:CPU:#PID:#at_int80_emulation
On Tue, Dec 19, 2023 at 10:21 AM Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxx> wrote: > > On Tue, 19 Dec 2023 at 01:58, Borislav Petkov <bp@xxxxxxxxx> wrote: > > > > Looking at the dmesg, I think you missed the most important part - the > > preceding line: > > > > [ 13.480504][ T48] CFI failure at int80_emulation+0x67/0xb0 (target: > > sys_ni_posix_timers+0x0/0x70; expected type: 0xb02b34d9) > > ^^^^^^^^^^^ > > So I think the issue here is that sys_ni_posix_timers is just linker > alias that is used for any non-implemented posix timer system call. > > See: > > #define __SYS_NI(abi, name) \ > SYSCALL_ALIAS(__##abi##_##name, sys_ni_posix_timers); > > and this all worked fine when the actual call to this was done in > assembly code that happily just called that function directly and > didn't care about any argument types. Yes, that's exactly the issue. > But commit be5341eb0d43 ("x86/entry: Convert INT 0x80 emulation to > IDTENTRY") moved that call from assembly into C, and in the process > ended up enabling CFI for it all, and now the compiler will check that > the function types match. Which they don't, because we use that dummy > function (I don't think they do in general). > > I don't know what the best fix is. Either CFI should be turned off for > that call, or we should make sure to generate those NI system calls > with the proper types. Probably the easiest fix would be to use SYSCALL_DEFINE0 for sys_ni_posix_timers, and for architectures that implement syscall wrappers, change sys_ni_posix_timers references to __<abi>_sys_ni_posix_timers. Something like this should fix the issue for x86, but it looks like arm64, riscv, and s390 would need similar syscall wrapper changes: diff --git a/arch/x86/include/asm/syscall_wrapper.h b/arch/x86/include/asm/syscall_wrapper.h index fd2669b1cb2d..ed38265cad27 100644 --- a/arch/x86/include/asm/syscall_wrapper.h +++ b/arch/x86/include/asm/syscall_wrapper.h @@ -87,7 +87,7 @@ extern long __ia32_sys_ni_syscall(const struct pt_regs *regs); } #define __SYS_NI(abi, name) \ - SYSCALL_ALIAS(__##abi##_##name, sys_ni_posix_timers); + SYSCALL_ALIAS(__##abi##_##name, __##abi##_sys_ni_posix_timers); #ifdef CONFIG_X86_64 #define __X64_SYS_STUB0(name) \ diff --git a/kernel/time/posix-stubs.c b/kernel/time/posix-stubs.c index 828aeecbd1e8..d58f976ec926 100644 --- a/kernel/time/posix-stubs.c +++ b/kernel/time/posix-stubs.c @@ -22,7 +22,7 @@ #include <asm/syscall_wrapper.h> #endif -asmlinkage long sys_ni_posix_timers(void) +SYSCALL_DEFINE0(ni_posix_timers) { pr_err_once("process %d (%s) attempted a POSIX timer syscall " "while CONFIG_POSIX_TIMERS is not set\n", Sami
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |