xref: /f-stack/lib/ff_glue.c (revision 2317ada5)
1a9643ea8Slogwang /*
2a9643ea8Slogwang  * Copyright (c) 2010 Kip Macy. All rights reserved.
3*2317ada5Sfengbojiang  * Copyright (C) 2017-2021 THL A29 Limited, a Tencent company.
4a9643ea8Slogwang  * All rights reserved.
5a9643ea8Slogwang  *
6a9643ea8Slogwang  * Redistribution and use in source and binary forms, with or without
7a9643ea8Slogwang  * modification, are permitted provided that the following conditions are met:
8a9643ea8Slogwang  *
9a9643ea8Slogwang  * 1. Redistributions of source code must retain the above copyright notice, this
10a9643ea8Slogwang  *   list of conditions and the following disclaimer.
11a9643ea8Slogwang  * 2. Redistributions in binary form must reproduce the above copyright notice,
12a9643ea8Slogwang  *   this list of conditions and the following disclaimer in the documentation
13a9643ea8Slogwang  *   and/or other materials provided with the distribution.
14a9643ea8Slogwang  *
15a9643ea8Slogwang  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
16a9643ea8Slogwang  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17a9643ea8Slogwang  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18a9643ea8Slogwang  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
19a9643ea8Slogwang  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20a9643ea8Slogwang  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21a9643ea8Slogwang  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
22a9643ea8Slogwang  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23a9643ea8Slogwang  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24a9643ea8Slogwang  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25a9643ea8Slogwang  *
26a9643ea8Slogwang  * Derived in part from libplebnet's pn_glue.c.
27a9643ea8Slogwang  */
28a9643ea8Slogwang 
29a9643ea8Slogwang #include <sys/cdefs.h>
30a9643ea8Slogwang #include <sys/param.h>
31a9643ea8Slogwang #include <sys/types.h>
32a9643ea8Slogwang #include <sys/kernel.h>
33a9643ea8Slogwang #include <sys/kthread.h>
34a9643ea8Slogwang #include <sys/event.h>
35a9643ea8Slogwang #include <sys/jail.h>
36a9643ea8Slogwang #include <sys/limits.h>
37a9643ea8Slogwang #include <sys/malloc.h>
38a9643ea8Slogwang #include <sys/refcount.h>
39a9643ea8Slogwang #include <sys/resourcevar.h>
40a9643ea8Slogwang #include <sys/sysctl.h>
41a9643ea8Slogwang #include <sys/sysent.h>
42a9643ea8Slogwang #include <sys/systm.h>
43a9643ea8Slogwang #include <sys/proc.h>
44a9643ea8Slogwang #include <sys/priv.h>
45a9643ea8Slogwang #include <sys/time.h>
46a9643ea8Slogwang #include <sys/ucred.h>
47a9643ea8Slogwang #include <sys/uio.h>
48a9643ea8Slogwang #include <sys/param.h>
49a9643ea8Slogwang #include <sys/bus.h>
50a9643ea8Slogwang #include <sys/buf.h>
51a9643ea8Slogwang #include <sys/file.h>
52a9643ea8Slogwang #include <sys/vmem.h>
53a9643ea8Slogwang #include <sys/mbuf.h>
54a9643ea8Slogwang #include <sys/smp.h>
55a9643ea8Slogwang #include <sys/sched.h>
5622ce4affSfengbojiang #include <sys/vmmeter.h>
5722ce4affSfengbojiang #include <sys/unpcb.h>
5822ce4affSfengbojiang #include <sys/eventfd.h>
5922ce4affSfengbojiang #include <sys/linker.h>
6022ce4affSfengbojiang #include <sys/sleepqueue.h>
61a9643ea8Slogwang 
62a9643ea8Slogwang #include <vm/vm.h>
63a9643ea8Slogwang #include <vm/vm_param.h>
64a9643ea8Slogwang #include <vm/pmap.h>
65a9643ea8Slogwang #include <vm/vm_object.h>
66a9643ea8Slogwang #include <vm/vm_map.h>
67a9643ea8Slogwang #include <vm/vm_extern.h>
6822ce4affSfengbojiang #include <vm/vm_domainset.h>
6922ce4affSfengbojiang #include <vm/vm_page.h>
7022ce4affSfengbojiang #include <vm/vm_pagequeue.h>
7122ce4affSfengbojiang 
7222ce4affSfengbojiang #include <netinet/in_systm.h>
7322ce4affSfengbojiang 
7422ce4affSfengbojiang #include <ck_epoch.h>
7522ce4affSfengbojiang #include <ck_stack.h>
76a9643ea8Slogwang 
77a9643ea8Slogwang #include "ff_host_interface.h"
78a9643ea8Slogwang 
79a9643ea8Slogwang int kstack_pages = KSTACK_PAGES;
80a9643ea8Slogwang SYSCTL_INT(_kern, OID_AUTO, kstack_pages, CTLFLAG_RD, &kstack_pages, 0,
81a9643ea8Slogwang     "Kernel stack size in pages");
82a9643ea8Slogwang 
8322ce4affSfengbojiang int __read_mostly vm_ndomains = 1;
8422ce4affSfengbojiang SYSCTL_INT(_vm, OID_AUTO, ndomains, CTLFLAG_RD,
8522ce4affSfengbojiang     &vm_ndomains, 0, "Number of physical memory domains available.");
8622ce4affSfengbojiang 
8722ce4affSfengbojiang #ifndef MAXMEMDOM
8822ce4affSfengbojiang #define MAXMEMDOM 1
8922ce4affSfengbojiang #endif
9022ce4affSfengbojiang 
9122ce4affSfengbojiang struct domainset __read_mostly domainset_fixed[MAXMEMDOM];
9222ce4affSfengbojiang struct domainset __read_mostly domainset_prefer[MAXMEMDOM];
9322ce4affSfengbojiang struct domainset __read_mostly domainset_roundrobin;
9422ce4affSfengbojiang 
9522ce4affSfengbojiang struct vm_domain vm_dom[MAXMEMDOM];
9622ce4affSfengbojiang 
9722ce4affSfengbojiang domainset_t __exclusive_cache_line vm_min_domains;
9822ce4affSfengbojiang 
99a9643ea8Slogwang int bootverbose;
100a9643ea8Slogwang 
101a9643ea8Slogwang SYSCTL_ROOT_NODE(0, sysctl, CTLFLAG_RW, 0, "Sysctl internal magic");
102a9643ea8Slogwang 
103a9643ea8Slogwang SYSCTL_ROOT_NODE(CTL_VFS, vfs, CTLFLAG_RW, 0, "File system");
104a9643ea8Slogwang 
105a9643ea8Slogwang SYSCTL_ROOT_NODE(CTL_KERN, kern, CTLFLAG_RW, 0, "High kernel, proc, limits &c");
106a9643ea8Slogwang 
107a9643ea8Slogwang SYSCTL_ROOT_NODE(CTL_NET, net, CTLFLAG_RW, 0, "Network, (see socket.h)");
108a9643ea8Slogwang 
109a9643ea8Slogwang SYSCTL_ROOT_NODE(CTL_MACHDEP, machdep, CTLFLAG_RW, 0, "machine dependent");
110a9643ea8Slogwang 
111a9643ea8Slogwang SYSCTL_ROOT_NODE(CTL_VM, vm, CTLFLAG_RW, 0, "Virtual memory");
112a9643ea8Slogwang 
113a9643ea8Slogwang SYSCTL_ROOT_NODE(CTL_DEBUG, debug, CTLFLAG_RW, 0, "Debugging");
114a9643ea8Slogwang 
115a9643ea8Slogwang SYSCTL_ROOT_NODE(OID_AUTO, security, CTLFLAG_RW, 0, "Security");
116a9643ea8Slogwang 
117a9643ea8Slogwang SYSCTL_NODE(_kern, OID_AUTO, features, CTLFLAG_RD, 0, "Kernel Features");
118a9643ea8Slogwang 
119a9643ea8Slogwang SYSCTL_NODE(_kern, KERN_PROC, proc, CTLFLAG_RD,  0, "Process table");
120a9643ea8Slogwang 
121a9643ea8Slogwang MALLOC_DEFINE(M_DEVBUF, "devbuf", "device driver memory");
122a9643ea8Slogwang MALLOC_DEFINE(M_TEMP, "temp", "misc temporary data buffers");
123a9643ea8Slogwang static MALLOC_DEFINE(M_CRED, "cred", "credentials");
124a9643ea8Slogwang static MALLOC_DEFINE(M_PLIMIT, "plimit", "plimit structures");
125a9643ea8Slogwang 
126a9643ea8Slogwang MALLOC_DEFINE(M_IP6OPT, "ip6opt", "IPv6 options");
127a9643ea8Slogwang 
128a9643ea8Slogwang static void configure_final(void *dummy);
129a9643ea8Slogwang 
130a9643ea8Slogwang SYSINIT(configure3, SI_SUB_CONFIGURE, SI_ORDER_ANY, configure_final, NULL);
131a9643ea8Slogwang 
132a9643ea8Slogwang volatile int ticks;
133a9643ea8Slogwang int cpu_disable_deep_sleep;
134a9643ea8Slogwang 
1351eaf0ac3Slogwang static int sysctl_kern_smp_active(SYSCTL_HANDLER_ARGS);
1361eaf0ac3Slogwang 
137a9643ea8Slogwang /* This is used in modules that need to work in both SMP and UP. */
138a9643ea8Slogwang cpuset_t all_cpus;
139a9643ea8Slogwang 
140e272b945Slogwang int mp_ncpus = 1;
141a9643ea8Slogwang /* export this for libkvm consumers. */
142a9643ea8Slogwang int mp_maxcpus = MAXCPU;
143a9643ea8Slogwang 
144a9643ea8Slogwang volatile int smp_started;
145a9643ea8Slogwang u_int mp_maxid;
146a9643ea8Slogwang 
1471eaf0ac3Slogwang static SYSCTL_NODE(_kern, OID_AUTO, smp, CTLFLAG_RD|CTLFLAG_CAPRD, NULL,
1481eaf0ac3Slogwang     "Kernel SMP");
1491eaf0ac3Slogwang 
1501eaf0ac3Slogwang SYSCTL_INT(_kern_smp, OID_AUTO, maxid, CTLFLAG_RD|CTLFLAG_CAPRD, &mp_maxid, 0,
1511eaf0ac3Slogwang     "Max CPU ID.");
1521eaf0ac3Slogwang 
1531eaf0ac3Slogwang SYSCTL_INT(_kern_smp, OID_AUTO, maxcpus, CTLFLAG_RD|CTLFLAG_CAPRD, &mp_maxcpus,
1541eaf0ac3Slogwang     0, "Max number of CPUs that the system was compiled for.");
1551eaf0ac3Slogwang 
1561eaf0ac3Slogwang SYSCTL_PROC(_kern_smp, OID_AUTO, active, CTLFLAG_RD | CTLTYPE_INT, NULL, 0,
1571eaf0ac3Slogwang     sysctl_kern_smp_active, "I", "Indicates system is running in SMP mode");
1581eaf0ac3Slogwang 
1591eaf0ac3Slogwang int smp_disabled = 0;    /* has smp been disabled? */
1601eaf0ac3Slogwang SYSCTL_INT(_kern_smp, OID_AUTO, disabled, CTLFLAG_RDTUN|CTLFLAG_CAPRD,
1611eaf0ac3Slogwang     &smp_disabled, 0, "SMP has been disabled from the loader");
1621eaf0ac3Slogwang 
1631eaf0ac3Slogwang int smp_cpus = 1;    /* how many cpu's running */
1641eaf0ac3Slogwang SYSCTL_INT(_kern_smp, OID_AUTO, cpus, CTLFLAG_RD|CTLFLAG_CAPRD, &smp_cpus, 0,
1651eaf0ac3Slogwang     "Number of CPUs online");
1661eaf0ac3Slogwang 
1671eaf0ac3Slogwang int smp_topology = 0;    /* Which topology we're using. */
1681eaf0ac3Slogwang SYSCTL_INT(_kern_smp, OID_AUTO, topology, CTLFLAG_RDTUN, &smp_topology, 0,
1691eaf0ac3Slogwang     "Topology override setting; 0 is default provided by hardware.");
1701eaf0ac3Slogwang 
17122ce4affSfengbojiang u_int vn_lock_pair_pause_max = 1; // ff_global_cfg.freebsd.hz / 100;
17222ce4affSfengbojiang SYSCTL_UINT(_debug, OID_AUTO, vn_lock_pair_pause_max, CTLFLAG_RW,
17322ce4affSfengbojiang     &vn_lock_pair_pause_max, 0,
17422ce4affSfengbojiang     "Max ticks for vn_lock_pair deadlock avoidance sleep");
1751eaf0ac3Slogwang 
176a9643ea8Slogwang long first_page = 0;
177a9643ea8Slogwang 
178a9643ea8Slogwang struct vmmeter vm_cnt;
179a9643ea8Slogwang vm_map_t kernel_map = 0;
180a9643ea8Slogwang vm_map_t kmem_map = 0;
181a9643ea8Slogwang 
182a9643ea8Slogwang vmem_t *kernel_arena = NULL;
183a9643ea8Slogwang vmem_t *kmem_arena = NULL;
184a9643ea8Slogwang 
185a9643ea8Slogwang struct vm_object kernel_object_store;
186a9643ea8Slogwang struct vm_object kmem_object_store;
187a9643ea8Slogwang 
188a9643ea8Slogwang struct filterops fs_filtops;
189a9643ea8Slogwang struct filterops sig_filtops;
190a9643ea8Slogwang 
191a9643ea8Slogwang int cold = 1;
192a9643ea8Slogwang 
193a9643ea8Slogwang int unmapped_buf_allowed = 1;
194a9643ea8Slogwang 
195a9643ea8Slogwang int cpu_deepest_sleep = 0;    /* Deepest Cx state available. */
196a9643ea8Slogwang int cpu_disable_c2_sleep = 0; /* Timer dies in C2. */
197a9643ea8Slogwang int cpu_disable_c3_sleep = 0; /* Timer dies in C3. */
198a9643ea8Slogwang 
19922ce4affSfengbojiang u_char __read_frequently kdb_active = 0;
20022ce4affSfengbojiang 
201a9643ea8Slogwang static void timevalfix(struct timeval *);
202a9643ea8Slogwang 
2031eaf0ac3Slogwang /* Extra care is taken with this sysctl because the data type is volatile */
2041eaf0ac3Slogwang static int
sysctl_kern_smp_active(SYSCTL_HANDLER_ARGS)2051eaf0ac3Slogwang sysctl_kern_smp_active(SYSCTL_HANDLER_ARGS)
2061eaf0ac3Slogwang {
2071eaf0ac3Slogwang     int error, active;
2081eaf0ac3Slogwang 
2091eaf0ac3Slogwang     active = smp_started;
2101eaf0ac3Slogwang     error = SYSCTL_OUT(req, &active, sizeof(active));
2111eaf0ac3Slogwang     return (error);
2121eaf0ac3Slogwang }
2131eaf0ac3Slogwang 
214a9643ea8Slogwang void
procinit()215a9643ea8Slogwang procinit()
216a9643ea8Slogwang {
217a9643ea8Slogwang     sx_init(&allproc_lock, "allproc");
218a9643ea8Slogwang     LIST_INIT(&allproc);
219a9643ea8Slogwang }
220a9643ea8Slogwang 
221a9643ea8Slogwang 
222a9643ea8Slogwang /*
223a9643ea8Slogwang  * Find a prison that is a descendant of mypr.  Returns a locked prison or NULL.
224a9643ea8Slogwang  */
225a9643ea8Slogwang struct prison *
prison_find_child(struct prison * mypr,int prid)226a9643ea8Slogwang prison_find_child(struct prison *mypr, int prid)
227a9643ea8Slogwang {
228a9643ea8Slogwang     return (NULL);
229a9643ea8Slogwang }
230a9643ea8Slogwang 
231a9643ea8Slogwang void
prison_free(struct prison * pr)232a9643ea8Slogwang prison_free(struct prison *pr)
233a9643ea8Slogwang {
234a9643ea8Slogwang 
235a9643ea8Slogwang }
236a9643ea8Slogwang 
237a9643ea8Slogwang void
prison_hold_locked(struct prison * pr)238a9643ea8Slogwang prison_hold_locked(struct prison *pr)
239a9643ea8Slogwang {
240a9643ea8Slogwang 
241a9643ea8Slogwang }
242a9643ea8Slogwang 
243a9643ea8Slogwang int
prison_if(struct ucred * cred,const struct sockaddr * sa)24422ce4affSfengbojiang prison_if(struct ucred *cred, const struct sockaddr *sa)
245a9643ea8Slogwang {
246a9643ea8Slogwang     return (0);
247a9643ea8Slogwang }
248a9643ea8Slogwang 
249a9643ea8Slogwang int
prison_check_af(struct ucred * cred,int af)250a9643ea8Slogwang prison_check_af(struct ucred *cred, int af)
251a9643ea8Slogwang {
252a9643ea8Slogwang     return (0);
253a9643ea8Slogwang }
254a9643ea8Slogwang 
255a9643ea8Slogwang int
prison_check_ip4(const struct ucred * cred,const struct in_addr * ia)256a9643ea8Slogwang prison_check_ip4(const struct ucred *cred, const struct in_addr *ia)
257a9643ea8Slogwang {
258a9643ea8Slogwang     return (0);
259a9643ea8Slogwang }
260a9643ea8Slogwang 
261a9643ea8Slogwang int
prison_equal_ip4(struct prison * pr1,struct prison * pr2)262a9643ea8Slogwang prison_equal_ip4(struct prison *pr1, struct prison *pr2)
263a9643ea8Slogwang {
264a9643ea8Slogwang     return (1);
265a9643ea8Slogwang }
266a9643ea8Slogwang 
267a9643ea8Slogwang #ifdef INET6
268a9643ea8Slogwang int
prison_check_ip6(const struct ucred * cred,const struct in6_addr * ia)26922ce4affSfengbojiang prison_check_ip6(const struct ucred *cred, const struct in6_addr *ia)
270a9643ea8Slogwang {
271a9643ea8Slogwang     return (0);
272a9643ea8Slogwang }
273a9643ea8Slogwang 
274a9643ea8Slogwang int
prison_equal_ip6(struct prison * pr1,struct prison * pr2)275a9643ea8Slogwang prison_equal_ip6(struct prison *pr1, struct prison *pr2)
276a9643ea8Slogwang {
277a9643ea8Slogwang     return (1);
278a9643ea8Slogwang }
279a9643ea8Slogwang #endif
280a9643ea8Slogwang 
281a9643ea8Slogwang /*
282a9643ea8Slogwang  * See if a prison has the specific flag set.
283a9643ea8Slogwang  */
284a9643ea8Slogwang int
prison_flag(struct ucred * cred,unsigned flag)285a9643ea8Slogwang prison_flag(struct ucred *cred, unsigned flag)
286a9643ea8Slogwang {
287a9643ea8Slogwang     /* This is an atomic read, so no locking is necessary. */
288a9643ea8Slogwang     return (flag & PR_HOST);
289a9643ea8Slogwang }
290a9643ea8Slogwang 
291a9643ea8Slogwang int
prison_get_ip4(struct ucred * cred,struct in_addr * ia)292a9643ea8Slogwang prison_get_ip4(struct ucred *cred, struct in_addr *ia)
293a9643ea8Slogwang {
294a9643ea8Slogwang     return (0);
295a9643ea8Slogwang }
296a9643ea8Slogwang 
297a9643ea8Slogwang int
prison_local_ip4(struct ucred * cred,struct in_addr * ia)298a9643ea8Slogwang prison_local_ip4(struct ucred *cred, struct in_addr *ia)
299a9643ea8Slogwang {
300a9643ea8Slogwang     return (0);
301a9643ea8Slogwang }
302a9643ea8Slogwang 
303a9643ea8Slogwang int
prison_remote_ip4(struct ucred * cred,struct in_addr * ia)304a9643ea8Slogwang prison_remote_ip4(struct ucred *cred, struct in_addr *ia)
305a9643ea8Slogwang {
306a9643ea8Slogwang     return (0);
307a9643ea8Slogwang }
308a9643ea8Slogwang 
309a9643ea8Slogwang #ifdef INET6
310a9643ea8Slogwang int
prison_get_ip6(struct ucred * cred,struct in6_addr * ia)311a9643ea8Slogwang prison_get_ip6(struct ucred *cred, struct in6_addr *ia)
312a9643ea8Slogwang {
313a9643ea8Slogwang     return (0);
314a9643ea8Slogwang }
315a9643ea8Slogwang 
316a9643ea8Slogwang int
prison_local_ip6(struct ucred * cred,struct in6_addr * ia,int other)317a9643ea8Slogwang prison_local_ip6(struct ucred *cred, struct in6_addr *ia, int other)
318a9643ea8Slogwang {
319a9643ea8Slogwang     return (0);
320a9643ea8Slogwang }
321a9643ea8Slogwang 
322a9643ea8Slogwang int
prison_remote_ip6(struct ucred * cred,struct in6_addr * ia)323a9643ea8Slogwang prison_remote_ip6(struct ucred *cred, struct in6_addr *ia)
324a9643ea8Slogwang {
325a9643ea8Slogwang     return (0);
326a9643ea8Slogwang }
327a9643ea8Slogwang #endif
328a9643ea8Slogwang 
329a9643ea8Slogwang int
prison_saddrsel_ip4(struct ucred * cred,struct in_addr * ia)330a9643ea8Slogwang prison_saddrsel_ip4(struct ucred *cred, struct in_addr *ia)
331a9643ea8Slogwang {
332a9643ea8Slogwang     /* not jailed */
333a9643ea8Slogwang     return (1);
334a9643ea8Slogwang }
335a9643ea8Slogwang 
336a9643ea8Slogwang #ifdef INET6
337a9643ea8Slogwang int
prison_saddrsel_ip6(struct ucred * cred,struct in6_addr * ia)338a9643ea8Slogwang prison_saddrsel_ip6(struct ucred *cred, struct in6_addr *ia)
339a9643ea8Slogwang {
340a9643ea8Slogwang     /* not jailed */
341a9643ea8Slogwang     return (1);
342a9643ea8Slogwang }
343a9643ea8Slogwang #endif
344a9643ea8Slogwang 
34522ce4affSfengbojiang #if 0
346a9643ea8Slogwang int
347a9643ea8Slogwang jailed(struct ucred *cred)
348a9643ea8Slogwang {
349a9643ea8Slogwang     return (0);
350a9643ea8Slogwang }
35122ce4affSfengbojiang #endif
352a9643ea8Slogwang 
353a9643ea8Slogwang /*
354a9643ea8Slogwang  * Return 1 if the passed credential is in a jail and that jail does not
355a9643ea8Slogwang  * have its own virtual network stack, otherwise 0.
356a9643ea8Slogwang  */
357a9643ea8Slogwang int
jailed_without_vnet(struct ucred * cred)358a9643ea8Slogwang jailed_without_vnet(struct ucred *cred)
359a9643ea8Slogwang {
360a9643ea8Slogwang     return (0);
361a9643ea8Slogwang }
362a9643ea8Slogwang 
363a9643ea8Slogwang int
priv_check(struct thread * td,int priv)364a9643ea8Slogwang priv_check(struct thread *td, int priv)
365a9643ea8Slogwang {
366a9643ea8Slogwang     return (0);
367a9643ea8Slogwang }
368a9643ea8Slogwang 
369a9643ea8Slogwang int
priv_check_cred(struct ucred * cred,int priv)37022ce4affSfengbojiang priv_check_cred(struct ucred *cred, int priv)
371a9643ea8Slogwang {
372a9643ea8Slogwang     return (0);
373a9643ea8Slogwang }
374a9643ea8Slogwang 
375a9643ea8Slogwang 
376a9643ea8Slogwang int
vslock(void * addr,size_t len)377a9643ea8Slogwang vslock(void *addr, size_t len)
378a9643ea8Slogwang {
379a9643ea8Slogwang     return (0);
380a9643ea8Slogwang }
381a9643ea8Slogwang 
382a9643ea8Slogwang void
vsunlock(void * addr,size_t len)383a9643ea8Slogwang vsunlock(void *addr, size_t len)
384a9643ea8Slogwang {
385a9643ea8Slogwang 
386a9643ea8Slogwang }
387a9643ea8Slogwang 
388a9643ea8Slogwang 
389a9643ea8Slogwang /*
390a9643ea8Slogwang  * Check that a proposed value to load into the .it_value or
391a9643ea8Slogwang  * .it_interval part of an interval timer is acceptable, and
392a9643ea8Slogwang  * fix it to have at least minimal value (i.e. if it is less
393a9643ea8Slogwang  * than the resolution of the clock, round it up.)
394a9643ea8Slogwang  */
395a9643ea8Slogwang int
itimerfix(struct timeval * tv)396a9643ea8Slogwang itimerfix(struct timeval *tv)
397a9643ea8Slogwang {
398a9643ea8Slogwang 
399a9643ea8Slogwang     if (tv->tv_sec < 0 || tv->tv_usec < 0 || tv->tv_usec >= 1000000)
400a9643ea8Slogwang         return (EINVAL);
401a9643ea8Slogwang     if (tv->tv_sec == 0 && tv->tv_usec != 0 && tv->tv_usec < tick)
402a9643ea8Slogwang         tv->tv_usec = tick;
403a9643ea8Slogwang     return (0);
404a9643ea8Slogwang }
405a9643ea8Slogwang 
406a9643ea8Slogwang /*
407a9643ea8Slogwang  * Decrement an interval timer by a specified number
408a9643ea8Slogwang  * of microseconds, which must be less than a second,
409a9643ea8Slogwang  * i.e. < 1000000.  If the timer expires, then reload
410a9643ea8Slogwang  * it.  In this case, carry over (usec - old value) to
411a9643ea8Slogwang  * reduce the value reloaded into the timer so that
412a9643ea8Slogwang  * the timer does not drift.  This routine assumes
413a9643ea8Slogwang  * that it is called in a context where the timers
414a9643ea8Slogwang  * on which it is operating cannot change in value.
415a9643ea8Slogwang  */
416a9643ea8Slogwang int
itimerdecr(struct itimerval * itp,int usec)417a9643ea8Slogwang itimerdecr(struct itimerval *itp, int usec)
418a9643ea8Slogwang {
419a9643ea8Slogwang     if (itp->it_value.tv_usec < usec) {
420a9643ea8Slogwang         if (itp->it_value.tv_sec == 0) {
421a9643ea8Slogwang             /* expired, and already in next interval */
422a9643ea8Slogwang             usec -= itp->it_value.tv_usec;
423a9643ea8Slogwang             goto expire;
424a9643ea8Slogwang         }
425a9643ea8Slogwang         itp->it_value.tv_usec += 1000000;
426a9643ea8Slogwang         itp->it_value.tv_sec--;
427a9643ea8Slogwang     }
428a9643ea8Slogwang     itp->it_value.tv_usec -= usec;
429a9643ea8Slogwang     usec = 0;
430a9643ea8Slogwang     if (timevalisset(&itp->it_value))
431a9643ea8Slogwang         return (1);
432a9643ea8Slogwang     /* expired, exactly at end of interval */
433a9643ea8Slogwang expire:
434a9643ea8Slogwang     if (timevalisset(&itp->it_interval)) {
435a9643ea8Slogwang         itp->it_value = itp->it_interval;
436a9643ea8Slogwang         itp->it_value.tv_usec -= usec;
437a9643ea8Slogwang         if (itp->it_value.tv_usec < 0) {
438a9643ea8Slogwang             itp->it_value.tv_usec += 1000000;
439a9643ea8Slogwang             itp->it_value.tv_sec--;
440a9643ea8Slogwang         }
441a9643ea8Slogwang     } else
442a9643ea8Slogwang         itp->it_value.tv_usec = 0;        /* sec is already 0 */
443a9643ea8Slogwang     return (0);
444a9643ea8Slogwang }
445a9643ea8Slogwang 
446a9643ea8Slogwang /*
447a9643ea8Slogwang  * Add and subtract routines for timevals.
448a9643ea8Slogwang  * N.B.: subtract routine doesn't deal with
449a9643ea8Slogwang  * results which are before the beginning,
450a9643ea8Slogwang  * it just gets very confused in this case.
451a9643ea8Slogwang  * Caveat emptor.
452a9643ea8Slogwang  */
453a9643ea8Slogwang void
timevaladd(struct timeval * t1,const struct timeval * t2)454a9643ea8Slogwang timevaladd(struct timeval *t1, const struct timeval *t2)
455a9643ea8Slogwang {
456a9643ea8Slogwang     t1->tv_sec += t2->tv_sec;
457a9643ea8Slogwang     t1->tv_usec += t2->tv_usec;
458a9643ea8Slogwang     timevalfix(t1);
459a9643ea8Slogwang }
460a9643ea8Slogwang 
461a9643ea8Slogwang void
timevalsub(struct timeval * t1,const struct timeval * t2)462a9643ea8Slogwang timevalsub(struct timeval *t1, const struct timeval *t2)
463a9643ea8Slogwang {
464a9643ea8Slogwang     t1->tv_sec -= t2->tv_sec;
465a9643ea8Slogwang     t1->tv_usec -= t2->tv_usec;
466a9643ea8Slogwang     timevalfix(t1);
467a9643ea8Slogwang }
468a9643ea8Slogwang 
469a9643ea8Slogwang static void
timevalfix(struct timeval * t1)470a9643ea8Slogwang timevalfix(struct timeval *t1)
471a9643ea8Slogwang {
472a9643ea8Slogwang     if (t1->tv_usec < 0) {
473a9643ea8Slogwang         t1->tv_sec--;
474a9643ea8Slogwang         t1->tv_usec += 1000000;
475a9643ea8Slogwang     }
476a9643ea8Slogwang     if (t1->tv_usec >= 1000000) {
477a9643ea8Slogwang         t1->tv_sec++;
478a9643ea8Slogwang         t1->tv_usec -= 1000000;
479a9643ea8Slogwang     }
480a9643ea8Slogwang }
481a9643ea8Slogwang 
482a9643ea8Slogwang /*
483a9643ea8Slogwang  * ratecheck(): simple time-based rate-limit checking.
484a9643ea8Slogwang  */
485a9643ea8Slogwang int
ratecheck(struct timeval * lasttime,const struct timeval * mininterval)486a9643ea8Slogwang ratecheck(struct timeval *lasttime, const struct timeval *mininterval)
487a9643ea8Slogwang {
488a9643ea8Slogwang     struct timeval tv, delta;
489a9643ea8Slogwang     int rv = 0;
490a9643ea8Slogwang 
491a9643ea8Slogwang     getmicrouptime(&tv);        /* NB: 10ms precision */
492a9643ea8Slogwang     delta = tv;
493a9643ea8Slogwang     timevalsub(&delta, lasttime);
494a9643ea8Slogwang 
495a9643ea8Slogwang     /*
496a9643ea8Slogwang      * check for 0,0 is so that the message will be seen at least once,
497a9643ea8Slogwang      * even if interval is huge.
498a9643ea8Slogwang      */
499a9643ea8Slogwang     if (timevalcmp(&delta, mininterval, >=) ||
500a9643ea8Slogwang         (lasttime->tv_sec == 0 && lasttime->tv_usec == 0)) {
501a9643ea8Slogwang         *lasttime = tv;
502a9643ea8Slogwang         rv = 1;
503a9643ea8Slogwang     }
504a9643ea8Slogwang 
505a9643ea8Slogwang     return (rv);
506a9643ea8Slogwang }
507a9643ea8Slogwang 
508a9643ea8Slogwang /*
509a9643ea8Slogwang  * ppsratecheck(): packets (or events) per second limitation.
510a9643ea8Slogwang  *
511a9643ea8Slogwang  * Return 0 if the limit is to be enforced (e.g. the caller
512a9643ea8Slogwang  * should drop a packet because of the rate limitation).
513a9643ea8Slogwang  *
514a9643ea8Slogwang  * maxpps of 0 always causes zero to be returned.  maxpps of -1
515a9643ea8Slogwang  * always causes 1 to be returned; this effectively defeats rate
516a9643ea8Slogwang  * limiting.
517a9643ea8Slogwang  *
518a9643ea8Slogwang  * Note that we maintain the struct timeval for compatibility
519a9643ea8Slogwang  * with other bsd systems.  We reuse the storage and just monitor
520a9643ea8Slogwang  * clock ticks for minimal overhead.
521a9643ea8Slogwang  */
522a9643ea8Slogwang int
ppsratecheck(struct timeval * lasttime,int * curpps,int maxpps)523a9643ea8Slogwang ppsratecheck(struct timeval *lasttime, int *curpps, int maxpps)
524a9643ea8Slogwang {
525a9643ea8Slogwang     int now;
526a9643ea8Slogwang 
527a9643ea8Slogwang     /*
528a9643ea8Slogwang      * Reset the last time and counter if this is the first call
529a9643ea8Slogwang      * or more than a second has passed since the last update of
530a9643ea8Slogwang      * lasttime.
531a9643ea8Slogwang      */
532a9643ea8Slogwang     now = ticks;
533a9643ea8Slogwang     if (lasttime->tv_sec == 0 || (u_int)(now - lasttime->tv_sec) >= hz) {
534a9643ea8Slogwang         lasttime->tv_sec = now;
535a9643ea8Slogwang         *curpps = 1;
536a9643ea8Slogwang         return (maxpps != 0);
537a9643ea8Slogwang     } else {
538a9643ea8Slogwang         (*curpps)++;        /* NB: ignore potential overflow */
539a9643ea8Slogwang         return (maxpps < 0 || *curpps < maxpps);
540a9643ea8Slogwang     }
541a9643ea8Slogwang }
542a9643ea8Slogwang 
543a9643ea8Slogwang /*
544a9643ea8Slogwang  * Compute number of ticks in the specified amount of time.
545a9643ea8Slogwang  */
546a9643ea8Slogwang int
tvtohz(tv)547a9643ea8Slogwang tvtohz(tv)
548a9643ea8Slogwang     struct timeval *tv;
549a9643ea8Slogwang {
550a9643ea8Slogwang     register unsigned long ticks;
551a9643ea8Slogwang     register long sec, usec;
552a9643ea8Slogwang 
553a9643ea8Slogwang     /*
554a9643ea8Slogwang      * If the number of usecs in the whole seconds part of the time
555a9643ea8Slogwang      * difference fits in a long, then the total number of usecs will
556a9643ea8Slogwang      * fit in an unsigned long.  Compute the total and convert it to
557a9643ea8Slogwang      * ticks, rounding up and adding 1 to allow for the current tick
558a9643ea8Slogwang      * to expire.  Rounding also depends on unsigned long arithmetic
559a9643ea8Slogwang      * to avoid overflow.
560a9643ea8Slogwang      *
561a9643ea8Slogwang      * Otherwise, if the number of ticks in the whole seconds part of
562a9643ea8Slogwang      * the time difference fits in a long, then convert the parts to
563a9643ea8Slogwang      * ticks separately and add, using similar rounding methods and
564a9643ea8Slogwang      * overflow avoidance.  This method would work in the previous
565a9643ea8Slogwang      * case but it is slightly slower and assumes that hz is integral.
566a9643ea8Slogwang      *
567a9643ea8Slogwang      * Otherwise, round the time difference down to the maximum
568a9643ea8Slogwang      * representable value.
569a9643ea8Slogwang      *
570a9643ea8Slogwang      * If ints have 32 bits, then the maximum value for any timeout in
571a9643ea8Slogwang      * 10ms ticks is 248 days.
572a9643ea8Slogwang      */
573a9643ea8Slogwang     sec = tv->tv_sec;
574a9643ea8Slogwang     usec = tv->tv_usec;
575a9643ea8Slogwang     if (usec < 0) {
576a9643ea8Slogwang         sec--;
577a9643ea8Slogwang         usec += 1000000;
578a9643ea8Slogwang     }
579a9643ea8Slogwang     if (sec < 0) {
580a9643ea8Slogwang #ifdef DIAGNOSTIC
581a9643ea8Slogwang         if (usec > 0) {
582a9643ea8Slogwang             sec++;
583a9643ea8Slogwang             usec -= 1000000;
584a9643ea8Slogwang         }
585a9643ea8Slogwang         printf("tvotohz: negative time difference %ld sec %ld usec\n",
586a9643ea8Slogwang                sec, usec);
587a9643ea8Slogwang #endif
588a9643ea8Slogwang         ticks = 1;
589a9643ea8Slogwang     } else if (sec <= LONG_MAX / 1000000)
590a9643ea8Slogwang         ticks = (sec * 1000000 + (unsigned long)usec + (tick - 1))
591a9643ea8Slogwang             / tick + 1;
592a9643ea8Slogwang     else if (sec <= LONG_MAX / hz)
593a9643ea8Slogwang         ticks = sec * hz
594a9643ea8Slogwang             + ((unsigned long)usec + (tick - 1)) / tick + 1;
595a9643ea8Slogwang     else
596a9643ea8Slogwang         ticks = LONG_MAX;
597a9643ea8Slogwang     if (ticks > INT_MAX)
598a9643ea8Slogwang         ticks = INT_MAX;
599a9643ea8Slogwang     return ((int)ticks);
600a9643ea8Slogwang }
601a9643ea8Slogwang 
602a9643ea8Slogwang int
copyin(const void * uaddr,void * kaddr,size_t len)603a9643ea8Slogwang copyin(const void *uaddr, void *kaddr, size_t len)
604a9643ea8Slogwang {
605a9643ea8Slogwang     memcpy(kaddr, uaddr, len);
606a9643ea8Slogwang     return (0);
607a9643ea8Slogwang }
608a9643ea8Slogwang 
609a9643ea8Slogwang int
copyout(const void * kaddr,void * uaddr,size_t len)610a9643ea8Slogwang copyout(const void *kaddr, void *uaddr, size_t len)
611a9643ea8Slogwang {
612a9643ea8Slogwang     memcpy(uaddr, kaddr, len);
613a9643ea8Slogwang     return (0);
614a9643ea8Slogwang }
615a9643ea8Slogwang 
61622ce4affSfengbojiang #if 0
617a9643ea8Slogwang int
618a9643ea8Slogwang copystr(const void *kfaddr, void *kdaddr, size_t len, size_t *done)
619a9643ea8Slogwang {
620a9643ea8Slogwang     size_t bytes;
621a9643ea8Slogwang 
622a9643ea8Slogwang     bytes = strlcpy(kdaddr, kfaddr, len);
623a9643ea8Slogwang     if (done != NULL)
624a9643ea8Slogwang         *done = bytes;
625a9643ea8Slogwang 
626a9643ea8Slogwang     return (0);
627a9643ea8Slogwang }
62822ce4affSfengbojiang #endif
629a9643ea8Slogwang 
630a9643ea8Slogwang int
copyinstr(const void * uaddr,void * kaddr,size_t len,size_t * done)631a9643ea8Slogwang copyinstr(const void *uaddr, void *kaddr, size_t len, size_t *done)
632a9643ea8Slogwang {
633a9643ea8Slogwang     size_t bytes;
634a9643ea8Slogwang 
635a9643ea8Slogwang     bytes = strlcpy(kaddr, uaddr, len);
636a9643ea8Slogwang     if (done != NULL)
637a9643ea8Slogwang         *done = bytes;
638a9643ea8Slogwang 
639a9643ea8Slogwang     return (0);
640a9643ea8Slogwang }
641a9643ea8Slogwang 
642a9643ea8Slogwang int
copyiniov(const struct iovec * iovp,u_int iovcnt,struct iovec ** iov,int error)643a9643ea8Slogwang copyiniov(const struct iovec *iovp, u_int iovcnt, struct iovec **iov, int error)
644a9643ea8Slogwang {
645a9643ea8Slogwang     u_int iovlen;
646a9643ea8Slogwang 
647a9643ea8Slogwang     *iov = NULL;
648a9643ea8Slogwang     if (iovcnt > UIO_MAXIOV)
649a9643ea8Slogwang         return (error);
650a9643ea8Slogwang     iovlen = iovcnt * sizeof (struct iovec);
651a9643ea8Slogwang     *iov = malloc(iovlen, M_IOV, M_WAITOK);
652a9643ea8Slogwang     error = copyin(iovp, *iov, iovlen);
653a9643ea8Slogwang     if (error) {
654a9643ea8Slogwang         free(*iov, M_IOV);
655a9643ea8Slogwang         *iov = NULL;
656a9643ea8Slogwang     }
657a9643ea8Slogwang     return (error);
658a9643ea8Slogwang }
659a9643ea8Slogwang 
660a9643ea8Slogwang int
subyte(volatile void * base,int byte)661a9643ea8Slogwang subyte(volatile void *base, int byte)
662a9643ea8Slogwang {
663a9643ea8Slogwang     *(volatile char *)base = (uint8_t)byte;
664a9643ea8Slogwang     return (0);
665a9643ea8Slogwang }
666a9643ea8Slogwang 
667a9643ea8Slogwang static inline int
chglimit(struct uidinfo * uip,long * limit,int diff,rlim_t max,const char * name)668a9643ea8Slogwang chglimit(struct uidinfo *uip, long *limit, int diff, rlim_t max, const char *name)
669a9643ea8Slogwang {
670a9643ea8Slogwang     /* Don't allow them to exceed max, but allow subtraction. */
671a9643ea8Slogwang     if (diff > 0 && max != 0) {
672a9643ea8Slogwang         if (atomic_fetchadd_long(limit, (long)diff) + diff > max) {
673a9643ea8Slogwang             atomic_subtract_long(limit, (long)diff);
674a9643ea8Slogwang             return (0);
675a9643ea8Slogwang         }
676a9643ea8Slogwang     } else {
677a9643ea8Slogwang         atomic_add_long(limit, (long)diff);
678a9643ea8Slogwang         if (*limit < 0)
679a9643ea8Slogwang             printf("negative %s for uid = %d\n", name, uip->ui_uid);
680a9643ea8Slogwang     }
681a9643ea8Slogwang     return (1);
682a9643ea8Slogwang }
683a9643ea8Slogwang 
684a9643ea8Slogwang /*
685a9643ea8Slogwang  * Change the count associated with number of processes
686a9643ea8Slogwang  * a given user is using.  When 'max' is 0, don't enforce a limit
687a9643ea8Slogwang  */
688a9643ea8Slogwang int
chgproccnt(struct uidinfo * uip,int diff,rlim_t max)689a9643ea8Slogwang chgproccnt(struct uidinfo *uip, int diff, rlim_t max)
690a9643ea8Slogwang {
691a9643ea8Slogwang     return (chglimit(uip, &uip->ui_proccnt, diff, max, "proccnt"));
692a9643ea8Slogwang }
693a9643ea8Slogwang 
694a9643ea8Slogwang /*
695a9643ea8Slogwang  * Change the total socket buffer size a user has used.
696a9643ea8Slogwang  */
697a9643ea8Slogwang int
chgsbsize(struct uidinfo * uip,u_int * hiwat,u_int to,rlim_t max)698a9643ea8Slogwang chgsbsize(struct uidinfo *uip, u_int *hiwat, u_int to, rlim_t max)
699a9643ea8Slogwang {
700a9643ea8Slogwang     int diff, rv;
701a9643ea8Slogwang 
702a9643ea8Slogwang     diff = to - *hiwat;
703a9643ea8Slogwang     if (diff > 0 && max == 0) {
704a9643ea8Slogwang         rv = 0;
705a9643ea8Slogwang     } else {
706a9643ea8Slogwang         rv = chglimit(uip, &uip->ui_sbsize, diff, max, "sbsize");
707a9643ea8Slogwang         if (rv != 0)
708a9643ea8Slogwang             *hiwat = to;
709a9643ea8Slogwang     }
710a9643ea8Slogwang     return (rv);
711a9643ea8Slogwang }
712a9643ea8Slogwang 
713a9643ea8Slogwang /*
714a9643ea8Slogwang  * Change the count associated with number of pseudo-terminals
715a9643ea8Slogwang  * a given user is using.  When 'max' is 0, don't enforce a limit
716a9643ea8Slogwang  */
717a9643ea8Slogwang int
chgptscnt(struct uidinfo * uip,int diff,rlim_t max)718a9643ea8Slogwang chgptscnt(struct uidinfo *uip, int diff, rlim_t max)
719a9643ea8Slogwang {
720a9643ea8Slogwang     return (chglimit(uip, &uip->ui_ptscnt, diff, max, "ptscnt"));
721a9643ea8Slogwang }
722a9643ea8Slogwang 
723a9643ea8Slogwang int
chgkqcnt(struct uidinfo * uip,int diff,rlim_t max)724a9643ea8Slogwang chgkqcnt(struct uidinfo *uip, int diff, rlim_t max)
725a9643ea8Slogwang {
726a9643ea8Slogwang     return (chglimit(uip, &uip->ui_kqcnt, diff, max, "kqcnt"));
727a9643ea8Slogwang }
728a9643ea8Slogwang 
729a9643ea8Slogwang int
chgumtxcnt(struct uidinfo * uip,int diff,rlim_t max)730a9643ea8Slogwang chgumtxcnt(struct uidinfo *uip, int diff, rlim_t max)
731a9643ea8Slogwang {
732a9643ea8Slogwang     return (chglimit(uip, &uip->ui_umtxcnt, diff, max, "umtxcnt"));
733a9643ea8Slogwang }
734a9643ea8Slogwang 
735a9643ea8Slogwang /*
736a9643ea8Slogwang  * Allocate a new resource limits structure and initialize its
737a9643ea8Slogwang  * reference count and mutex pointer.
738a9643ea8Slogwang  */
739a9643ea8Slogwang struct plimit *
lim_alloc()740a9643ea8Slogwang lim_alloc()
741a9643ea8Slogwang {
742a9643ea8Slogwang     struct plimit *limp;
743a9643ea8Slogwang 
744a9643ea8Slogwang     limp = malloc(sizeof(struct plimit), M_PLIMIT, M_WAITOK);
745a9643ea8Slogwang     refcount_init(&limp->pl_refcnt, 1);
746a9643ea8Slogwang     return (limp);
747a9643ea8Slogwang }
748a9643ea8Slogwang 
749a9643ea8Slogwang struct plimit *
lim_hold(struct plimit * limp)750a9643ea8Slogwang lim_hold(struct plimit *limp)
751a9643ea8Slogwang {
752a9643ea8Slogwang     refcount_acquire(&limp->pl_refcnt);
753a9643ea8Slogwang     return (limp);
754a9643ea8Slogwang }
755a9643ea8Slogwang 
756a9643ea8Slogwang /*
757a9643ea8Slogwang  * Return the current (soft) limit for a particular system resource.
758a9643ea8Slogwang  * The which parameter which specifies the index into the rlimit array
759a9643ea8Slogwang  */
760a9643ea8Slogwang rlim_t
lim_cur(struct thread * td,int which)761a9643ea8Slogwang lim_cur(struct thread *td, int which)
762a9643ea8Slogwang {
763a9643ea8Slogwang     struct rlimit rl;
764a9643ea8Slogwang 
765a9643ea8Slogwang     lim_rlimit(td, which, &rl);
766a9643ea8Slogwang     return (rl.rlim_cur);
767a9643ea8Slogwang }
768a9643ea8Slogwang 
769a9643ea8Slogwang rlim_t
lim_cur_proc(struct proc * p,int which)770a9643ea8Slogwang lim_cur_proc(struct proc *p, int which)
771a9643ea8Slogwang {
772a9643ea8Slogwang     struct rlimit rl;
773a9643ea8Slogwang 
774a9643ea8Slogwang     lim_rlimit_proc(p, which, &rl);
775a9643ea8Slogwang     return (rl.rlim_cur);
776a9643ea8Slogwang }
777a9643ea8Slogwang 
778a9643ea8Slogwang /*
779a9643ea8Slogwang  * Return a copy of the entire rlimit structure for the system limit
780a9643ea8Slogwang  * specified by 'which' in the rlimit structure pointed to by 'rlp'.
781a9643ea8Slogwang  */
782a9643ea8Slogwang void
lim_rlimit(struct thread * td,int which,struct rlimit * rlp)783a9643ea8Slogwang lim_rlimit(struct thread *td, int which, struct rlimit *rlp)
784a9643ea8Slogwang {
785a9643ea8Slogwang     struct proc *p = td->td_proc;
786a9643ea8Slogwang 
787a9643ea8Slogwang     MPASS(td == curthread);
788a9643ea8Slogwang     KASSERT(which >= 0 && which < RLIM_NLIMITS,
789a9643ea8Slogwang         ("request for invalid resource limit"));
790a9643ea8Slogwang     *rlp = p->p_limit->pl_rlimit[which];
791a9643ea8Slogwang     if (p->p_sysent->sv_fixlimit != NULL)
792a9643ea8Slogwang         p->p_sysent->sv_fixlimit(rlp, which);
793a9643ea8Slogwang }
794a9643ea8Slogwang 
795a9643ea8Slogwang void
lim_rlimit_proc(struct proc * p,int which,struct rlimit * rlp)796a9643ea8Slogwang lim_rlimit_proc(struct proc *p, int which, struct rlimit *rlp)
797a9643ea8Slogwang {
798a9643ea8Slogwang     PROC_LOCK_ASSERT(p, MA_OWNED);
799a9643ea8Slogwang     KASSERT(which >= 0 && which < RLIM_NLIMITS,
800a9643ea8Slogwang         ("request for invalid resource limit"));
801a9643ea8Slogwang     *rlp = p->p_limit->pl_rlimit[which];
802a9643ea8Slogwang     if (p->p_sysent->sv_fixlimit != NULL)
803a9643ea8Slogwang         p->p_sysent->sv_fixlimit(rlp, which);
804a9643ea8Slogwang }
805a9643ea8Slogwang 
806a9643ea8Slogwang int
useracc(void * addr,int len,int rw)807a9643ea8Slogwang useracc(void *addr, int len, int rw)
808a9643ea8Slogwang {
809a9643ea8Slogwang     return (1);
810a9643ea8Slogwang }
811a9643ea8Slogwang 
812a9643ea8Slogwang struct pgrp *
pgfind(pid_t pgid)813a9643ea8Slogwang pgfind(pid_t pgid)
814a9643ea8Slogwang {
815a9643ea8Slogwang     return (NULL);
816a9643ea8Slogwang }
817a9643ea8Slogwang 
81822ce4affSfengbojiang #if 0
819a9643ea8Slogwang struct proc *
820a9643ea8Slogwang zpfind(pid_t pid)
821a9643ea8Slogwang {
822a9643ea8Slogwang     return (NULL);
823a9643ea8Slogwang }
82422ce4affSfengbojiang #endif
825a9643ea8Slogwang 
826a9643ea8Slogwang int
p_cansee(struct thread * td,struct proc * p)827a9643ea8Slogwang p_cansee(struct thread *td, struct proc *p)
828a9643ea8Slogwang {
829a9643ea8Slogwang     return (0);
830a9643ea8Slogwang }
831a9643ea8Slogwang 
832a9643ea8Slogwang struct proc *
pfind(pid_t pid)833a9643ea8Slogwang pfind(pid_t pid)
834a9643ea8Slogwang {
835a9643ea8Slogwang     return (NULL);
836a9643ea8Slogwang }
837a9643ea8Slogwang 
838a9643ea8Slogwang int
pget(pid_t pid,int flags,struct proc ** pp)839a9643ea8Slogwang pget(pid_t pid, int flags, struct proc **pp)
840a9643ea8Slogwang {
841a9643ea8Slogwang     return (ESRCH);
842a9643ea8Slogwang }
843a9643ea8Slogwang 
844a9643ea8Slogwang struct uidinfo uid0;
845a9643ea8Slogwang 
846a9643ea8Slogwang struct uidinfo *
uifind(uid_t uid)847a9643ea8Slogwang uifind(uid_t uid)
848a9643ea8Slogwang {
849a9643ea8Slogwang     return (&uid0);
850a9643ea8Slogwang }
851a9643ea8Slogwang 
852a9643ea8Slogwang /*
853a9643ea8Slogwang  * Allocate a zeroed cred structure.
854a9643ea8Slogwang  */
855a9643ea8Slogwang struct ucred *
crget(void)856a9643ea8Slogwang crget(void)
857a9643ea8Slogwang {
858a9643ea8Slogwang     register struct ucred *cr;
859a9643ea8Slogwang 
860a9643ea8Slogwang     cr = malloc(sizeof(*cr), M_CRED, M_WAITOK | M_ZERO);
861a9643ea8Slogwang     refcount_init(&cr->cr_ref, 1);
862a9643ea8Slogwang 
863a9643ea8Slogwang     return (cr);
864a9643ea8Slogwang }
865a9643ea8Slogwang 
866a9643ea8Slogwang /*
867a9643ea8Slogwang  * Claim another reference to a ucred structure.
868a9643ea8Slogwang  */
869a9643ea8Slogwang struct ucred *
crhold(struct ucred * cr)870a9643ea8Slogwang crhold(struct ucred *cr)
871a9643ea8Slogwang {
872a9643ea8Slogwang     refcount_acquire(&cr->cr_ref);
873a9643ea8Slogwang     return (cr);
874a9643ea8Slogwang }
875a9643ea8Slogwang 
876a9643ea8Slogwang /*
877a9643ea8Slogwang  * Free a cred structure.  Throws away space when ref count gets to 0.
878a9643ea8Slogwang  */
879a9643ea8Slogwang void
crfree(struct ucred * cr)880a9643ea8Slogwang crfree(struct ucred *cr)
881a9643ea8Slogwang {
882a9643ea8Slogwang     KASSERT(cr->cr_ref > 0, ("bad ucred refcount: %d", cr->cr_ref));
883a9643ea8Slogwang     KASSERT(cr->cr_ref != 0xdeadc0de, ("dangling reference to ucred"));
884a9643ea8Slogwang     if (refcount_release(&cr->cr_ref)) {
885a9643ea8Slogwang 
886a9643ea8Slogwang         free(cr, M_CRED);
887a9643ea8Slogwang     }
888a9643ea8Slogwang }
889a9643ea8Slogwang 
890a9643ea8Slogwang /*
891a9643ea8Slogwang  * Fill in a struct xucred based on a struct ucred.
892a9643ea8Slogwang  */
893a9643ea8Slogwang 
894a9643ea8Slogwang void
cru2x(struct ucred * cr,struct xucred * xcr)895a9643ea8Slogwang cru2x(struct ucred *cr, struct xucred *xcr)
896a9643ea8Slogwang {
897a9643ea8Slogwang #if 0
898a9643ea8Slogwang     int ngroups;
899a9643ea8Slogwang 
900a9643ea8Slogwang     bzero(xcr, sizeof(*xcr));
901a9643ea8Slogwang     xcr->cr_version = XUCRED_VERSION;
902a9643ea8Slogwang     xcr->cr_uid = cr->cr_uid;
903a9643ea8Slogwang 
904a9643ea8Slogwang     ngroups = MIN(cr->cr_ngroups, XU_NGROUPS);
905a9643ea8Slogwang     xcr->cr_ngroups = ngroups;
906a9643ea8Slogwang     bcopy(cr->cr_groups, xcr->cr_groups,
907a9643ea8Slogwang         ngroups * sizeof(*cr->cr_groups));
908a9643ea8Slogwang #endif
909a9643ea8Slogwang }
910a9643ea8Slogwang 
911a9643ea8Slogwang 
912a9643ea8Slogwang int
cr_cansee(struct ucred * u1,struct ucred * u2)913a9643ea8Slogwang cr_cansee(struct ucred *u1, struct ucred *u2)
914a9643ea8Slogwang {
915a9643ea8Slogwang     return (0);
916a9643ea8Slogwang }
917a9643ea8Slogwang 
918a9643ea8Slogwang int
cr_canseesocket(struct ucred * cred,struct socket * so)919a9643ea8Slogwang cr_canseesocket(struct ucred *cred, struct socket *so)
920a9643ea8Slogwang {
921a9643ea8Slogwang     return (0);
922a9643ea8Slogwang }
923a9643ea8Slogwang 
924a9643ea8Slogwang int
cr_canseeinpcb(struct ucred * cred,struct inpcb * inp)925a9643ea8Slogwang cr_canseeinpcb(struct ucred *cred, struct inpcb *inp)
926a9643ea8Slogwang {
927a9643ea8Slogwang     return (0);
928a9643ea8Slogwang }
929a9643ea8Slogwang 
930a9643ea8Slogwang int
securelevel_gt(struct ucred * cr,int level)931a9643ea8Slogwang securelevel_gt(struct ucred *cr, int level)
932a9643ea8Slogwang {
933a9643ea8Slogwang     return (0);
934a9643ea8Slogwang }
935a9643ea8Slogwang 
936127dd473Swhl739 int
securelevel_ge(struct ucred * cr,int level)937127dd473Swhl739 securelevel_ge(struct ucred *cr, int level)
938127dd473Swhl739 {
939127dd473Swhl739         return (0);
940127dd473Swhl739 }
941a9643ea8Slogwang 
942a9643ea8Slogwang /**
943a9643ea8Slogwang  * @brief Send a 'notification' to userland, using standard ways
944a9643ea8Slogwang  */
945a9643ea8Slogwang void
devctl_notify(const char * system,const char * subsystem,const char * type,const char * data)946a9643ea8Slogwang devctl_notify(const char *system, const char *subsystem, const char *type,
947a9643ea8Slogwang     const char *data)
948a9643ea8Slogwang {
949a9643ea8Slogwang 
950a9643ea8Slogwang }
951a9643ea8Slogwang 
952a9643ea8Slogwang void
cpu_pcpu_init(struct pcpu * pcpu,int cpuid,size_t size)953a9643ea8Slogwang cpu_pcpu_init(struct pcpu *pcpu, int cpuid, size_t size)
954a9643ea8Slogwang {
955a9643ea8Slogwang 
956a9643ea8Slogwang }
957a9643ea8Slogwang 
958a9643ea8Slogwang static void
configure_final(void * dummy)959a9643ea8Slogwang configure_final(void *dummy)
960a9643ea8Slogwang {
961a9643ea8Slogwang     cold = 0;
962a9643ea8Slogwang }
963a9643ea8Slogwang 
964a9643ea8Slogwang /*
965a9643ea8Slogwang  * Send a SIGIO or SIGURG signal to a process or process group using stored
966a9643ea8Slogwang  * credentials rather than those of the current process.
967a9643ea8Slogwang  */
968a9643ea8Slogwang void
pgsigio(sigiop,sig,checkctty)969a9643ea8Slogwang pgsigio(sigiop, sig, checkctty)
970a9643ea8Slogwang     struct sigio **sigiop;
971a9643ea8Slogwang     int sig, checkctty;
972a9643ea8Slogwang {
973a9643ea8Slogwang     panic("SIGIO not supported yet\n");
974a9643ea8Slogwang #ifdef notyet
975a9643ea8Slogwang     ksiginfo_t ksi;
976a9643ea8Slogwang     struct sigio *sigio;
977a9643ea8Slogwang 
978a9643ea8Slogwang     ksiginfo_init(&ksi);
979a9643ea8Slogwang     ksi.ksi_signo = sig;
980a9643ea8Slogwang     ksi.ksi_code = SI_KERNEL;
981a9643ea8Slogwang 
982a9643ea8Slogwang     SIGIO_LOCK();
983a9643ea8Slogwang     sigio = *sigiop;
984a9643ea8Slogwang     if (sigio == NULL) {
985a9643ea8Slogwang         SIGIO_UNLOCK();
986a9643ea8Slogwang         return;
987a9643ea8Slogwang     }
988a9643ea8Slogwang     if (sigio->sio_pgid > 0) {
989a9643ea8Slogwang         PROC_LOCK(sigio->sio_proc);
990a9643ea8Slogwang         if (CANSIGIO(sigio->sio_ucred, sigio->sio_proc->p_ucred))
991a9643ea8Slogwang             psignal(sigio->sio_proc, sig);
992a9643ea8Slogwang         PROC_UNLOCK(sigio->sio_proc);
993a9643ea8Slogwang     } else if (sigio->sio_pgid < 0) {
994a9643ea8Slogwang         struct proc *p;
995a9643ea8Slogwang 
996a9643ea8Slogwang         PGRP_LOCK(sigio->sio_pgrp);
997a9643ea8Slogwang         LIST_FOREACH(p, &sigio->sio_pgrp->pg_members, p_pglist) {
998a9643ea8Slogwang             PROC_LOCK(p);
999a9643ea8Slogwang             if (CANSIGIO(sigio->sio_ucred, p->p_ucred) &&
1000a9643ea8Slogwang                 (checkctty == 0 || (p->p_flag & P_CONTROLT)))
1001a9643ea8Slogwang                 psignal(p, sig);
1002a9643ea8Slogwang             PROC_UNLOCK(p);
1003a9643ea8Slogwang         }
1004a9643ea8Slogwang         PGRP_UNLOCK(sigio->sio_pgrp);
1005a9643ea8Slogwang     }
1006a9643ea8Slogwang     SIGIO_UNLOCK();
1007a9643ea8Slogwang #endif
1008a9643ea8Slogwang }
1009a9643ea8Slogwang 
1010a9643ea8Slogwang void
kproc_exit(int ecode)1011a9643ea8Slogwang kproc_exit(int ecode)
1012a9643ea8Slogwang {
1013a9643ea8Slogwang     panic("kproc_exit unsupported");
1014a9643ea8Slogwang }
1015a9643ea8Slogwang 
1016a9643ea8Slogwang vm_offset_t
kmem_malloc(vm_size_t bytes,int flags)101722ce4affSfengbojiang kmem_malloc(vm_size_t bytes, int flags)
1018a9643ea8Slogwang {
1019a9643ea8Slogwang     void *alloc = ff_mmap(NULL, bytes, ff_PROT_READ|ff_PROT_WRITE, ff_MAP_ANON|ff_MAP_PRIVATE, -1, 0);
1020a9643ea8Slogwang     if ((flags & M_ZERO) && alloc != NULL)
1021a9643ea8Slogwang         bzero(alloc, bytes);
1022a9643ea8Slogwang     return ((vm_offset_t)alloc);
1023a9643ea8Slogwang }
1024a9643ea8Slogwang 
1025a9643ea8Slogwang void
kmem_free(vm_offset_t addr,vm_size_t size)102622ce4affSfengbojiang kmem_free(vm_offset_t addr, vm_size_t size)
1027a9643ea8Slogwang {
1028a9643ea8Slogwang     ff_munmap((void *)addr, size);
1029a9643ea8Slogwang }
1030a9643ea8Slogwang 
1031a9643ea8Slogwang vm_offset_t
kmem_alloc_contig(vm_size_t size,int flags,vm_paddr_t low,vm_paddr_t high,u_long alignment,vm_paddr_t boundary,vm_memattr_t memattr)103222ce4affSfengbojiang kmem_alloc_contig(vm_size_t size, int flags, vm_paddr_t low,
1033a9643ea8Slogwang     vm_paddr_t high, u_long alignment, vm_paddr_t boundary, vm_memattr_t memattr)
1034a9643ea8Slogwang {
103522ce4affSfengbojiang     return (kmem_malloc(size, flags));
1036a9643ea8Slogwang }
1037a9643ea8Slogwang 
1038a9643ea8Slogwang void
malloc_init(void * data)1039a9643ea8Slogwang malloc_init(void *data)
1040a9643ea8Slogwang {
1041a9643ea8Slogwang     /* Nothing to do here */
1042a9643ea8Slogwang }
1043a9643ea8Slogwang 
1044a9643ea8Slogwang 
1045a9643ea8Slogwang void
malloc_uninit(void * data)1046a9643ea8Slogwang malloc_uninit(void *data)
1047a9643ea8Slogwang {
1048a9643ea8Slogwang     /* Nothing to do here */
1049a9643ea8Slogwang }
1050a9643ea8Slogwang 
1051a9643ea8Slogwang void *
malloc(unsigned long size,struct malloc_type * type,int flags)1052a9643ea8Slogwang malloc(unsigned long size, struct malloc_type *type, int flags)
1053a9643ea8Slogwang {
1054a9643ea8Slogwang     void *alloc;
1055a9643ea8Slogwang 
1056a9643ea8Slogwang     do {
1057a9643ea8Slogwang         alloc = ff_malloc(size);
1058a9643ea8Slogwang         if (alloc || !(flags & M_WAITOK))
1059a9643ea8Slogwang             break;
1060a9643ea8Slogwang 
1061a9643ea8Slogwang         pause("malloc", hz/100);
1062a9643ea8Slogwang     } while (alloc == NULL);
1063a9643ea8Slogwang 
1064a9643ea8Slogwang     if ((flags & M_ZERO) && alloc != NULL)
1065a9643ea8Slogwang         bzero(alloc, size);
1066a9643ea8Slogwang     return (alloc);
1067a9643ea8Slogwang }
1068a9643ea8Slogwang 
1069a9643ea8Slogwang void
free(void * addr,struct malloc_type * type)1070a9643ea8Slogwang free(void *addr, struct malloc_type *type)
1071a9643ea8Slogwang {
1072a9643ea8Slogwang     ff_free(addr);
1073a9643ea8Slogwang }
1074a9643ea8Slogwang 
1075a9643ea8Slogwang void *
realloc(void * addr,unsigned long size,struct malloc_type * type,int flags)1076a9643ea8Slogwang realloc(void *addr, unsigned long size, struct malloc_type *type,
1077a9643ea8Slogwang     int flags)
1078a9643ea8Slogwang {
1079a9643ea8Slogwang     return (ff_realloc(addr, size));
1080a9643ea8Slogwang }
1081a9643ea8Slogwang 
1082a9643ea8Slogwang void *
reallocf(void * addr,unsigned long size,struct malloc_type * type,int flags)1083a9643ea8Slogwang reallocf(void *addr, unsigned long size, struct malloc_type *type,
1084a9643ea8Slogwang      int flags)
1085a9643ea8Slogwang {
1086a9643ea8Slogwang     void *mem;
1087a9643ea8Slogwang 
1088a9643ea8Slogwang     if ((mem = ff_realloc(addr, size)) == NULL)
1089a9643ea8Slogwang         ff_free(addr);
1090a9643ea8Slogwang 
1091a9643ea8Slogwang     return (mem);
1092a9643ea8Slogwang }
1093a9643ea8Slogwang 
1094a9643ea8Slogwang void
DELAY(int delay)1095a9643ea8Slogwang DELAY(int delay)
1096a9643ea8Slogwang {
1097a9643ea8Slogwang     struct timespec rqt;
1098a9643ea8Slogwang 
1099a9643ea8Slogwang     if (delay < 1000)
1100a9643ea8Slogwang         return;
1101a9643ea8Slogwang 
1102a9643ea8Slogwang     rqt.tv_nsec = 1000*((unsigned long)delay);
1103a9643ea8Slogwang     rqt.tv_sec = 0;
1104a9643ea8Slogwang     /*
1105a9643ea8Slogwang      * FIXME: We shouldn't sleep in dpdk apps.
1106a9643ea8Slogwang      */
1107a9643ea8Slogwang     //nanosleep(&rqt, NULL);
1108a9643ea8Slogwang }
1109a9643ea8Slogwang 
1110a9643ea8Slogwang void
bwillwrite(void)1111a9643ea8Slogwang bwillwrite(void)
1112a9643ea8Slogwang {
1113a9643ea8Slogwang 
1114a9643ea8Slogwang }
1115a9643ea8Slogwang 
1116a9643ea8Slogwang off_t
foffset_lock(struct file * fp,int flags)1117a9643ea8Slogwang foffset_lock(struct file *fp, int flags)
1118a9643ea8Slogwang {
1119a9643ea8Slogwang     struct mtx *mtxp;
1120a9643ea8Slogwang     off_t res;
1121a9643ea8Slogwang 
1122a9643ea8Slogwang     KASSERT((flags & FOF_OFFSET) == 0, ("FOF_OFFSET passed"));
1123a9643ea8Slogwang 
1124a9643ea8Slogwang #if OFF_MAX <= LONG_MAX
1125a9643ea8Slogwang     /*
1126a9643ea8Slogwang      * Caller only wants the current f_offset value.  Assume that
1127a9643ea8Slogwang      * the long and shorter integer types reads are atomic.
1128a9643ea8Slogwang      */
1129a9643ea8Slogwang     if ((flags & FOF_NOLOCK) != 0)
1130a9643ea8Slogwang         return (fp->f_offset);
1131a9643ea8Slogwang #endif
1132a9643ea8Slogwang 
1133a9643ea8Slogwang     /*
1134a9643ea8Slogwang      * According to McKusick the vn lock was protecting f_offset here.
1135a9643ea8Slogwang      * It is now protected by the FOFFSET_LOCKED flag.
1136a9643ea8Slogwang      */
1137a9643ea8Slogwang     mtxp = mtx_pool_find(mtxpool_sleep, fp);
1138a9643ea8Slogwang     mtx_lock(mtxp);
1139a416aa08Slogwang     /*
1140a9643ea8Slogwang     if ((flags & FOF_NOLOCK) == 0) {
1141a9643ea8Slogwang         while (fp->f_vnread_flags & FOFFSET_LOCKED) {
1142a9643ea8Slogwang             fp->f_vnread_flags |= FOFFSET_LOCK_WAITING;
1143a9643ea8Slogwang             msleep(&fp->f_vnread_flags, mtxp, PUSER -1,
1144a9643ea8Slogwang                 "vofflock", 0);
1145a9643ea8Slogwang         }
1146a9643ea8Slogwang         fp->f_vnread_flags |= FOFFSET_LOCKED;
1147a9643ea8Slogwang     }
1148a416aa08Slogwang     */
1149a9643ea8Slogwang     res = fp->f_offset;
1150a9643ea8Slogwang     mtx_unlock(mtxp);
1151a9643ea8Slogwang     return (res);
1152a9643ea8Slogwang }
1153a9643ea8Slogwang 
115422ce4affSfengbojiang #if 0
1155a9643ea8Slogwang void
1156a9643ea8Slogwang sf_ext_free(void *arg1, void *arg2)
1157a9643ea8Slogwang {
1158a9643ea8Slogwang     panic("sf_ext_free not implemented.\n");
1159a9643ea8Slogwang }
1160a9643ea8Slogwang 
1161a9643ea8Slogwang void
1162a9643ea8Slogwang sf_ext_free_nocache(void *arg1, void *arg2)
1163a9643ea8Slogwang {
1164a9643ea8Slogwang     panic("sf_ext_free_nocache not implemented.\n");
1165a9643ea8Slogwang }
116622ce4affSfengbojiang #endif
1167a9643ea8Slogwang 
1168a9643ea8Slogwang void
sched_bind(struct thread * td,int cpu)1169a9643ea8Slogwang sched_bind(struct thread *td, int cpu)
1170a9643ea8Slogwang {
1171a9643ea8Slogwang 
1172a9643ea8Slogwang }
1173a9643ea8Slogwang 
1174a9643ea8Slogwang void
sched_unbind(struct thread * td)1175a9643ea8Slogwang sched_unbind(struct thread* td)
1176a9643ea8Slogwang {
1177a9643ea8Slogwang 
1178a9643ea8Slogwang }
1179a9643ea8Slogwang 
1180df6ad731Slogwang void
getcredhostid(struct ucred * cred,unsigned long * hostid)1181df6ad731Slogwang getcredhostid(struct ucred *cred, unsigned long *hostid)
1182df6ad731Slogwang {
1183df6ad731Slogwang     *hostid = 0;
1184df6ad731Slogwang }
1185127dd473Swhl739 
1186127dd473Swhl739 /*
1187127dd473Swhl739  * Check if gid is a member of the group set.
1188127dd473Swhl739  */
1189127dd473Swhl739 int
groupmember(gid_t gid,struct ucred * cred)1190127dd473Swhl739 groupmember(gid_t gid, struct ucred *cred)
1191127dd473Swhl739 {
1192127dd473Swhl739     int l;
1193127dd473Swhl739     int h;
1194127dd473Swhl739     int m;
1195127dd473Swhl739 
1196127dd473Swhl739     if (cred->cr_groups[0] == gid)
1197127dd473Swhl739         return(1);
1198127dd473Swhl739 
1199127dd473Swhl739     /*
1200127dd473Swhl739      * If gid was not our primary group, perform a binary search
1201127dd473Swhl739      * of the supplemental groups.  This is possible because we
1202127dd473Swhl739      * sort the groups in crsetgroups().
1203127dd473Swhl739      */
1204127dd473Swhl739     l = 1;
1205127dd473Swhl739     h = cred->cr_ngroups;
1206127dd473Swhl739     while (l < h) {
1207127dd473Swhl739         m = l + ((h - l) / 2);
1208127dd473Swhl739         if (cred->cr_groups[m] < gid)
1209127dd473Swhl739             l = m + 1;
1210127dd473Swhl739         else
1211127dd473Swhl739             h = m;
1212127dd473Swhl739     }
1213127dd473Swhl739     if ((l < cred->cr_ngroups) && (cred->cr_groups[l] == gid))
1214127dd473Swhl739         return (1);
1215127dd473Swhl739 
1216127dd473Swhl739     return (0);
1217127dd473Swhl739 }
1218127dd473Swhl739 
121922ce4affSfengbojiang int
vm_wait_doms(const domainset_t * wdoms,int mflags)122022ce4affSfengbojiang vm_wait_doms(const domainset_t *wdoms, int mflags)
122122ce4affSfengbojiang {
122222ce4affSfengbojiang     return 0;
122322ce4affSfengbojiang }
122422ce4affSfengbojiang 
122522ce4affSfengbojiang void
vm_domainset_iter_policy_ref_init(struct vm_domainset_iter * di,struct domainset_ref * dr,int * domain,int * flags)122622ce4affSfengbojiang vm_domainset_iter_policy_ref_init(struct vm_domainset_iter *di,
122722ce4affSfengbojiang     struct domainset_ref *dr, int *domain, int *flags)
122822ce4affSfengbojiang {
122922ce4affSfengbojiang     *domain = 0;
123022ce4affSfengbojiang }
123122ce4affSfengbojiang 
123222ce4affSfengbojiang int
vm_domainset_iter_policy(struct vm_domainset_iter * di,int * domain)123322ce4affSfengbojiang vm_domainset_iter_policy(struct vm_domainset_iter *di, int *domain)
123422ce4affSfengbojiang {
123522ce4affSfengbojiang     //return (EJUSTRETURN);
123622ce4affSfengbojiang     return 0;
123722ce4affSfengbojiang }
123822ce4affSfengbojiang 
123922ce4affSfengbojiang vm_offset_t
kmem_malloc_domainset(struct domainset * ds,vm_size_t size,int flags)124022ce4affSfengbojiang kmem_malloc_domainset(struct domainset *ds, vm_size_t size, int flags)
124122ce4affSfengbojiang {
124222ce4affSfengbojiang     return (kmem_malloc(size, flags));
124322ce4affSfengbojiang }
124422ce4affSfengbojiang 
124522ce4affSfengbojiang void *
mallocarray(size_t nmemb,size_t size,struct malloc_type * type,int flags)124622ce4affSfengbojiang mallocarray(size_t nmemb, size_t size, struct malloc_type *type, int flags)
124722ce4affSfengbojiang {
124822ce4affSfengbojiang     return (malloc(size * nmemb, type, flags));
124922ce4affSfengbojiang }
125022ce4affSfengbojiang 
125122ce4affSfengbojiang void
getcredhostuuid(struct ucred * cred,char * buf,size_t size)125222ce4affSfengbojiang getcredhostuuid(struct ucred *cred, char *buf, size_t size)
125322ce4affSfengbojiang {
125422ce4affSfengbojiang     mtx_lock(&cred->cr_prison->pr_mtx);
125522ce4affSfengbojiang     strlcpy(buf, cred->cr_prison->pr_hostuuid, size);
125622ce4affSfengbojiang     mtx_unlock(&cred->cr_prison->pr_mtx);
125722ce4affSfengbojiang }
125822ce4affSfengbojiang 
125922ce4affSfengbojiang void
getjailname(struct ucred * cred,char * name,size_t len)126022ce4affSfengbojiang getjailname(struct ucred *cred, char *name, size_t len)
126122ce4affSfengbojiang {
126222ce4affSfengbojiang     mtx_lock(&cred->cr_prison->pr_mtx);
126322ce4affSfengbojiang     strlcpy(name, cred->cr_prison->pr_name, len);
126422ce4affSfengbojiang     mtx_unlock(&cred->cr_prison->pr_mtx);
126522ce4affSfengbojiang }
126622ce4affSfengbojiang 
126722ce4affSfengbojiang void *
malloc_domainset(size_t size,struct malloc_type * mtp,struct domainset * ds,int flags)126822ce4affSfengbojiang malloc_domainset(size_t size, struct malloc_type *mtp, struct domainset *ds,
126922ce4affSfengbojiang     int flags)
127022ce4affSfengbojiang {
127122ce4affSfengbojiang     return (malloc(size, mtp, flags));
127222ce4affSfengbojiang }
127322ce4affSfengbojiang 
127422ce4affSfengbojiang void *
malloc_exec(size_t size,struct malloc_type * mtp,int flags)127522ce4affSfengbojiang malloc_exec(size_t size, struct malloc_type *mtp, int flags)
127622ce4affSfengbojiang {
127722ce4affSfengbojiang 
127822ce4affSfengbojiang     return (malloc(size, mtp, flags));
127922ce4affSfengbojiang }
128022ce4affSfengbojiang 
128122ce4affSfengbojiang int
bus_get_domain(device_t dev,int * domain)128222ce4affSfengbojiang bus_get_domain(device_t dev, int *domain)
128322ce4affSfengbojiang {
128422ce4affSfengbojiang     return (-1);
128522ce4affSfengbojiang }
128622ce4affSfengbojiang 
128722ce4affSfengbojiang void
cru2xt(struct thread * td,struct xucred * xcr)128822ce4affSfengbojiang cru2xt(struct thread *td, struct xucred *xcr)
128922ce4affSfengbojiang {
129022ce4affSfengbojiang     cru2x(td->td_ucred, xcr);
129122ce4affSfengbojiang     xcr->cr_pid = td->td_proc->p_pid;
129222ce4affSfengbojiang }
129322ce4affSfengbojiang 
129422ce4affSfengbojiang /*
129522ce4affSfengbojiang  * Set socket peer credentials at connection time.
129622ce4affSfengbojiang  *
129722ce4affSfengbojiang  * The client's PCB credentials are copied from its process structure.  The
129822ce4affSfengbojiang  * server's PCB credentials are copied from the socket on which it called
129922ce4affSfengbojiang  * listen(2).  uipc_listen cached that process's credentials at the time.
130022ce4affSfengbojiang  */
130122ce4affSfengbojiang void
unp_copy_peercred(struct thread * td,struct unpcb * client_unp,struct unpcb * server_unp,struct unpcb * listen_unp)130222ce4affSfengbojiang unp_copy_peercred(struct thread *td, struct unpcb *client_unp,
130322ce4affSfengbojiang     struct unpcb *server_unp, struct unpcb *listen_unp)
130422ce4affSfengbojiang {
130522ce4affSfengbojiang     cru2xt(td, &client_unp->unp_peercred);
130622ce4affSfengbojiang     client_unp->unp_flags |= UNP_HAVEPC;
130722ce4affSfengbojiang 
130822ce4affSfengbojiang     memcpy(&server_unp->unp_peercred, &listen_unp->unp_peercred,
130922ce4affSfengbojiang         sizeof(server_unp->unp_peercred));
131022ce4affSfengbojiang     server_unp->unp_flags |= UNP_HAVEPC;
131122ce4affSfengbojiang     client_unp->unp_flags |= (listen_unp->unp_flags & UNP_WANTCRED_MASK);
131222ce4affSfengbojiang }
131322ce4affSfengbojiang 
131422ce4affSfengbojiang int
eventfd_create_file(struct thread * td,struct file * fp,uint32_t initval,int flags)131522ce4affSfengbojiang eventfd_create_file(struct thread *td, struct file *fp, uint32_t initval,
131622ce4affSfengbojiang     int flags)
131722ce4affSfengbojiang {
131822ce4affSfengbojiang     return (0);
131922ce4affSfengbojiang }
132022ce4affSfengbojiang 
132122ce4affSfengbojiang void
sched_prio(struct thread * td,u_char prio)132222ce4affSfengbojiang sched_prio(struct thread *td, u_char prio)
132322ce4affSfengbojiang {
132422ce4affSfengbojiang 
132522ce4affSfengbojiang }
132622ce4affSfengbojiang 
132722ce4affSfengbojiang /*
132822ce4affSfengbojiang  * The machine independent parts of context switching.
132922ce4affSfengbojiang  *
133022ce4affSfengbojiang  * The thread lock is required on entry and is no longer held on return.
133122ce4affSfengbojiang  */
133222ce4affSfengbojiang void
mi_switch(int flags)133322ce4affSfengbojiang mi_switch(int flags)
133422ce4affSfengbojiang {
133522ce4affSfengbojiang 
133622ce4affSfengbojiang }
133722ce4affSfengbojiang 
133822ce4affSfengbojiang int
sched_is_bound(struct thread * td)133922ce4affSfengbojiang sched_is_bound(struct thread *td)
134022ce4affSfengbojiang {
134122ce4affSfengbojiang     return (1);
134222ce4affSfengbojiang }
134322ce4affSfengbojiang 
134422ce4affSfengbojiang /*
134522ce4affSfengbojiang  * This function must not be called with-in read section.
134622ce4affSfengbojiang  */
134722ce4affSfengbojiang void
ck_epoch_synchronize_wait(struct ck_epoch * global,ck_epoch_wait_cb_t * cb,void * ct)134822ce4affSfengbojiang ck_epoch_synchronize_wait(struct ck_epoch *global,
134922ce4affSfengbojiang     ck_epoch_wait_cb_t *cb, void *ct)
135022ce4affSfengbojiang {
135122ce4affSfengbojiang 
135222ce4affSfengbojiang }
135322ce4affSfengbojiang 
135422ce4affSfengbojiang bool
ck_epoch_poll_deferred(struct ck_epoch_record * record,ck_stack_t * deferred)135522ce4affSfengbojiang ck_epoch_poll_deferred(struct ck_epoch_record *record, ck_stack_t *deferred)
135622ce4affSfengbojiang {
135722ce4affSfengbojiang     return (true);
135822ce4affSfengbojiang }
135922ce4affSfengbojiang 
136022ce4affSfengbojiang void
_ck_epoch_addref(struct ck_epoch_record * record,struct ck_epoch_section * section)136122ce4affSfengbojiang _ck_epoch_addref(struct ck_epoch_record *record,
136222ce4affSfengbojiang     struct ck_epoch_section *section)
136322ce4affSfengbojiang {
136422ce4affSfengbojiang 
136522ce4affSfengbojiang }
136622ce4affSfengbojiang 
136722ce4affSfengbojiang bool
_ck_epoch_delref(struct ck_epoch_record * record,struct ck_epoch_section * section)136822ce4affSfengbojiang _ck_epoch_delref(struct ck_epoch_record *record,
136922ce4affSfengbojiang     struct ck_epoch_section *section)
137022ce4affSfengbojiang {
137122ce4affSfengbojiang     return true;
137222ce4affSfengbojiang }
137322ce4affSfengbojiang 
137422ce4affSfengbojiang void
ck_epoch_register(struct ck_epoch * global,struct ck_epoch_record * record,void * ct)137522ce4affSfengbojiang ck_epoch_register(struct ck_epoch *global, struct ck_epoch_record *record,
137622ce4affSfengbojiang     void *ct)
137722ce4affSfengbojiang {
137822ce4affSfengbojiang 
137922ce4affSfengbojiang }
138022ce4affSfengbojiang 
138122ce4affSfengbojiang void
ck_epoch_init(struct ck_epoch * global)138222ce4affSfengbojiang ck_epoch_init(struct ck_epoch *global)
138322ce4affSfengbojiang {
138422ce4affSfengbojiang 
138522ce4affSfengbojiang }
138622ce4affSfengbojiang 
138722ce4affSfengbojiang #if 0
138822ce4affSfengbojiang void
138922ce4affSfengbojiang wakeup_any(const void *ident)
139022ce4affSfengbojiang {
139122ce4affSfengbojiang 
139222ce4affSfengbojiang }
139322ce4affSfengbojiang #endif
139422ce4affSfengbojiang 
139522ce4affSfengbojiang /*
139622ce4affSfengbojiang  * kmem_bootstrap_free:
139722ce4affSfengbojiang  *
139822ce4affSfengbojiang  * Free pages backing preloaded data (e.g., kernel modules) to the
139922ce4affSfengbojiang  * system.  Currently only supported on platforms that create a
140022ce4affSfengbojiang  * vm_phys segment for preloaded data.
140122ce4affSfengbojiang  */
140222ce4affSfengbojiang void
kmem_bootstrap_free(vm_offset_t start,vm_size_t size)140322ce4affSfengbojiang kmem_bootstrap_free(vm_offset_t start, vm_size_t size)
140422ce4affSfengbojiang {
140522ce4affSfengbojiang 
140622ce4affSfengbojiang }
140722ce4affSfengbojiang 
140822ce4affSfengbojiang #if 0
140922ce4affSfengbojiang int
141022ce4affSfengbojiang elf_cpu_parse_dynamic(caddr_t loadbase __unused, Elf_Dyn *dynamic __unused)
141122ce4affSfengbojiang {
141222ce4affSfengbojiang     return (0);
141322ce4affSfengbojiang }
141422ce4affSfengbojiang #endif
141522ce4affSfengbojiang 
141622ce4affSfengbojiang int
pmap_change_prot(vm_offset_t va,vm_size_t size,vm_prot_t prot)141722ce4affSfengbojiang pmap_change_prot(vm_offset_t va, vm_size_t size, vm_prot_t prot)
141822ce4affSfengbojiang {
141922ce4affSfengbojiang     return 0;
142022ce4affSfengbojiang }
142122ce4affSfengbojiang 
142222ce4affSfengbojiang void *
memset_early(void * buf,int c,size_t len)142322ce4affSfengbojiang memset_early(void *buf, int c, size_t len)
142422ce4affSfengbojiang {
142522ce4affSfengbojiang     return (memset(buf, c, len));
142622ce4affSfengbojiang }
142722ce4affSfengbojiang 
142822ce4affSfengbojiang int
elf_reloc_late(linker_file_t lf,Elf_Addr relocbase,const void * data,int type,elf_lookup_fn lookup)142922ce4affSfengbojiang elf_reloc_late(linker_file_t lf, Elf_Addr relocbase, const void *data,
143022ce4affSfengbojiang     int type, elf_lookup_fn lookup)
143122ce4affSfengbojiang {
143222ce4affSfengbojiang     return (0);
143322ce4affSfengbojiang }
143422ce4affSfengbojiang 
143522ce4affSfengbojiang bool
elf_is_ifunc_reloc(Elf_Size r_info)143622ce4affSfengbojiang elf_is_ifunc_reloc(Elf_Size r_info)
143722ce4affSfengbojiang {
143822ce4affSfengbojiang     return (true);
143922ce4affSfengbojiang }
144022ce4affSfengbojiang 
144122ce4affSfengbojiang void
sleepq_chains_remove_matching(bool (* matches)(struct thread *))144222ce4affSfengbojiang sleepq_chains_remove_matching(bool (*matches)(struct thread *))
144322ce4affSfengbojiang {
144422ce4affSfengbojiang 
144522ce4affSfengbojiang }
144622ce4affSfengbojiang 
144722ce4affSfengbojiang u_int
vm_free_count(void)144822ce4affSfengbojiang vm_free_count(void)
144922ce4affSfengbojiang {
145022ce4affSfengbojiang     return vm_dom[0].vmd_free_count;
145122ce4affSfengbojiang }
145222ce4affSfengbojiang 
145322ce4affSfengbojiang struct proc *
pfind_any(pid_t pid)145422ce4affSfengbojiang pfind_any(pid_t pid)
145522ce4affSfengbojiang {
145622ce4affSfengbojiang     return (curproc);
145722ce4affSfengbojiang }
145822ce4affSfengbojiang 
1459