#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)

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;
int memfd_alloc(struct kvm *kvm, size_t size, bool hugetlb, u64 hugepage_size);
void *mmap_anon_or_hugetlbfs_align(struct kvm *kvm, const char *hugetlbfs_path,
				   u64 size, u64 align);
void *mmap_anon_or_hugetlbfs(struct kvm *kvm, const char *hugetlbfs_path, u64 size);

#endif /* KVM__UTIL_H */
