#ifndef ROS_ARCH_COREID_H
#define ROS_ARCH_COREID_H

#include <ros/common.h>
#include <arch/apic.h>

static inline int get_hw_coreid(uint32_t coreid) __attribute__((always_inline));
static inline int hw_core_id(void) __attribute__((always_inline));
static inline int get_os_coreid(int hw_coreid) __attribute__((always_inline));
static inline int core_id(void) __attribute__((always_inline));
static inline int node_id(void) __attribute__((always_inline));
static inline int core_id_early(void) __attribute__((always_inline));

/* declared in smp.c */
extern int hw_coreid_lookup[MAX_NUM_CPUS];
extern int os_coreid_lookup[MAX_NUM_CPUS];

/* os_coreid -> hw_coreid */
static inline int get_hw_coreid(uint32_t coreid)
{
	return hw_coreid_lookup[coreid];
}

static inline int hw_core_id(void)
{
	return lapic_get_id();
}

/* hw_coreid -> os_coreid */
static inline int get_os_coreid(int hw_coreid)
{
	return os_coreid_lookup[hw_coreid];
}

static inline int node_id(void)
{
	return 0;
}

static inline int core_id(void)
{
	int coreid;
	/* assuming we're right after stacktop.  gs base is the pcpui struct, but we
	 * don't have access to the pcpui struct or to the extern per_cpu_info here,
	 * due to include loops. */
	asm volatile ("movl %%gs:8, %0" : "=r"(coreid));
	return coreid;
}

/* Tracks whether it is safe to execute core_id() or not. */
extern bool core_id_ready;
static inline int core_id_early(void)
{
	if (!core_id_ready)
		return 0;
	return core_id();
}

#endif /* ROS_ARCH_COREID_H */
