#include <linux/stringify.h>

#ifndef KVM__UTIL_H
#define KVM__UTIL_H

#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))

/*
 * Some bits are stolen from perf tool :)
 */

#include <unistd.h>
#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <stdbool.h>
#include <signal.h>
#include <errno.h>
#include <limits.h>
#include <sys/param.h>
#include <sys/types.h>
#include <linux/types.h>

#ifdef __GNUC__
#define NORETURN __attribute__((__noreturn__))
#else
#define NORETURN
#ifndef __attribute__
#define __attribute__(x)
#endif
#endif

#define LOGLEVEL_ERROR		0
#define LOGLEVEL_WARNING	1
#define LOGLEVEL_INFO		2
#define LOGLEVEL_DEBUG		3

#define PROT_RW (PROT_READ|PROT_WRITE)
#define MAP_ANON_NORESERVE (MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE)

extern void die(const char *err, ...) NORETURN __attribute__((format (printf, 1, 2)));
extern void die_perror(const char *s) NORETURN;
extern void pr_err(const char *err, ...) __attribute__((format (printf, 1, 2)));
extern void pr_warning(const char *err, ...) __attribute__((format (printf, 1, 2)));
extern void pr_info(const char *err, ...) __attribute__((format (printf, 1, 2)));
extern void __pr_debug(const char *debug, ...) __attribute__((format (printf, 1, 2)));
extern void set_die_routine(void (*routine)(const char *err, va_list params) NORETURN);

extern int loglevel;

#define pr_debug(fmt, ...)						\
	do {								\
		if (loglevel >= LOGLEVEL_DEBUG)				\
			__pr_debug("(%s) %s:%d: " fmt, __FILE__,	\
				__func__, __LINE__, ##__VA_ARGS__);	\
	} while (0)


#define BUILD_BUG_ON(condition)	((void)sizeof(char[1 - 2*!!(condition)]))

#ifndef BUG_ON_HANDLER
# define BUG_ON_HANDLER(condition)					\
	do {								\
		if ((condition)) {					\
			pr_err("BUG at %s:%d", __FILE__, __LINE__);	\
			raise(SIGABRT);					\
		}							\
	} while (0)
#endif

#define BUG_ON(condition)	BUG_ON_HANDLER((condition))

#define DIE_IF(cnd)						\
do {								\
	if (cnd)						\
	die(" at (" __FILE__ ":" __stringify(__LINE__) "): "	\
		__stringify(cnd) "\n");				\
} while (0)

#define WARN_ON(condition) ({					\
	int __ret_warn_on = !!(condition);			\
	if (__ret_warn_on)					\
		pr_warning("(%s) %s:%d: failed condition: %s",	\
				__FILE__, __func__, __LINE__,	\
				__stringify(condition));	\
	__ret_warn_on;						\
})

#define WARN_ONCE(condition, format, args...) ({	\
	static int __warned;							\
	int __ret_warn_on = !!(condition);				\
	if (!__warned && __ret_warn_on) {				\
		__warned = 1;								\
		pr_warning(format, args);					\
	}												\
	__ret_warn_on;									\
})

#define MSECS_TO_USECS(s) ((s) * 1000)

/* Millisecond sleep */
static inline void msleep(unsigned int msecs)
{
	usleep(MSECS_TO_USECS(msecs));
}

/*
 * Find last (most significant) bit set. Same implementation as Linux:
 * fls(0) = 0, fls(1) = 1, fls(1UL << 63) = 64
 */
static inline int fls_long(unsigned long x)
{
	return x ? sizeof(x) * 8 - __builtin_clzl(x) : 0;
}

static inline unsigned long roundup_pow_of_two(unsigned long x)
{
	return x ? 1UL << fls_long(x - 1) : 0;
}

#define is_power_of_two(x)	((x) > 0 ? ((x) & ((x) - 1)) == 0 : 0)

/**
 * pow2_size: return the number of bits needed to store values
 * @x: number of distinct values to store (or number of bytes)
 *
 * Determines the number of bits needed to store @x different values.
 * Could be used to determine the number of address bits needed to
 * store @x bytes.
 *
 * Example:
 * pow2_size(255) => 8
 * pow2_size(256) => 8
 * pow2_size(257) => 9
 *
 * Return: number of bits
 */
static inline int pow2_size(unsigned long x)
{
	if (x <= 1)
		return x;

	return sizeof(x) * 8 - __builtin_clzl(x - 1);
}

struct kvm;
void *mmap_hugetlbfs(struct kvm *kvm, const char *htlbfs_path, u64 size);
void *mmap_anon_or_hugetlbfs(struct kvm *kvm, const char *hugetlbfs_path, u64 size);

#endif /* KVM__UTIL_H */
