/**
 * @file compat.h
 * This file is intended to be up-to-date with the last linux version and
 * provide work-arounds for missing features in previous kernel version
 *
 * @remark Copyright 2002 OProfile authors
 * @remark Read the file COPYING
 *
 * @author John Levon
 * @author Philippe Elie
 */


#ifndef COMPAT_H
#define COMPAT_H

#include <linux/version.h>
#include <linux/module.h>
#ifdef HAVE_LINUX_SPINLOCK_HEADER
/* FIXME do we need this still ? */
#include <linux/spinlock.h>
#endif

#define V_BEFORE(a, b, c) (LINUX_VERSION_CODE < KERNEL_VERSION(a, b, c))
#define V_AT_LEAST(a, b, c) (LINUX_VERSION_CODE >= KERNEL_VERSION(a, b, c))

#if V_BEFORE(2, 4, 0)
	#include "compat22.h"
#else
	#include "compat24.h"
#endif

#include "op_cache.h"

/* Things that cannot rely on a particular linux version or are needed between
 * major release */

#ifndef BUG_ON
#define BUG_ON(p) do { if (p) BUG(); } while (0)
#endif

#ifndef MODULE_LICENSE
#define MODULE_LICENSE(x)
#endif

/* Compiler work-around */

/* branch prediction */
#ifndef likely
	#ifdef EXPECT_OK
		#define likely(a) __builtin_expect((a), 1)
	#else
		#define likely(a) (a)
	#endif
#endif
#ifndef unlikely
	#ifdef EXPECT_OK
		#define unlikely(a) __builtin_expect((a), 0)
	#else
		#define unlikely(a) (a)
	#endif
#endif

#ifndef CONFIG_X86_64
#define VMALLOC_32(sz) vmalloc_32(sz)
#else /* CONFIG_X86_64 */
#define VMALLOC_32(sz) vmalloc(sz)
#endif /* CONFIG_X86_64 */

#endif /* COMPAT_H */