#include <stdio.h>
#include <stdlib.h>
#include <asm/msr.h>
//#include <asm/cpu.h>
//#include <asm/processor.h>

typedef unsigned int u32;
typedef unsigned long long u64;

static __inline__ unsigned long long read_rdmsr(unsigned int msr)
{
  u32 high, low;
  //__asm__ ("cpuid\n");
  asm volatile("rdmsr" : "=a" (low), "=d" (high) : "c" (msr));
  //__asm__ __volatile__ ("rdmsr" : "=a"(lo), "=d"(hi));
  //return ( (unsigned long long)lo)|( ((unsigned long long)hi)<<32 );
  return ((low) | ((u64)(high) << 32));
}


int main(int argc, char **argv){
	/*
Detect MSR_IA32_PERF_STATUS
  lo:100682532
11110101110011101001
  hi:102124836
11111001010101000000

Detect MSR_IA32_PLATFORM_ID
  lo:-1367028444
100001010111111110
  hi:67108864
11001100110011001100110
	*/

	u64 full;
	u32 lo, hi;
printf("u64: %lu\n", sizeof(u64) );

	//asm volatile("rdmsr" : EAX_EDX_RET(val, low, high) : "c" (msr));

	full = read_rdmsr(MSR_IA32_PERF_STATUS);
//	rdmsr(MSR_IA32_PERF_STATUS, lo, hi);
//	printf("PERF_STATUS lo: %d hi: %d\n", lo, hi);
//	rdmsr(MSR_IA32_PLATFORM_ID, lo, hi);
//	printf("PLATFORM_ID lo: %d hi: %d\n", lo, hi);




	return 0;
}
