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