Module Name: src Committed By: pgoyette Date: Mon Mar 9 01:06:34 UTC 2020
Modified Files: src/sys/compat/netbsd32: netbsd32_mod.c Log Message: If a syscall requires a module to be autoloaded, the initial invocation of that syscall will return ERESTART. For amd64's netbsd32_syscall() that means we need to back up the PC saved in the trap frame so we can re-issue the syscall instruction. For "normal" syscall traps, we saved the instruction length in the trap frame, but this was missing for the oosyscall/lcall path. Since the PC was not backed up, the kernel-only value ERESTART was returned to userland, causing all sort of grief for old compat_netbsd32 executables! XXX Pullup-9 To generate a diff of this commit: cvs rdiff -u -r1.18 -r1.19 src/sys/compat/netbsd32/netbsd32_mod.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/compat/netbsd32/netbsd32_mod.c diff -u src/sys/compat/netbsd32/netbsd32_mod.c:1.18 src/sys/compat/netbsd32/netbsd32_mod.c:1.19 --- src/sys/compat/netbsd32/netbsd32_mod.c:1.18 Sun Mar 8 04:17:49 2020 +++ src/sys/compat/netbsd32/netbsd32_mod.c Mon Mar 9 01:06:34 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: netbsd32_mod.c,v 1.18 2020/03/08 04:17:49 pgoyette Exp $ */ +/* $NetBSD: netbsd32_mod.c,v 1.19 2020/03/09 01:06:34 pgoyette Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -59,7 +59,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: netbsd32_mod.c,v 1.18 2020/03/08 04:17:49 pgoyette Exp $"); +__KERNEL_RCSID(0, "$NetBSD: netbsd32_mod.c,v 1.19 2020/03/09 01:06:34 pgoyette Exp $"); #ifdef _KERNEL_OPT #include "opt_execfmt.h" @@ -148,8 +148,9 @@ amd64_oosyscall_handle(struct proc *p, s copyin((void *)frame->tf_rip, tmp, sz) == 0 && memcmp(tmp, lcall, sz) == 0) { - /* Advance past the lcall. */ + /* Advance past the lcall and save instruction size. */ frame->tf_rip += sz; + frame->tf_err = sz; /* Do the syscall */ p->p_md.md_syscall(frame); @@ -157,7 +158,7 @@ amd64_oosyscall_handle(struct proc *p, s } else return EPASSTHROUGH; } -#endif +#endif /* defined(__amd64__) */ static int compat_netbsd32_modcmd(modcmd_t cmd, void *arg) @@ -175,14 +176,14 @@ compat_netbsd32_modcmd(modcmd_t cmd, voi #if defined(__amd64__) MODULE_HOOK_SET(amd64_oosyscall_hook, amd64_oosyscall_handle); -#endif +#endif /* defined(__amd64__) */ } return error; case MODULE_CMD_FINI: #if defined(__amd64__) MODULE_HOOK_UNSET(amd64_oosyscall_hook); -#endif +#endif /* defined(__amd64__) */ netbsd32_machdep_md_fini(); netbsd32_sysctl_fini(); netbsd32_kern_proc_32_fini(); @@ -196,7 +197,7 @@ compat_netbsd32_modcmd(modcmd_t cmd, voi #if defined(__amd64__) MODULE_HOOK_SET(amd64_oosyscall_hook, amd64_oosyscall_handle); -#endif +#endif /* defined(__amd64__) */ } return error;