1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync/* $Id$ */
1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync/** @file
5b281ba489ca18f0380d7efc7a5108b606cce449vboxsync * IPRT - Ring-0 Driver, The FreeBSD Kernel Headers.
1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync */
1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync
1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync/*
1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync * Copyright (c) 2007 knut st. osmundsen <bird-src-spam@anduin.net>
1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync *
1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync * Permission is hereby granted, free of charge, to any person
1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync * obtaining a copy of this software and associated documentation
1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync * files (the "Software"), to deal in the Software without
1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync * restriction, including without limitation the rights to use,
1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync * copy, modify, merge, publish, distribute, sublicense, and/or sell
1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync * copies of the Software, and to permit persons to whom the
1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync * Software is furnished to do so, subject to the following
1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync * conditions:
1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync *
1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync * The above copyright notice and this permission notice shall be
1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync * included in all copies or substantial portions of the Software.
1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync *
1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync * OTHER DEALINGS IN THE SOFTWARE.
1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync */
1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync
1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync#ifndef ___the_freebsd_kernel_h
1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync#define ___the_freebsd_kernel_h
1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync
1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync#include <iprt/types.h>
1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync
1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync/* Deal with conflicts first. */
1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync#include <sys/param.h>
1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync#undef PVM
de53a6368f2089e7fe3657780edaa1159d210740vboxsync#include <sys/bus.h>
1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync#include <sys/types.h>
1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync#include <sys/errno.h>
1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync#include <sys/kernel.h>
1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync#include <sys/uio.h>
1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync#include <sys/libkern.h>
1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync#include <sys/systm.h>
1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync#include <sys/malloc.h>
1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync#include <sys/pcpu.h>
1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync#include <sys/proc.h>
1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync#include <sys/limits.h>
1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync#include <sys/unistd.h>
1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync#include <sys/kthread.h>
1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync#include <sys/lock.h>
d27bf03c13c7a5707386600ef9b0bbb82fb3420dvboxsync#if __FreeBSD_version >= 1000030
d27bf03c13c7a5707386600ef9b0bbb82fb3420dvboxsync#include <sys/rwlock.h>
d27bf03c13c7a5707386600ef9b0bbb82fb3420dvboxsync#endif
1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync#include <sys/mutex.h>
1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync#include <sys/sched.h>
833f83ce101b6e9168f519decc0dc7a1079d35f7vboxsync#include <sys/callout.h>
de53a6368f2089e7fe3657780edaa1159d210740vboxsync#include <sys/cpu.h>
004d34f82d0e8a4d58a65cc50eacf298bc6eb956vboxsync#include <sys/smp.h>
7f1ab6be104ec196e86ee149d694d3c2ae410230vboxsync#include <sys/sleepqueue.h>
7f1ab6be104ec196e86ee149d694d3c2ae410230vboxsync#include <sys/sx.h>
d60d5da33bb93fc7a8717802f21b13aa37914799vboxsync#include <vm/vm.h>
1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync#include <vm/pmap.h> /* for vtophys */
d60d5da33bb93fc7a8717802f21b13aa37914799vboxsync#include <vm/vm_map.h>
d60d5da33bb93fc7a8717802f21b13aa37914799vboxsync#include <vm/vm_object.h>
d60d5da33bb93fc7a8717802f21b13aa37914799vboxsync#include <vm/vm_kern.h>
d60d5da33bb93fc7a8717802f21b13aa37914799vboxsync#include <vm/vm_param.h> /* KERN_SUCCESS ++ */
de53a6368f2089e7fe3657780edaa1159d210740vboxsync#include <vm/vm_page.h>
7f4b4ec1cadbf891d2756ce77dc4a4ec220a03bcvboxsync#include <vm/vm_phys.h> /* vm_phys_alloc_* */
61f46e065d6af2932e9c2fa5f5453222834a5ad8vboxsync#include <vm/vm_extern.h> /* kmem_alloc_attr */
44b055a4b813567602be8ef11a62a6c27425c27dvboxsync#include <vm/vm_pageout.h> /* vm_contig_grow_cache */
7f4b4ec1cadbf891d2756ce77dc4a4ec220a03bcvboxsync#include <sys/vmmeter.h> /* cnt */
de53a6368f2089e7fe3657780edaa1159d210740vboxsync#include <sys/resourcevar.h>
7f1ab6be104ec196e86ee149d694d3c2ae410230vboxsync#include <machine/cpu.h>
1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync
b844496aef2c7a10e89a26770ad4c90daf5cfbfavboxsync/**
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync * Wrappers around the sleepq_ KPI.
b844496aef2c7a10e89a26770ad4c90daf5cfbfavboxsync */
1c2db139527a6bbfd9dd06f5b5b383df1c8ced9avboxsync#if __FreeBSD_version >= 800026
c9c40e4aea0cae32719061bfb6968409aa22d460vboxsync# define SLEEPQ_TIMEDWAIT(EventInt) sleepq_timedwait(EventInt, 0)
c9c40e4aea0cae32719061bfb6968409aa22d460vboxsync# define SLEEPQ_TIMEDWAIT_SIG(EventInt) sleepq_timedwait_sig(EventInt, 0)
c9c40e4aea0cae32719061bfb6968409aa22d460vboxsync# define SLEEPQ_WAIT(EventInt) sleepq_wait(EventInt, 0)
c9c40e4aea0cae32719061bfb6968409aa22d460vboxsync# define SLEEPQ_WAIT_SIG(EventInt) sleepq_wait_sig(EventInt, 0)
7b7f2c370eda8031e00e374d33b2dc0fbd943da3vboxsync#else
c9c40e4aea0cae32719061bfb6968409aa22d460vboxsync# define SLEEPQ_TIMEDWAIT(EventInt) sleepq_timedwait(EventInt)
c9c40e4aea0cae32719061bfb6968409aa22d460vboxsync# define SLEEPQ_TIMEDWAIT_SIG(EventInt) sleepq_timedwait_sig(EventInt)
c9c40e4aea0cae32719061bfb6968409aa22d460vboxsync# define SLEEPQ_WAIT(EventInt) sleepq_wait(EventInt)
c9c40e4aea0cae32719061bfb6968409aa22d460vboxsync# define SLEEPQ_WAIT_SIG(EventInt) sleepq_wait_sig(EventInt)
c9c40e4aea0cae32719061bfb6968409aa22d460vboxsync#endif
c9c40e4aea0cae32719061bfb6968409aa22d460vboxsync
b844496aef2c7a10e89a26770ad4c90daf5cfbfavboxsync/**
b844496aef2c7a10e89a26770ad4c90daf5cfbfavboxsync * Our pmap_enter version
b844496aef2c7a10e89a26770ad4c90daf5cfbfavboxsync */
b844496aef2c7a10e89a26770ad4c90daf5cfbfavboxsync#if __FreeBSD_version >= 701105
b844496aef2c7a10e89a26770ad4c90daf5cfbfavboxsync# define MY_PMAP_ENTER(pPhysMap, AddrR3, pPage, fProt, fWired) \
b844496aef2c7a10e89a26770ad4c90daf5cfbfavboxsync pmap_enter(pPhysMap, AddrR3, VM_PROT_NONE, pPage, fProt, fWired)
b844496aef2c7a10e89a26770ad4c90daf5cfbfavboxsync#else
b844496aef2c7a10e89a26770ad4c90daf5cfbfavboxsync# define MY_PMAP_ENTER(pPhysMap, AddrR3, pPage, fProt, fWired) \
b844496aef2c7a10e89a26770ad4c90daf5cfbfavboxsync pmap_enter(pPhysMap, AddrR3, pPage, fProt, fWired)
b844496aef2c7a10e89a26770ad4c90daf5cfbfavboxsync#endif
b844496aef2c7a10e89a26770ad4c90daf5cfbfavboxsync
b844496aef2c7a10e89a26770ad4c90daf5cfbfavboxsync/**
b844496aef2c7a10e89a26770ad4c90daf5cfbfavboxsync * Check whether we can use kmem_alloc_attr for low allocs.
b844496aef2c7a10e89a26770ad4c90daf5cfbfavboxsync */
b844496aef2c7a10e89a26770ad4c90daf5cfbfavboxsync#if (__FreeBSD_version >= 900011) \
b844496aef2c7a10e89a26770ad4c90daf5cfbfavboxsync || (__FreeBSD_version < 900000 && __FreeBSD_version >= 800505) \
b844496aef2c7a10e89a26770ad4c90daf5cfbfavboxsync || (__FreeBSD_version < 800000 && __FreeBSD_version >= 703101)
b844496aef2c7a10e89a26770ad4c90daf5cfbfavboxsync# define USE_KMEM_ALLOC_ATTR
b844496aef2c7a10e89a26770ad4c90daf5cfbfavboxsync#endif
b844496aef2c7a10e89a26770ad4c90daf5cfbfavboxsync
88156ea3c42c60801ef3ff167b8097eb2aabcfddvboxsync/**
88156ea3c42c60801ef3ff167b8097eb2aabcfddvboxsync * Check whether we can use kmem_alloc_prot.
88156ea3c42c60801ef3ff167b8097eb2aabcfddvboxsync */
88156ea3c42c60801ef3ff167b8097eb2aabcfddvboxsync#if 0 /** @todo Not available yet. */
88156ea3c42c60801ef3ff167b8097eb2aabcfddvboxsync# define USE_KMEM_ALLOC_PROT
88156ea3c42c60801ef3ff167b8097eb2aabcfddvboxsync#endif
88156ea3c42c60801ef3ff167b8097eb2aabcfddvboxsync
1f1986470af9f0bb750dd859b142dc2e952deb20vboxsync#endif