#ifndef _VCORE_H
#define _VCORE_H

#ifdef __cplusplus
extern "C" {
#endif

#include <arch/vcore.h>
#include <arch/atomic.h>
#include <sys/param.h>
#include <string.h>
#include <timing.h>

/*****************************************************************************/
/* TODO: This is a complete hack, but necessary for vcore stuff to work for now
 * The issue is that exit sometimes calls sys_yield(), and we can't recover from
 * that properly under our vcore model (we shouldn't though).  We really need to
 * rethink what sys_yield 'should' do when in multicore mode, or else come up 
 * with a different syscall entirely. */
#include <stdlib.h>
#include <unistd.h>
#undef exit
#define exit(status) _exit(status)
/*****************************************************************************/

#define LOG2_MAX_VCORES 6
#define MAX_VCORES (1 << LOG2_MAX_VCORES)

#define TRANSITION_STACK_PAGES 2
#define TRANSITION_STACK_SIZE (TRANSITION_STACK_PAGES*PGSIZE)

/* Defined by glibc; Must be implemented by a user level threading library */
extern void vcore_entry();
/* Defined in glibc's start.c */
extern __thread bool __vcore_context;
extern __thread int __vcoreid;
/* Defined in vcore.c */
extern __thread struct syscall __vcore_one_sysc;	/* see sys_change_vcore */

/* Vcore API functions */
static inline uint32_t max_vcores(void);
static inline uint32_t num_vcores(void);
static inline int vcore_id(void);
static inline bool in_vcore_context(void);
static inline bool in_multi_mode(void);
static inline void __enable_notifs(uint32_t vcoreid);
static inline void __disable_notifs(uint32_t vcoreid);
static inline bool notif_is_enabled(uint32_t vcoreid);
static inline bool vcore_is_mapped(uint32_t vcoreid);
static inline bool vcore_is_preempted(uint32_t vcoreid);
static inline struct preempt_data *vcpd_of(uint32_t vcoreid);
static inline bool preempt_is_pending(uint32_t vcoreid);
static inline bool __preempt_is_pending(uint32_t vcoreid);
static inline void *get_vcpd_tls_desc(uint32_t vcoreid);
static inline void set_vcpd_tls_desc(uint32_t vcoreid, void *tls_desc);
static inline uint64_t vcore_account_resume_nsec(uint32_t vcoreid);
static inline uint64_t vcore_account_total_nsec(uint32_t vcoreid);
void vcore_init(void);
void vcore_event_init(void);
void vcore_change_to_m(void);
int vcore_request(long nr_new_vcores);
void vcore_yield(bool preempt_pending);
void vcore_reenter(void (*entry_func)(void));
void enable_notifs(uint32_t vcoreid);
void disable_notifs(uint32_t vcoreid);
void vcore_idle(void);
void ensure_vcore_runs(uint32_t vcoreid);
void cpu_relax_vc(uint32_t vcoreid);
uint32_t get_vcoreid(void);
bool check_vcoreid(const char *str, uint32_t vcoreid);

/* Static inlines */
static inline uint32_t max_vcores(void)
{
	return MIN(__procinfo.max_vcores, MAX_VCORES);
}

static inline uint32_t num_vcores(void)
{
	return __procinfo.num_vcores;
}

static inline int vcore_id(void)
{
	return __vcoreid;
}

static inline bool in_vcore_context(void)
{
	return __vcore_context;
}

static inline bool in_multi_mode(void)
{
	return __procinfo.is_mcp;
}

/* Only call this if you know what you are doing. */
static inline void __enable_notifs(uint32_t vcoreid)
{
	vcpd_of(vcoreid)->notif_disabled = FALSE;
}

static inline void __disable_notifs(uint32_t vcoreid)
{
	vcpd_of(vcoreid)->notif_disabled = TRUE;
}

static inline bool notif_is_enabled(uint32_t vcoreid)
{
	return !vcpd_of(vcoreid)->notif_disabled;
}

static inline bool vcore_is_mapped(uint32_t vcoreid)
{
	return __procinfo.vcoremap[vcoreid].valid;
}

/* We could also check for VC_K_LOCK, but that's a bit much. */
static inline bool vcore_is_preempted(uint32_t vcoreid)
{
	struct preempt_data *vcpd = vcpd_of(vcoreid);
	return atomic_read(&vcpd->flags) & VC_PREEMPTED;
}

static inline struct preempt_data *vcpd_of(uint32_t vcoreid)
{
	return &__procdata.vcore_preempt_data[vcoreid];
}

/* Uthread's can call this in case they care if a preemption is coming.  If a
 * preempt is incoming, this will return TRUE, if you are in uthread context.  A
 * reasonable response for a uthread is to yield, and vcore_entry will deal with
 * the preempt pending.
 *
 * If you call this from vcore context, it will do nothing.  In general, it's
 * not safe to just yield (or do whatever you plan on doing) from arbitrary
 * places in vcore context.  So we just lie about PP. */
static inline bool preempt_is_pending(uint32_t vcoreid)
{
	if (in_vcore_context())
		return FALSE;
	return __preempt_is_pending(vcoreid);
}

static inline bool __preempt_is_pending(uint32_t vcoreid)
{
	return __procinfo.vcoremap[vcoreid].preempt_pending;
}

/* The kernel interface uses uintptr_t, but we have a lot of older code that
 * uses void *, hence the casting. */
static inline void *get_vcpd_tls_desc(uint32_t vcoreid)
{
	return (void*)__procdata.vcore_preempt_data[vcoreid].vcore_tls_desc;
}

static inline void set_vcpd_tls_desc(uint32_t vcoreid, void *tls_desc)
{
	__procdata.vcore_preempt_data[vcoreid].vcore_tls_desc = (uintptr_t)tls_desc;
}

static inline uint64_t vcore_account_resume_ticks(uint32_t vcoreid)
{
	return __procinfo.vcoremap[vcoreid].resume_ticks;
}

static inline uint64_t vcore_account_resume_nsec(uint32_t vcoreid)
{
	return tsc2nsec(vcore_account_resume_ticks(vcoreid));
}

static inline uint64_t vcore_account_total_ticks(uint32_t vcoreid)
{
	return __procinfo.vcoremap[vcoreid].total_ticks;
}

static inline uint64_t vcore_account_total_nsec(uint32_t vcoreid)
{
	return tsc2nsec(vcore_account_total_ticks(vcoreid));
}

static inline uint64_t vcore_account_uptime_ticks(uint32_t vcoreid)
{
	uint64_t resume = __procinfo.vcoremap[vcoreid].resume_ticks; 
	uint64_t total = __procinfo.vcoremap[vcoreid].total_ticks; 
	uint64_t now = read_tsc();
	return now - resume + total;
}

static inline uint64_t vcore_account_uptime_nsec(uint32_t vcoreid)
{
	return tsc2nsec(vcore_account_uptime_ticks(vcoreid));
}

#ifndef __PIC__

#define begin_safe_access_tls_vars()

#define end_safe_access_tls_vars()

#else

#include <features.h>
#if __GNUC_PREREQ(4,4)

/* These macro acrobatics trick the compiler into not caching the (linear)
 * address of TLS variables across loads/stores of the TLS descriptor, in lieu
 * of a "TLS cmb()". */
#define begin_safe_access_tls_vars()                                           \
	void __attribute__((noinline, optimize("O0")))                             \
	safe_access_tls_var_internal() {                                           \
		asm("");                                                               \

#define end_safe_access_tls_vars()                                             \
	} safe_access_tls_var_internal();                                          \

#else

#define begin_safe_access_tls_vars()                                           \
	printf("ERROR: For PIC use gcc 4.4 or above for tls support!\n");          \
	printf("ERROR: As a quick fix, recompile your app with -static...\n");     \
	exit(2);

#define end_safe_access_tls_vars()                                             \
	printf("Will never be called because we abort above!");                    \
	exit(2);

#endif //__GNUC_PREREQ
#endif // __PIC__

/* Switches into the TLS 'tls_desc'.  Capable of being called from either
 * uthread or vcore context.  Pairs with end_access_tls_vars(). */
#define begin_access_tls_vars(tls_desc)                                        \
{                                                                              \
	struct uthread *caller;                                                    \
	uint32_t vcoreid;                                                          \
	void *temp_tls_desc;                                                       \
	bool invcore = in_vcore_context();                                         \
	if (!invcore) {                                                            \
		caller = current_uthread;                                              \
		/* If you have no current_uthread, you might be called too early in the
		 * process's lifetime.  Make sure something like uthread_slim_init() has
		 * been run. */                                                        \
		assert(caller);                                                        \
		/* We need to disable notifs here (in addition to not migrating), since
		 * we could get interrupted when we're in the other TLS, and when the
		 * vcore restarts us, it will put us in our old TLS, not the one we were
		 * in when we were interrupted.  We need to not migrate, since once we
		 * know the vcoreid, we depend on being on the same vcore throughout.*/\
		caller->flags |= UTHREAD_DONT_MIGRATE;                                 \
		/* Not concerned about cross-core memory ordering, so no CPU mbs needed.
		 * The cmb is to prevent the compiler from issuing the vcore read before
		 * the DONT_MIGRATE write. */                                          \
		cmb();                                                                 \
		vcoreid = vcore_id();                                                  \
		disable_notifs(vcoreid);                                               \
	} else { /* vcore context */                                               \
		vcoreid = vcore_id();                                                  \
	}                                                                          \
	temp_tls_desc = get_tls_desc(vcoreid);                                     \
	set_tls_desc(tls_desc, vcoreid);                                           \
	begin_safe_access_tls_vars();

#define end_access_tls_vars()                                                  \
	end_safe_access_tls_vars();                                                \
	set_tls_desc(temp_tls_desc, vcoreid);                                      \
	if (!invcore) {                                                            \
		/* Note we reenable migration before enabling notifs, which is reverse
		 * from how we disabled notifs.  We must enabling migration before
		 * enabling notifs.  See 6c7fb12 and 5e4825eb4 for details. */         \
		caller->flags &= ~UTHREAD_DONT_MIGRATE;                                \
		cmb();	/* turn off DONT_MIGRATE before enabling notifs */             \
		if (in_multi_mode())                                                   \
			enable_notifs(vcoreid);                                            \
	}                                                                          \
}

#define safe_set_tls_var(name, val)                                            \
({                                                                             \
	begin_safe_access_tls_vars();                                              \
	name = val;                                                                \
	end_safe_access_tls_vars();                                                \
})

#define safe_get_tls_var(name)                                                 \
({                                                                             \
	typeof(name) __val;                                                        \
	begin_safe_access_tls_vars();                                              \
	__val = name;                                                              \
	end_safe_access_tls_vars();                                                \
	__val;                                                                     \
})

#define vcore_set_tls_var(name, val)                                           \
({                                                                             \
	typeof(val) __val = val;                                                   \
	begin_access_tls_vars(get_vcpd_tls_desc(vcoreid));                         \
	name = __val;                                                              \
	end_access_tls_vars();                                                     \
})

#define vcore_get_tls_var(name)                                                \
({                                                                             \
	typeof(name) val;                                                          \
	begin_access_tls_vars(get_vcpd_tls_desc(vcoreid));                         \
	val = name;                                                                \
	end_access_tls_vars();                                                     \
	val;                                                                       \
})

#ifdef __cplusplus
}
#endif

#endif
