#include <stdio.h>
#include <sys/syscall.h>
#include <unistd.h>
#define SYSCALL_NR 210
/*
#include <pthread.h>
pthread_t thread1,thread2;
pthread_mutex_t mtx;
pthread_cond_t cond=PTHREAD_COND_INITIALIZER;
#define BIND_CPU_CMD 0
#define GET_CPU_CMD  1
#define CPU_AFFINITY_MAX_RETRY 10
unsigned long long cpu0_time,cpu1_time;
unsigned long long hpet_cpu0,hpet_cpu1;

#define rdtsc(val) \
  __asm__ __volatile__("rdtsc" : "=A" (val))

unsigned long long
get_hpet_time(void){
  return 0;
}

int
get_cpuid(void){
  int rc;
  int cpuid=-1;

  rc=syscall(SYSCALL_NR,GET_CPU_CMD,0,&cpuid);
  if (rc) {
    return -1;
  }
  return cpuid;
}
int
set_cpu_affinity(int cpuid){
  int target_cpu,current_cpu;
  int max_retry=CPU_AFFINITY_MAX_RETRY;
  int rc;

  target_cpu=cpuid;

  rc=syscall(SYSCALL_NR,BIND_CPU_CMD,0,&target_cpu);
  if (rc)
    return -1;
  do{
    sleep(1);
    target_cpu=get_cpuid();
    if (target_cpu<0)
      return -1;
  }while((target_cpu != current_cpu)&&(--max_retry));

  return 0;
}
void *
cpu0_thread(void *arg){

  printf("bind to cpu0\n");
  set_cpu_affinity(0);
  printf("wait thread1\n");
  pthread_mutex_lock(&mtx);
  pthread_cond_wait(&cond,&mtx);
  printf("start cpu0\n");  

  hpet_cpu0=get_hpet_time();
  rdtsc(cpu0_time);
  pthread_mutex_unlock(&mtx);
}
void *
cpu1_thread(void *arg){
  sleep(1);
  set_cpu_affinity(1);
  pthread_mutex_lock(&mtx);
  pthread_cond_signal(&cond);
  printf("start cpu1\n");  
  pthread_mutex_unlock(&mtx);

  hpet_cpu1=get_hpet_time();  
  rdtsc(cpu1_time);
}
*/
int
main(int argc,char *argv[]){
  
  int rc = syscall(SYSCALL_NR);
/*
  int rc;

  pthread_mutex_init(&mtx,NULL);

  pthread_create(&thread1,NULL,cpu0_thread,NULL);
  pthread_create(&thread2,NULL,cpu1_thread,NULL);

  pthread_join(thread1,NULL);
  pthread_join(thread2,NULL);

  printf("CPU0,%llu,%llu\n",cpu0_time,hpet_cpu0);
  printf("CPU1,%llu,%llu\n",cpu1_time,hpet_cpu1);
*/
  return rc;
}

