Module Name: src Committed By: christos Date: Mon May 20 17:12:41 UTC 2024
Modified Files: src/share/man/man9: versioningsyscalls.9 Log Message: explain what the current and new numbering practice are. To generate a diff of this commit: cvs rdiff -u -r1.5 -r1.6 src/share/man/man9/versioningsyscalls.9 Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/share/man/man9/versioningsyscalls.9 diff -u src/share/man/man9/versioningsyscalls.9:1.5 src/share/man/man9/versioningsyscalls.9:1.6 --- src/share/man/man9/versioningsyscalls.9:1.5 Fri Jul 14 05:03:37 2023 +++ src/share/man/man9/versioningsyscalls.9 Mon May 20 13:12:41 2024 @@ -1,4 +1,4 @@ -.\" $NetBSD: versioningsyscalls.9,v 1.5 2023/07/14 09:03:37 rillig Exp $ +.\" $NetBSD: versioningsyscalls.9,v 1.6 2024/05/20 17:12:41 christos Exp $ .\" .\" Copyright (c) 2023 The NetBSD Foundation, Inc. .\" All rights reserved. @@ -27,7 +27,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.Dd June 23, 2023 +.Dd May 20, 2024 .Dt VERSIONINGSYSCALLS 9 .Os . @@ -89,7 +89,7 @@ The version of the syscall that will bec .El .Pp Additionally, -.Ar XYZ +.Ar CNUM always represents the last .Nx release where the current @@ -115,6 +115,42 @@ will be versioned. If not versioning a struct, passages that mention .Ft my_struct can be ignored. +.Pp +The syscall version suffix +.Dv VNUM +indicates the first release of +.Nx +the system call will appear in. +The compat version +.Dv CNUM +is the last version of +.Nx the old system call was used. +Typically VNUM = CNUM + 1 . +.Pp +For example if you are versioning +.Xr getcontext 2 +just after +.Nx 11 +was released, and the original system call was called +.Fn getcontext , +the system call will become +.Fn __getcontext12 +and the compat entry point will become +.Fn compat_11_getcontext . +.Pp +Next time +.Xr getcontext 2 +needs versioning, for example just after +.Nx 15 +was released, it will become +.Fn __getcontext16 +and the compat entry will become +.Fn compat_15___getcontext12 . +.Pp +Please note that the historical practice up to +.Nx 11 +has been that the syscall suffix matched the version when the syscall +was last used. . .Ss Versioning structs To version @@ -122,7 +158,7 @@ To version first make a copy of .Ft my_struct renamed to -.Ft my_structXYZ +.Ft my_structCNUM in an equivalent header in .Pa sys/compat/sys . After that, you can freely modify @@ -131,14 +167,14 @@ as desired. . .Ss Versioning the entry point The stub for the next version of the syscall will be -.Fn __my_syscallXYZ , +.Fn __my_syscallVNUM , and will have entry point -.Fn sys___my_syscallXYZ . +.Fn sys___my_syscallVNUM . . .Ss Modifying syscalls.conf .Pa sys/kern/syscalls.conf may need to be modified to contain -.Li compat_XYZ +.Li compat_CNUM in the .Va compatopts variable. @@ -149,20 +185,20 @@ First, add the next syscall to keeping .Fn my_syscall as the name, and set the (optional) compat field of the declaration to -.Ar XYZ . +.Ar CNUM . .Pp Next, modify the current version of the syscall, and replace the type field .Pq usually just Li STD with -.Dv COMPAT_XYZ MODULAR compat_XYZ . +.Dv COMPAT_CNUM MODULAR compat_CNUM . .Pp The keyword .Dv MODULAR indicates that the system call can be part of a kernel module. Even if the system call was not part of a module before, now it will be part of the -.Dv COMPAT_XYZ +.Dv COMPAT_CNUM module. .Pp Finally, if applicable, replace the types of the current and old versions of the @@ -171,16 +207,16 @@ syscall with the compat type. Overall, the final diff should look like .Bd -literal - 123 STD { int|sys||my_syscall(struct my_struct *ms); } -+ 123 COMPAT_XYZ MODULAR compat_XYZ { int|sys||my_syscall(struct my_structXYZ *ms); } ++ 123 COMPAT_CNUM MODULAR compat_CNUM { int|sys||my_syscall(struct my_structCNUM *ms); } \&... -+ 456 STD { int|sys|XYZ|my_syscall(struct my_struct *ms); } ++ 456 STD { int|sys|VNUM|my_syscall(struct my_struct *ms); } .Ed . .Ss Modifying Makefile.rump If the current syscall is rump, .Pa sys/rump/Makefile.rump must contain -.Ar XYZ +.Ar CNUM in the .Dv RUMP_NBCOMPAT variable. @@ -189,7 +225,7 @@ variable. If versioning structs, then modify .Pa sys/kern/makesyscalls.sh by adding and entry for -.Ft struct my_structXYZ +.Ft struct my_structCNUM type to .Va uncompattypes . .Pp @@ -223,26 +259,26 @@ and lives inside . .Ss Creating the compat current syscall The compat version of the current syscall has entry point -.Fn compat_XYZ_sys_my_syscall , +.Fn compat_CNUM_sys_my_syscall , and should be implemented in -.Pa sys/compat/common/my_file_XYZ.c +.Pa sys/compat/common/my_file_CNUM.c with the same semantics as the current syscall. Often this involves translating the arguments to the next syscall, and then calling that syscall's entry point. . .Ss Adding it to the compat module -.Pa sys/compat/common/my_file_XYZ.c +.Pa sys/compat/common/my_file_CNUM.c must contain an array of .Ft struct syscall_package that declares the mapping between syscall number and entry point, terminating in a zero element (see sample diff below). .Pp Additionally, -.Pa sys/compat/common/my_file_XYZ.c +.Pa sys/compat/common/my_file_CNUM.c must contain two functions, -.Fn my_file_XYZ_init +.Fn my_file_CNUM_init and -.Fn my_file_XYZ_fini +.Fn my_file_CNUM_fini that are used to initialize/clean up anything related to this syscall. At the minimum they must make calls to .Fn syscall_establish @@ -253,38 +289,38 @@ The stubs for these functions should be .Pa sys/compat/common/compat_mod.h . .Pp Overall, -.Pa sys/compat/common/my_file_XYZ.c +.Pa sys/compat/common/my_file_CNUM.c must at the minimum contain .Bd -literal -offset indent -static const struct syscall_package my_file_XYZ_syscalls[] = { - { SYS_compat_XYZ_my_syscall, 0, - (sy_call_t *)compat_XYZ_sys_my_syscall }, +static const struct syscall_package my_file_CNUM_syscalls[] = { + { SYS_compat_CNUM_my_syscall, 0, + (sy_call_t *)compat_CNUM_sys_my_syscall }, { 0, 0, NULL }, }; int -compat_XYZ_my_syscall(...) +compat_CNUM_my_syscall(...) { /* Compat implementation goes here. */ } int -my_file_XYZ_init(void) -{ return syscall_establish(NULL, my_file_XYZ_syscalls); } +my_file_CNUM_init(void) +{ return syscall_establish(NULL, my_file_CNUM_syscalls); } int -my_file_XYZ_fini(void) -{ return syscall_disestablish(NULL, my_file_XYZ_syscalls); } +my_file_CNUM_fini(void) +{ return syscall_disestablish(NULL, my_file_CNUM_syscalls); } .Ed .Pp Finally, -.Pa sys/compat/common/compat_XYZ_mod.c +.Pa sys/compat/common/compat_CNUM_mod.c needs to be modified to have its -.Fn compat_XYZ_init +.Fn compat_CNUM_init and -.Fn compat_XYZ_fini +.Fn compat_CNUM_fini functions call -.Fn my_file_XYZ_init +.Fn my_file_CNUM_init and -.Fn my_file_XYZ_fini +.Fn my_file_CNUM_fini respectively. . .Ss Modifying old compat syscalls