the-linux-kernel.h revision e6c7f0916ea395e9211fe5a004cebe5934521694
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/* $Id$ */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @file
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * IPRT - Include all necessary headers for the Linux kernel.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/*
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * Copyright (C) 2006-2007 Oracle Corporation
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
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 *
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 *
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.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef ___the_linux_kernel_h
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#define ___the_linux_kernel_h
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/*
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync * Include iprt/types.h to install the bool wrappers.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Then use the linux bool type for all the stuff include here.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <iprt/types.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#define bool linux_bool
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync#ifndef AUTOCONF_INCLUDED
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# include <linux/autoconf.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <linux/version.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/* We only support 2.4 and 2.6 series kernels */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 4, 0)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# error We only support 2.4 and 2.6 series kernels
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 5, 0) && LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 0)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# error We only support 2.4 and 2.6 series kernels
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
223cf005b18af2c21352a70693ebaf0582f68ebcvboxsync#if defined(CONFIG_MODVERSIONS) && !defined(MODVERSIONS)
223cf005b18af2c21352a70693ebaf0582f68ebcvboxsync# define MODVERSIONS
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# if LINUX_VERSION_CODE < KERNEL_VERSION(2, 5, 71)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# include <linux/modversions.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef KBUILD_STR
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 16)
afed5ab737f4aacfae3fe73776f40e989190a7cavboxsync# define KBUILD_STR(s) s
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# define KBUILD_STR(s) #s
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <linux/string.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <linux/spinlock.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <linux/slab.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# include <linux/semaphore.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#else /* older kernels */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# include <asm/semaphore.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif /* older kernels */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <linux/module.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# include <linux/moduleparam.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <linux/kernel.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <linux/init.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <linux/fs.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <linux/mm.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <linux/pagemap.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <linux/slab.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <linux/time.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <linux/sched.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 7)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# include <linux/jiffies.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 16)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# include <linux/ktime.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# include <linux/hrtimer.h>
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync#endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <linux/wait.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 5, 71)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# include <linux/cpu.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# include <linux/notifier.h>
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync#endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/* For the basic additions module */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <linux/pci.h>
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync#include <linux/delay.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <linux/interrupt.h>
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync#include <linux/completion.h>
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync#include <linux/compiler.h>
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync#ifndef HAVE_UNLOCKED_IOCTL /* linux/fs.h defines this */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# include <linux/smp_lock.h>
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync#endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/* For the shared folders module */
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync#include <linux/vmalloc.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#define wchar_t linux_wchar_t
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <linux/nls.h>
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync#undef wchar_t
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync#include <asm/mman.h>
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync#include <asm/io.h>
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync#include <asm/uaccess.h>
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync#include <asm/div64.h>
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 0)
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync# ifndef page_to_pfn
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# define page_to_pfn(page) ((page) - mem_map)
fdea543f71872a3ec3909536a4fce37ab7aa3a8bvboxsync# endif
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync#endif
fdea543f71872a3ec3909536a4fce37ab7aa3a8bvboxsync
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync#ifndef DEFINE_WAIT
fdea543f71872a3ec3909536a4fce37ab7aa3a8bvboxsync# define DEFINE_WAIT(name) DECLARE_WAITQUEUE(name, current)
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync#endif
fdea543f71872a3ec3909536a4fce37ab7aa3a8bvboxsync
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync/*
8f7bc6ad2b7bbcb4b3b96248cd2478e45f2e3b88vboxsync * 2.4 / early 2.6 compatibility wrappers
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync */
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 7)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# ifndef MAX_JIFFY_OFFSET
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# define MAX_JIFFY_OFFSET ((~0UL >> 1)-1)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# endif
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync# if LINUX_VERSION_CODE < KERNEL_VERSION(2, 4, 29) || LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsyncDECLINLINE(unsigned int) jiffies_to_msecs(unsigned long cJiffies)
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync{
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync# if HZ <= 1000 && !(1000 % HZ)
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync return (1000 / HZ) * cJiffies;
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync# elif HZ > 1000 && !(HZ % 1000)
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync return (cJiffies + (HZ / 1000) - 1) / (HZ / 1000);
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync# else
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync return (cJiffies * 1000) / HZ;
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync# endif
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync}
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsyncDECLINLINE(unsigned long) msecs_to_jiffies(unsigned int cMillies)
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync{
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync# if HZ > 1000
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync if (cMillies > jiffies_to_msecs(MAX_JIFFY_OFFSET))
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync return MAX_JIFFY_OFFSET;
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync# endif
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync# if HZ <= 1000 && !(1000 % HZ)
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync return (cMillies + (1000 / HZ) - 1) / (1000 / HZ);
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync# elif HZ > 1000 && !(HZ % 1000)
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync return cMillies * (HZ / 1000);
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync# else
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync return (cMillies * HZ + 999) / 1000;
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync# endif
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync}
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync# endif /* < 2.4.29 || >= 2.6.0 */
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync#endif /* < 2.6.7 */
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync/*
26824086a3f6b36cd911058f1d9b4c0b944706fbvboxsync * 2.4 compatibility wrappers
26824086a3f6b36cd911058f1d9b4c0b944706fbvboxsync */
26824086a3f6b36cd911058f1d9b4c0b944706fbvboxsync#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 0)
68ef804c4ec232c58e2c03c8fc6afe3765c5c0d1vboxsync
68ef804c4ec232c58e2c03c8fc6afe3765c5c0d1vboxsync# define prepare_to_wait(q, wait, state) \
68ef804c4ec232c58e2c03c8fc6afe3765c5c0d1vboxsync do { \
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync add_wait_queue(q, wait); \
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync set_current_state(state); \
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync } while (0)
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync# define after_wait(wait) \
26824086a3f6b36cd911058f1d9b4c0b944706fbvboxsync do { \
26824086a3f6b36cd911058f1d9b4c0b944706fbvboxsync list_del_init(&(wait)->task_list); \
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync } while (0)
b8aaccdbdd143967110d499670605dd7ff6ecc72vboxsync
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync# define finish_wait(q, wait) \
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync do { \
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync set_current_state(TASK_RUNNING); \
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync remove_wait_queue(q, wait); \
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync } while (0)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#else /* >= 2.6.0 */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# define after_wait(wait) do {} while (0)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif /* >= 2.6.0 */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @def TICK_NSEC
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * The time between ticks in nsec */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef TICK_NSEC
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# define TICK_NSEC (1000000000UL / HZ)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * This sucks soooo badly on x86! Why don't they export __PAGE_KERNEL_EXEC so PAGE_KERNEL_EXEC would be usable?
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 8) && defined(RT_ARCH_AMD64)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# define MY_PAGE_KERNEL_EXEC PAGE_KERNEL_EXEC
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 8) && defined(PAGE_KERNEL_EXEC) && defined(CONFIG_X86_PAE)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# ifdef __PAGE_KERNEL_EXEC
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* >= 2.6.27 */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# define MY_PAGE_KERNEL_EXEC __pgprot(cpu_has_pge ? __PAGE_KERNEL_EXEC | _PAGE_GLOBAL : __PAGE_KERNEL_EXEC)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# define MY_PAGE_KERNEL_EXEC __pgprot(cpu_has_pge ? _PAGE_KERNEL_EXEC | _PAGE_GLOBAL : _PAGE_KERNEL_EXEC)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# define MY_PAGE_KERNEL_EXEC PAGE_KERNEL
b1c3cdef473df2fbc621d5da81acc82dbfb8a11avboxsync#endif
a11c569636fa6838bd423f4631a9660a5a84204bvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * The redhat hack section.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * - The current hacks are for 2.4.21-15.EL only.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef NO_REDHAT_HACKS
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/* accounting. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 0)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# ifdef VM_ACCOUNT
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# define MY_DO_MUNMAP(a,b,c) do_munmap(a, b, c, 0) /* should it be 1 or 0? */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/* backported remap_page_range. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 0)
3ecf9412133496b2aeb090cfd33a286404ec59fbvboxsync# include <asm/tlb.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# ifdef tlb_vma /* probably not good enough... */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# define HAVE_26_STYLE_REMAP_PAGE_RANGE 1
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# ifndef RT_ARCH_AMD64
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 */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# define MY_CHANGE_PAGE_ATTR(pPages, cPages, prot) \
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync do { \
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pgprot_val(prot) != pgprot_val(PAGE_KERNEL)) \
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync change_page_attr(pPages, cPages, prot); \
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync change_page_attr(pPages, cPages, prot); \
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync } while (0)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# endif /* !RT_ARCH_AMD64 */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif /* !NO_REDHAT_HACKS */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef MY_DO_MUNMAP
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# define MY_DO_MUNMAP(a,b,c) do_munmap(a, b, c)
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync#endif
223cf005b18af2c21352a70693ebaf0582f68ebcvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef MY_CHANGE_PAGE_ATTR
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 do { \
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync change_page_attr(pPages, cPages, PAGE_KERNEL_NOCACHE); \
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync change_page_attr(pPages, cPages, prot); \
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync } while (0)
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync# else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# define MY_CHANGE_PAGE_ATTR(pPages, cPages, prot) change_page_attr(pPages, cPages, prot)
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync# endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 25)
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#else
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync# define MY_SET_PAGES_EXEC(pPages, cPages) \
6b022885f2cb6a55167609edecd89570cd80001dvboxsync do { \
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)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# define MY_SET_PAGES_NOEXEC(pPages, cPages) \
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync do { \
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#endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @def ONE_MSEC_IN_JIFFIES
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * The number of jiffies that make up 1 millisecond. Must be at least 1! */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#if HZ <= 1000
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# define ONE_MSEC_IN_JIFFIES 1
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#elif !(HZ % 1000)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# define ONE_MSEC_IN_JIFFIES (HZ / 1000)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# define ONE_MSEC_IN_JIFFIES ((HZ + 999) / 1000)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# error "HZ is not a multiple of 1000, the GIP stuff won't work right!"
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Stop using the linux bool type.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#undef bool
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * There are post-2.6.24 kernels (confusingly with unchanged version number)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * which eliminate macros which were marked as deprecated.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef __attribute_used__
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#define __attribute_used__ __used
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
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.
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync */
9782b553bdb12385214a3ac596aff1476bcb7cbdvboxsync#ifdef RT_ARCH_AMD64
8a132edc1577cbe2a19cd778c1b2bea6ae5e8515vboxsync# define IPRT_DEBUG_SEMS_ADDRESS(addr) ( ((long)(addr) & (long)~UINT64_C(0xfffffff000000000)) )
b1c3cdef473df2fbc621d5da81acc82dbfb8a11avboxsync#else
8a132edc1577cbe2a19cd778c1b2bea6ae5e8515vboxsync# define IPRT_DEBUG_SEMS_ADDRESS(addr) ( (long)(addr) )
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Puts semaphore info into the task_struct::comm field if IPRT_DEBUG_SEMS is
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * defined.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifdef IPRT_DEBUG_SEMS
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# define IPRT_DEBUG_SEMS_STATE(pThis, chState) \
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync snprintf(current->comm, sizeof(current->comm), "%c%lx", (chState), IPRT_DEBUG_SEMS_ADDRESS(pThis));
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync#else
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync# define IPRT_DEBUG_SEMS_STATE(pThis, chState) do { } while (0)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Puts semaphore info into the task_struct::comm field if IPRT_DEBUG_SEMS is
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * defined.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync#ifdef IPRT_DEBUG_SEMS
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#else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# define IPRT_DEBUG_SEMS_STATE_RC(pThis, chState, rc) do { } while (0)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif
79b07d7ae28b916539c6397e010a5cc05e300551vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * There are some conflicting defines in iprt/param.h, sort them out here.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef ___iprt_param_h
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# undef PAGE_SIZE
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# undef PAGE_OFFSET_MASK
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# include <iprt/param.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync