the-linux-kernel.h revision e6c7f0916ea395e9211fe5a004cebe5934521694
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * IPRT - Include all necessary headers for the Linux kernel.
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * Copyright (C) 2006-2007 Oracle Corporation
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * available from http://www.virtualbox.org. This file is free software;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * you can redistribute it and/or modify it under the terms of the GNU
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * General Public License (GPL) as published by the Free Software
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * The contents of this file may alternatively be used under the terms
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * of the Common Development and Distribution License Version 1.0
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * VirtualBox OSE distribution, in which case the provisions of the
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * CDDL are applicable instead of those of the GPL.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * You may elect to license modified versions of this file under the
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * terms and conditions of either the GPL or the CDDL or both.
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync * Include iprt/types.h to install the bool wrappers.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Then use the linux bool type for all the stuff include here.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/* We only support 2.4 and 2.6 series kernels */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 5, 0) && LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 0)
223cf005b18af2c21352a70693ebaf0582f68ebcvboxsync#if defined(CONFIG_MODVERSIONS) && !defined(MODVERSIONS)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# define KBUILD_STR(s) #s
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#else /* older kernels */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif /* older kernels */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/* For the basic additions module */
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync#ifndef HAVE_UNLOCKED_IOCTL /* linux/fs.h defines this */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/* For the shared folders module */
fdea543f71872a3ec3909536a4fce37ab7aa3a8bvboxsync# define DEFINE_WAIT(name) DECLARE_WAITQUEUE(name, current)
8f7bc6ad2b7bbcb4b3b96248cd2478e45f2e3b88vboxsync * 2.4 / early 2.6 compatibility wrappers
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync# if LINUX_VERSION_CODE < KERNEL_VERSION(2, 4, 29) || LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsyncDECLINLINE(unsigned int) jiffies_to_msecs(unsigned long cJiffies)
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsyncDECLINLINE(unsigned long) msecs_to_jiffies(unsigned int cMillies)
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync# endif /* < 2.4.29 || >= 2.6.0 */
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync#endif /* < 2.6.7 */
26824086a3f6b36cd911058f1d9b4c0b944706fbvboxsync * 2.4 compatibility wrappers
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync } while (0)
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync } while (0)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync } while (0)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#else /* >= 2.6.0 */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif /* >= 2.6.0 */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @def TICK_NSEC
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * The time between ticks in nsec */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * This sucks soooo badly on x86! Why don't they export __PAGE_KERNEL_EXEC so PAGE_KERNEL_EXEC would be usable?
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 8) && defined(RT_ARCH_AMD64)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 8) && defined(PAGE_KERNEL_EXEC) && defined(CONFIG_X86_PAE)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* >= 2.6.27 */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# define MY_PAGE_KERNEL_EXEC __pgprot(cpu_has_pge ? __PAGE_KERNEL_EXEC | _PAGE_GLOBAL : __PAGE_KERNEL_EXEC)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# define MY_PAGE_KERNEL_EXEC __pgprot(cpu_has_pge ? _PAGE_KERNEL_EXEC | _PAGE_GLOBAL : _PAGE_KERNEL_EXEC)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * The redhat hack section.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * - The current hacks are for 2.4.21-15.EL only.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/* accounting. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# define MY_DO_MUNMAP(a,b,c) do_munmap(a, b, c, 0) /* should it be 1 or 0? */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/* backported remap_page_range. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/* In 2.6.9-22.ELsmp we have to call change_page_attr() twice when changing
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * the page attributes from PAGE_KERNEL to something else, because there appears
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * to be a bug in one of the many patches that redhat applied.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * It should be safe to do this on less buggy linux kernels too. ;-)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# define MY_CHANGE_PAGE_ATTR(pPages, cPages, prot) \
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync } while (0)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# endif /* !RT_ARCH_AMD64 */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif /* !NO_REDHAT_HACKS */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# ifdef RT_ARCH_AMD64 /** @todo This is a cheap hack, but it'll get around that 'else BUG();' in __change_page_attr(). */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# define MY_CHANGE_PAGE_ATTR(pPages, cPages, prot) \
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync change_page_attr(pPages, cPages, PAGE_KERNEL_NOCACHE); \
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync } while (0)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# define MY_CHANGE_PAGE_ATTR(pPages, cPages, prot) change_page_attr(pPages, cPages, prot)
78a205e3fc6719d59e8c561b3d287d3a4f879852vboxsync# define MY_SET_PAGES_EXEC(pPages, cPages) set_pages_x(pPages, cPages)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# define MY_SET_PAGES_NOEXEC(pPages, cPages) set_pages_nx(pPages, cPages)
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync if (pgprot_val(MY_PAGE_KERNEL_EXEC) != pgprot_val(PAGE_KERNEL)) \
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync MY_CHANGE_PAGE_ATTR(pPages, cPages, MY_PAGE_KERNEL_EXEC); \
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync } while (0)
6b022885f2cb6a55167609edecd89570cd80001dvboxsync if (pgprot_val(MY_PAGE_KERNEL_EXEC) != pgprot_val(PAGE_KERNEL)) \
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync MY_CHANGE_PAGE_ATTR(pPages, cPages, PAGE_KERNEL); \
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync } while (0)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @def ONE_MSEC_IN_JIFFIES
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * The number of jiffies that make up 1 millisecond. Must be at least 1! */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# error "HZ is not a multiple of 1000, the GIP stuff won't work right!"
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Stop using the linux bool type.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * There are post-2.6.24 kernels (confusingly with unchanged version number)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * which eliminate macros which were marked as deprecated.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Hack for shortening pointers on linux so we can stuff more stuff into the
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * task_struct::comm field. This is used by the semaphore code but put here
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * because we don't have any better place atm. Don't use outside IPRT, please.
8a132edc1577cbe2a19cd778c1b2bea6ae5e8515vboxsync# define IPRT_DEBUG_SEMS_ADDRESS(addr) ( ((long)(addr) & (long)~UINT64_C(0xfffffff000000000)) )
8a132edc1577cbe2a19cd778c1b2bea6ae5e8515vboxsync# define IPRT_DEBUG_SEMS_ADDRESS(addr) ( (long)(addr) )
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Puts semaphore info into the task_struct::comm field if IPRT_DEBUG_SEMS is
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync snprintf(current->comm, sizeof(current->comm), "%c%lx", (chState), IPRT_DEBUG_SEMS_ADDRESS(pThis));
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync# define IPRT_DEBUG_SEMS_STATE(pThis, chState) do { } while (0)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Puts semaphore info into the task_struct::comm field if IPRT_DEBUG_SEMS is
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# define IPRT_DEBUG_SEMS_STATE_RC(pThis, chState, rc) \
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync snprintf(current->comm, sizeof(current->comm), "%c%lx:%d", (chState), IPRT_DEBUG_SEMS_ADDRESS(pThis), rc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# define IPRT_DEBUG_SEMS_STATE_RC(pThis, chState, rc) do { } while (0)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * There are some conflicting defines in iprt/param.h, sort them out here.