svn commit: r364513 - in head/sys: kern sys

Konstantin Belousov kib at FreeBSD.org
Sun Aug 23 19:43:52 UTC 2020


Author: kib
Date: Sun Aug 23 19:43:47 2020
New Revision: 364513
URL: https://svnweb.freebsd.org/changeset/base/364513

Log:
  kern_sharedpage.c: Add exec_sysvec_init_secondary() helper.
  
  It allows a sysent to share existing usermode data in shared page with
  other sysent, assuming ABI differences are not in the layout of the
  page.
  
  Tested by:	pho
  Sponsored by:	The FreeBSD Foundation
  Differential revision:	https://reviews.freebsd.org/D25273

Modified:
  head/sys/kern/kern_sharedpage.c
  head/sys/sys/sysent.h

Modified: head/sys/kern/kern_sharedpage.c
==============================================================================
--- head/sys/kern/kern_sharedpage.c	Sun Aug 23 19:42:48 2020	(r364512)
+++ head/sys/kern/kern_sharedpage.c	Sun Aug 23 19:43:47 2020	(r364513)
@@ -288,3 +288,21 @@ exec_sysvec_init(void *param)
 #endif
 	}
 }
+
+void
+exec_sysvec_init_secondary(struct sysentvec *sv, struct sysentvec *sv2)
+{
+	MPASS((sv2->sv_flags & SV_ABI_MASK) == (sv->sv_flags & SV_ABI_MASK));
+	MPASS((sv2->sv_flags & SV_TIMEKEEP) == (sv->sv_flags & SV_TIMEKEEP));
+	MPASS((sv2->sv_flags & SV_SHP) != 0 && (sv->sv_flags & SV_SHP) != 0);
+
+	sv2->sv_shared_page_obj = sv->sv_shared_page_obj;
+	sv2->sv_sigcode_base = sv2->sv_shared_page_base +
+	    (sv->sv_sigcode_base - sv->sv_shared_page_base);
+	if ((sv2->sv_flags & SV_ABI_MASK) != SV_ABI_FREEBSD)
+		return;
+	if ((sv2->sv_flags & SV_TIMEKEEP) != 0) {
+		sv2->sv_timekeep_base = sv2->sv_shared_page_base +
+		    (sv->sv_timekeep_base - sv->sv_shared_page_base);
+	}
+}

Modified: head/sys/sys/sysent.h
==============================================================================
--- head/sys/sys/sysent.h	Sun Aug 23 19:42:48 2020	(r364512)
+++ head/sys/sys/sysent.h	Sun Aug 23 19:43:47 2020	(r364513)
@@ -321,6 +321,7 @@ int shared_page_alloc(int size, int align);
 int shared_page_fill(int size, int align, const void *data);
 void shared_page_write(int base, int size, const void *data);
 void exec_sysvec_init(void *param);
+void exec_sysvec_init_secondary(struct sysentvec *sv, struct sysentvec *sv2);
 void exec_inittk(void);
 
 #define INIT_SYSENTVEC(name, sv)					\


More information about the svn-src-all mailing list