#include <stdio.h>
#include <sched.h>
#include <stdbool.h>
#include <pthread.h>

#define _GNU_SOURCE

#include <stdint.h>
#include <unistd.h>
#include <malloc.h>
#include <sys/syscall.h>
#include <sys/types.h>

int sched_getcpu(void)
{
	int cpu_id;

	asm volatile("mrs %0, S3_3_c15_c3_1" : "=r" (cpu_id));

	return cpu_id & 0xFF;
}

int sched_getnode(void)
{
	int cpu_id;

	asm volatile("mrs %0, S3_3_c15_c3_1" : "=r" (cpu_id));

	return (cpu_id >> 8) & 0xFF;
}

int sched_get_node_cpu(int *node, int *cpu)
{
	int cpu_id;

	asm volatile("mrs %0, S3_3_c15_c3_1" : "=r" (cpu_id));

	*cpu = cpu_id & 0xFF;
	*node = (cpu_id >> 8) & 0xFF;

	return 0;
}

int main(int argc, char *argv[])
{
	int cpu, node, ret;

	ret = sched_get_node_cpu(&node, &cpu);

	printf("node %2d, cpu %3d: node %2d, cpu %3d\n",
		node, cpu, sched_getnode(), sched_getcpu());

	return 0;
}
