Beispiel #1
0
void unload_guest_pcore(struct proc *p, int guest_pcoreid)
{
	struct guest_pcore *gpc;
	struct per_cpu_info *pcpui = &per_cpu_info[core_id()];

	gpc = lookup_guest_pcore(p, guest_pcoreid);
	assert(gpc);
	spin_lock(&p->vmm.lock);
	assert(gpc->cpu != -1);
	vmx_unload_guest_pcore(gpc);
	gpc->cpu = -1;

	/* Save guest's xcr0 and restore Akaros's default. */
	gpc->xcr0 = rxcr0();
	lxcr0(__proc_global_info.x86_default_xcr0);

	/* We manage these MSRs manually. */
	gpc->msr_kern_gs_base = read_kern_gsbase();
	gpc->msr_star = read_msr(MSR_STAR);
	gpc->msr_lstar = read_msr(MSR_LSTAR);
	gpc->msr_sfmask = read_msr(MSR_SFMASK);

	write_kern_gsbase((uint64_t)pcpui);
	if (gpc->msr_star != AKAROS_MSR_STAR)
		write_msr(MSR_STAR, AKAROS_MSR_STAR);
	if (gpc->msr_lstar != AKAROS_MSR_LSTAR)
		write_msr(MSR_LSTAR, AKAROS_MSR_LSTAR);
	if (gpc->msr_sfmask, AKAROS_MSR_SFMASK)
		write_msr(MSR_SFMASK, AKAROS_MSR_SFMASK);

	/* As soon as we unlock, this gpc can be started on another core */
	spin_unlock(&p->vmm.lock);
	pcpui->guest_pcoreid = -1;
}
// Extract each core RRPL Data elapsed data
int32_t core_data_elapsed ( int32_t core , struct CoreData * core_data ) {  
  long long result;
  
  if ( core_data[core].core_id != core ) { exit ( 0 ); }
  result=read_msr(core_data[core].msr_fd,MSR_PKG_ENERGY_STATUS);
  core_data[core].package_after=(double)result*core_data[core].energy_units;
  
  result=read_msr(core_data[core].msr_fd,MSR_PP0_ENERGY_STATUS);
  core_data[core].pp0_after=(double)result*core_data[core].energy_units;
  
  /* not available on SandyBridge-EP */
  if ((cpu_model==CPU_SANDYBRIDGE) || (cpu_model==CPU_IVYBRIDGE) ||
	(cpu_model==CPU_HASWELL) || (cpu_model==CPU_HASWELL_EP) ) {
     result=read_msr(core_data[core].msr_fd,MSR_PP1_ENERGY_STATUS);
     core_data[core].pp1_after=(double)result*core_data[core].energy_units;
  }

  if ((cpu_model==CPU_SANDYBRIDGE_EP) || (cpu_model==CPU_IVYBRIDGE_EP) ||
	(cpu_model==CPU_HASWELL) || (cpu_model==CPU_HASWELL_EP) ) {
     result=read_msr(core_data[core].msr_fd,MSR_DRAM_ENERGY_STATUS);
     core_data[core].dram_after=(double)result*core_data[core].energy_units;
  }


}
/* Enable prefetch on core2 */
static int enable_prefetch_core2(int core) {

	int fd;
	uint64_t result;
	int begin,end,c;

	printf("Enable all prefetch\n");

	if (core==-1) {
		begin=0;
		end=1024;
	}
	else {
		begin=core;
		end=core;
	}

	for(c=begin;c<=end;c++) {

		fd=open_msr(c);
		if (fd<0) break;

		/* Read original results */
		result=read_msr(fd,CORE2_PREFETCH_MSR);

		printf("\tCore %d old : L2HW=%c L2ADJ=%c DCU=%c DCUIP=%c\n",
			c,
			result&(1ULL<<9)?'N':'Y',
			result&(1ULL<<19)?'N':'Y',
			result&(1ULL<<37)?'N':'Y',
			result&(1ULL<<39)?'N':'Y'
			);

		/* Enable all */
		result &= ~((1ULL<<9)|(1ULL<<19)|(1ULL<<37)|(1ULL<<39));
		result=write_msr(fd,CORE2_PREFETCH_MSR,result);

		/* Verify change */
		result=read_msr(fd,CORE2_PREFETCH_MSR);

		printf("\tCore %d new : L2HW=%c L2ADJ=%c DCU=%c DCUIP=%c\n",
			c,
			result&(1ULL<<9)?'N':'Y',
			result&(1ULL<<19)?'N':'Y',
			result&(1ULL<<37)?'N':'Y',
			result&(1ULL<<39)?'N':'Y'
			);

		close(fd);

	}

	return 0;
}
/* Enable prefetch on nehalem and newer */
static int enable_prefetch_nhm(int core) {

	int fd;
	int result;
	int begin,end,c;

	printf("Enable all prefetch\n");

	if (core==-1) {
		begin=0;
		end=1024;
	}
	else {
		begin=core;
		end=core;
	}

	for(c=begin;c<=end;c++) {

		fd=open_msr(c);
		if (fd<0) break;

		/* Read original results */
		result=read_msr(fd,NHM_PREFETCH_MSR);

		printf("\tCore %d old : L2HW=%c L2ADJ=%c DCU=%c DCUIP=%c\n",
			c,
			result&0x1?'N':'Y',
			result&0x2?'N':'Y',
			result&0x4?'N':'Y',
			result&0x8?'N':'Y'
			);

		/* Enable all */
		result=write_msr(fd,NHM_PREFETCH_MSR,0x0);

		/* Verify change */
		result=read_msr(fd,NHM_PREFETCH_MSR);

		printf("\tCore %d new : L2HW=%c L2ADJ=%c DCU=%c DCUIP=%c\n",
			c,
			result&0x1?'N':'Y',
			result&0x2?'N':'Y',
			result&0x4?'N':'Y',
			result&0x8?'N':'Y'
			);

		close(fd);

	}

	return 0;
}
Beispiel #5
0
void
get_raw_power_info( int package, int domain, uint64_t *pval ){
	switch(domain){
		case PKG_DOMAIN:	read_msr( package, MSR_PKG_POWER_INFO, pval );		
					break;
#ifdef ARCH_062D
		case DRAM_DOMAIN:	read_msr( package, MSR_DRAM_POWER_INFO, pval );		
					break;
#endif
		default:		assert(0); // Not avail for PP0/PP1 domains.
					break;
	}
}
Beispiel #6
0
void
get_raw_policy( int package, int domain, uint64_t *ppolicy ){
	switch( domain ){
		case PP0_DOMAIN:	read_msr( package, MSR_PP0_POLICY, ppolicy );	
					break;
#ifdef ARCH_062A
		case PP1_DOMAIN: 	read_msr( package, MSR_PP1_POLICY, ppolicy );	
					break;
#endif
		default:		assert(0);
					break;
	}
}
Beispiel #7
0
void rapl_init(struct PowerState * pstate){
  uint64_t result = read_msr(MSR_RAPL_POWER_UNIT, pstate->msr_fh);
  pstate->power_units = pow(0.5,(double)(result&0xf));
  pstate->energy_units = pow(0.5,(double)((result>>8)&0x1f));
  pstate->time_units = pow(0.5,(double)((result>>16)&0xf));
  pstate->pkg_pwr = 0;
  pstate->pp0_pwr = 0;
  uint64_t initial_value = read_msr(MSR_PKG_ENERGY_STATUS, pstate->msr_fh);
  do {
    pstate->pkg_reg_value = read_msr(MSR_PKG_ENERGY_STATUS, pstate->msr_fh);
    pstate->pp0_reg_value = read_msr(MSR_PP0_ENERGY_STATUS, pstate->msr_fh);
  } while (pstate->pkg_reg_value == initial_value); // ensure a fresh reading
}
Beispiel #8
0
static int mperf_measure_stats(unsigned int cpu)
{
	unsigned long long val;
	int ret;

	ret = read_msr(cpu, MSR_APERF, &val);
	aperf_current_count[cpu] = val;
	ret |= read_msr(cpu, MSR_MPERF, &val);
	mperf_current_count[cpu] = val;
	is_valid[cpu] = !ret;

	return 0;
}
Beispiel #9
0
static int mperf_init_stats(unsigned int cpu)
{
	unsigned long long val;
	int ret;

	ret = read_msr(cpu, MSR_APERF, &val);
	aperf_previous_count[cpu] = val;
	ret |= read_msr(cpu, MSR_MPERF, &val);
	mperf_previous_count[cpu] = val;
	is_valid[cpu] = !ret;

	return 0;
}
Beispiel #10
0
/*
 * get_aperf_mperf()
 *
 * Returns the current aperf/mperf MSR values of cpu
 */
static int get_aperf_mperf(unsigned int cpu, uint64_t *aperf, uint64_t *mperf)
{
	int retval;

	retval = read_msr(cpu, MSR_IA32_APERF, (unsigned long long*)aperf);
	if (retval < 0)
		return retval;

	retval = read_msr(cpu, MSR_IA32_MPERF, (unsigned long long*)mperf);
	if (retval < 0)
		return retval;
	return 0;
}
Beispiel #11
0
void rapl_finalize(struct PowerState * pstate){
  // TODO disable signal
  uint64_t case_reads = 3;
  uint64_t test_reads = 3;
  const uint64_t pkg_init = pstate->pkg_reg_value;
  const uint64_t pp0_init = pstate->pp0_reg_value;
  const uint64_t pkg_pre = read_msr(MSR_PKG_ENERGY_STATUS, pstate->msr_fh);
  const uint64_t pp0_pre = read_msr(MSR_PP0_ENERGY_STATUS, pstate->msr_fh);
  while(read_msr(MSR_PKG_ENERGY_STATUS, pstate->msr_fh) == pkg_pre) {
    ++case_reads;
  }
  const uint64_t pkg_post = read_msr(MSR_PKG_ENERGY_STATUS, pstate->msr_fh);
  const uint64_t pp0_post = read_msr(MSR_PP0_ENERGY_STATUS, pstate->msr_fh);
  while(read_msr(MSR_PKG_ENERGY_STATUS, pstate->msr_fh) == pkg_post) {
    ++test_reads;
  }
  const uint64_t pkg_exit = read_msr(MSR_PKG_ENERGY_STATUS, pstate->msr_fh);
  const uint64_t pp0_exit = read_msr(MSR_PP0_ENERGY_STATUS, pstate->msr_fh);

 
  double ratio =  ((double) case_reads)   / ((double) test_reads);

  // Should be max of what it is, post - (exit - post) * case_reads / test_reads)
  pstate->pkg_reg_value = fmax(pkg_pre, (uint64_t) pkg_post - (pkg_exit - pkg_post) 
                                                           * ratio);
  pstate->pp0_reg_value = fmax(pp0_pre, (uint64_t) pp0_post - (pp0_exit - pp0_post) 
                                                           * ratio);
  pstate->pkg_pwr += (pstate->pkg_reg_value - pkg_init) * pstate->energy_units;
  pstate->pp0_pwr += (pstate->pp0_reg_value - pp0_init) * pstate->energy_units;
}
Beispiel #12
0
int main(void) {
  int fd;
  long long result;
  double power_units,energy_units,time_units;
  double package_before,package_after;
  double pp0_before,pp0_after;
  double pp1_before=0.0,pp1_after;
  double dram_before=0.0,dram_after;
  double thermal_spec_power,minimum_power,maximum_power,time_window;
  int cpu_model;
  

  double power_target = 500;
  printf("Starting set each package power to %fW\n",power_target);

    fd=open_msr(0);

  /* Calculate the units used */
  result=read_msr(fd,MSR_RAPL_POWER_UNIT);
  
  power_units=pow(0.5,(double)(result&0xf));
 // printf("Power units = %.3fW\n",power_units);
 // printf("\n");
  energy_units=pow(0.5,(double)((result>>8)&0x1f));
 // printf("Energy units = %.8fJ\n",energy_units);
 // printf("\n");
  time_units=pow(0.5,(double)((result>>16)&0xf));
 // printf("Time units = %.8fs, %.8fKs\n",time_units, time_units*1000.0);
 // printf("\n");
  set_power_limit(fd, power_target, power_units);

    fd=open_msr(8);

  /* Calculate the units used */
  result=read_msr(fd,MSR_RAPL_POWER_UNIT);
  
  power_units=pow(0.5,(double)(result&0xf));

  energy_units=pow(0.5,(double)((result>>8)&0x1f));

  time_units=pow(0.5,(double)((result>>16)&0xf));

  set_power_limit(fd, power_target, power_units);
 
 


return 1;

}
Beispiel #13
0
/* This function reads the VMX-specific MSRs
 * to determine whether EPT is supported.
 * See section 24.6.2 and Appenix A.3.3 of the Intel manual.
 * 
 * Hint: the TA solution uses the read_msr() helper function.
 * 
 * Hint: As specified in the appendix, the values in the tables
 *  are actually offset by 32 bits.
 *
 * Hint: This needs to check two MSR bits---first verifying
 *   that secondary VMX controls are enabled, and then that
 *   EPT is available.
 */
static inline bool vmx_check_ept() {
    uint64_t vmx_procbased_clts = read_msr(IA32_VMX_PROCBASED_CTLS);
    if(BIT(vmx_procbased_clts>>32,31))
       {
        //cprintf("return true in vmx_check_ept"); 
	uint64_t vmx_procbased_clts2 = read_msr(IA32_VMX_PROCBASED_CTLS2);
         if(BIT(vmx_procbased_clts2>>32,1)){
 
           return true;
	}
         else
	{ 
           return false;
	}
       }
Beispiel #14
0
static int hsw_ext_get_count(enum intel_hsw_ext_id id, unsigned long long *val,
			unsigned int cpu)
{
	int msr;

	switch (id) {
	case PC8:
		msr = MSR_PKG_C8_RESIDENCY;
		break;
	case PC9:
		msr = MSR_PKG_C9_RESIDENCY;
		break;
	case PC10:
		msr = MSR_PKG_C10_RESIDENCY;
		break;
	case TSC:
		msr = MSR_TSC;
		break;
	default:
		return -1;
	};
	if (read_msr(cpu, msr, val))
		return -1;
	return 0;
}
static int snb_get_count(enum intel_snb_id id, unsigned long long *val,
			unsigned int cpu)
{
	int msr;

	switch (id) {
	case C7:
		msr = MSR_CORE_C7_RESIDENCY;
		break;
	case PC2:
		msr = MSR_PKG_C2_RESIDENCY;
		break;
	case PC7:
		msr = MSR_PKG_C7_RESIDENCY;
		break;
	case TSC:
		msr = MSR_TSC;
		break;
	default:
		return -1;
	};
	if (read_msr(cpu, msr, val))
		return -1;
	return 0;
}
Beispiel #16
0
void dump_p6_MSRs (struct cpudata *cpu)
{
	unsigned long long val = 0;

	if (!user_is_root)
		return;

	printf("P6 family MSRs:\n");

	if (read_msr (cpu->number, 0x2a, &val) == 1) {
		printf("Low power mode is ");
		if ((val & (1<<26)) == 0)
			printf("dis");
		else
			printf("en");
		printf("abled\n");
	}

/*
	if (read_msr (cpu->number, 0x410, &val) == 1) {
	}
*/

	printf("\n");
}
Beispiel #17
0
static void perfmon_do_cores_status(void *opaque)
{
	struct perfmon_status_env *env = (struct perfmon_status_env *) opaque;
	struct perfmon_cpu_context *cctx = PERCPU_VARPTR(counters_env);
	int coreno = core_id();
	counter_t ccno = env->pa->cores_counters[coreno];

	spin_lock_irqsave(&cctx->lock);
	if (perfmon_is_fixed_event(&env->pa->ev))
		env->pef->cores_values[coreno] =
			read_msr(MSR_CORE_PERF_FIXED_CTR0 + ccno);
	else
		env->pef->cores_values[coreno] =
			read_msr(MSR_IA32_PERFCTR0 + ccno);
	spin_unlock_irqsave(&cctx->lock);
}
Beispiel #18
0
int cpufreq_has_boost_support(unsigned int cpu, int *support, int *active,
			int *states)
{
	struct cpupower_cpu_info cpu_info;
	int ret;
	unsigned long long val;

	*support = *active = *states = 0;

	ret = get_cpu_info(&cpu_info);
	if (ret)
		return ret;

	if (cpupower_cpu_info.caps & CPUPOWER_CAP_AMD_CBP) {
		*support = 1;

		/* AMD Family 0x17 does not utilize PCI D18F4 like prior
		 * families and has no fixed discrete boost states but
		 * has Hardware determined variable increments instead.
		 */

		if (cpu_info.family == 0x17 || cpu_info.family == 0x18) {
			if (!read_msr(cpu, MSR_AMD_HWCR, &val)) {
				if (!(val & CPUPOWER_AMD_CPBDIS))
					*active = 1;
			}
		} else {
			ret = amd_pci_get_num_boost_states(active, states);
			if (ret)
				return ret;
		}
	} else if (cpupower_cpu_info.caps & CPUPOWER_CAP_INTEL_IDA)
		*support = *active = 1;
	return 0;
}
Beispiel #19
0
int cthd_msr::set_clock_mod_duty_cycle_per_cpu(int cpu, int state) {
	unsigned long long val;
	int ret;

	// First bit is reserved
	state = state << 1;

	ret = read_msr(cpu, MSR_IA32_THERM_CONTROL, &val);
	if (ret < 0)
		return THD_ERROR;

	if (!state) {
		val &= ~MSR_IA32_CLK_MOD_ENABLE;
	} else {
		val |= MSR_IA32_CLK_MOD_ENABLE;
	}
	val &= ~MSR_IA32_CLK_MOD_DUTY_CYCLE_MASK;
	val |= (state & MSR_IA32_CLK_MOD_DUTY_CYCLE_MASK);

	ret = write_msr(cpu, MSR_IA32_THERM_CONTROL, val);
	if (ret < 0) {
		thd_log_warn("set_clock_mod_duty_cycle current set failed to write\n");
		return THD_ERROR;
	}

	return THD_SUCCESS;
}
Beispiel #20
0
int cthd_msr::disable_turbo() {
	int cpu_count = get_no_cpus();
	unsigned long long val;
	int ret;

	for (int i = 0; i < cpu_count; ++i) {
		/*
		 This method is recommended only for BIOS

		 ret = read_msr(i, MSR_IA32_MISC_ENABLE, &val);
		 if (ret < 0)
		 return THD_ERROR;
		 val |= MSR_IA32_MISC_ENABLE_TURBO_DISABLE;

		 ret = write_msr(i, MSR_IA32_MISC_ENABLE, val);
		 if (ret < 0)
		 return THD_ERROR;
		 */
		ret = read_msr(i, MSR_IA32_PERF_CTL, &val);
		if (ret < 0)
			return THD_ERROR;
		val |= TURBO_DISENGAGE_BIT;
		ret = write_msr(i, MSR_IA32_PERF_CTL, val);
		if (ret < 0)
			return THD_ERROR;
	}
	thd_log_info("Turbo disabled \n");

	return THD_SUCCESS;
}
Beispiel #21
0
Datei: apic.c Projekt: zid/zidOS
void apic(void)
{
	unsigned long apic_base;

	apic_base = read_msr(APIC_BASE_MSR);
	print("APIC base: %lx\n", apic_base);
}
Beispiel #22
0
void
get_raw_perf_status( int package, int domain, uint64_t *pstatus ){
	switch(domain){
#ifdef PKG_PERF_STATUS_AVAILABLE
		case PKG_DOMAIN: 	read_msr(package, MSR_PKG_PERF_STATUS, pstatus);
						break;
#endif
#ifdef ARCH_062D
		case DRAM_DOMAIN:	read_msr(package, MSR_DRAM_PERF_STATUS, pstatus);
						break;
#endif
		default:			assert(0);
						break;
	}

}
static int nhm_get_count(enum intel_nhm_id id, unsigned long long *val,
			unsigned int cpu)
{
	int msr;

	switch (id) {
	case C3:
		msr = MSR_CORE_C3_RESIDENCY;
		break;
	case C6:
		msr = MSR_CORE_C6_RESIDENCY;
		break;
	case PC3:
		msr = MSR_PKG_C3_RESIDENCY;
		break;
	case PC6:
		msr = MSR_PKG_C6_RESIDENCY;
		break;
	case TSC:
		msr = MSR_TSC;
		break;
	default:
		return -1;
	};
	if (read_msr(cpu, msr, val))
		return -1;

	return 0;
}
Beispiel #24
0
void
disable_turbo(int cpu){
	uint64_t val;
	read_msr( cpu, MSR_MISC_ENABLE, &val );
	// Set bit 38 to 1.
	val |= ((uint64_t)1) << 38;
	write_msr( cpu, MSR_MISC_ENABLE, val );
}
Beispiel #25
0
void
enable_turbo(int cpu){
	uint64_t val;
	read_msr( cpu, MSR_MISC_ENABLE, &val );
	// Set bit 38 to 0.
	val &= ((uint64_t)-1) ^ ((uint64_t)1) << 38;
	write_msr( cpu, MSR_MISC_ENABLE, val );
}
Beispiel #26
0
energy_counters_init_res energy_counters_init(energy_counters_state* state){
#if defined(__linux__)
  u_int64_t result;
  memset(state, 0, sizeof(energy_counters_state));
  state->cpu_model=detect_cpu();
  if(state->cpu_model<0){
    return UNSUPPORTED_CPU_TYPE;
  }

  FILE *f;
  int n=0;
  char command[512];
  f = popen("cat /proc/cpuinfo | grep 'physical id' | sort -u | wc -l", "r");
  if (!f || fscanf(f, "%d", &n) == EOF) { pclose(f); return NUMBER_OF_SOCKETS_NOT_FOUND;}
  pclose(f);
  state->num_sockets=n;
  state->sockets=(socket_state*)malloc(sizeof(socket_state)*state->num_sockets);
  memset(state->sockets, 0, sizeof(socket_state)*state->num_sockets);

  unsigned int i;
  for(i=0; i<state->num_sockets;i++){
    sprintf(command, "cat /proc/cpuinfo | egrep 'processor|physical id' | tr -d '\t' "
                     "| tr -d ' ' | paste -d'|' - - | grep 'physicalid:%d' "
                     "| cut -d '|' -f 1 | cut -d ':' -f 2 | head -1", i);
    f = popen(command,"r");
    if (!f || fscanf(f, "%d", &n) == EOF) { pclose(f); return PROCESSOR_PER_SOCKET_NOT_FOUND;}
    pclose(f);
    state->sockets[i].core=n;
    state->sockets[i].fd=open_msr(n);
    if(state->sockets[i].fd<0){
      return IMPOSSIBLE_TO_OPEN_MSR_FILE;
    }
    /* Calculate the units used */
    result=read_msr(state->sockets[i].fd,MSR_RAPL_POWER_UNIT);
    state->sockets[i].power_per_unit=pow(0.5,(double)(result&0xf));
    state->sockets[i].energy_per_unit=pow(0.5,(double)((result>>8)&0x1f));
    state->sockets[i].time_per_unit=pow(0.5,(double)((result>>16)&0xf));

    result=read_msr(state->sockets[i].fd,MSR_PKG_POWER_INFO);
    state->sockets[i].thermal_spec_power=state->sockets[i].power_per_unit*(double)(result&0x7fff);
  }
  return OK;
#else
  return OS_NOT_SUPPORTED;
#endif
}
Beispiel #27
0
static void perfmon_enable_event(int event, bool enable)
{
	uint64_t gctrl = read_msr(MSR_CORE_PERF_GLOBAL_CTRL);

	if (enable)
		write_msr(MSR_CORE_PERF_GLOBAL_CTRL, gctrl | (1 << event));
	else
		write_msr(MSR_CORE_PERF_GLOBAL_CTRL, gctrl & ~(1 << event));
}
Beispiel #28
0
void rapl_refresh(struct PowerState * pstate){
  uint64_t pkg_reg_init = pstate->pkg_reg_value;
  uint64_t pp0_reg_init = pstate->pp0_reg_value;
  uint64_t pkg_reg_curr = read_msr(MSR_PKG_ENERGY_STATUS, pstate->msr_fh);
  uint64_t pp0_reg_curr = read_msr(MSR_PP0_ENERGY_STATUS, pstate->msr_fh);
  if ( pkg_reg_init > pkg_reg_curr || pp0_reg_init > pp0_reg_curr) {
    fprintf(stderr, "Wrap around detected!\n"
                     "\tpkg_init:\t%ld\n"
                     "\tpkg_curr:\t%ld\n"
                     "\tpp0_init:\t%ld\n"
                     "\tpp0_curr:\t%ld\n", 
                     pkg_reg_init, pkg_reg_curr, pp0_reg_init, pp0_reg_curr);
  }
  pstate->pkg_reg_value = pkg_reg_curr;
  pstate->pp0_reg_value = pp0_reg_curr;
  pstate->pkg_pwr += (pkg_reg_curr - pkg_reg_init) * pstate->energy_units;
  pstate->pp0_pwr += (pp0_reg_curr - pp0_reg_init) * pstate->energy_units;
}
Beispiel #29
0
void perfmon_interrupt(struct hw_trapframe *hw_tf, void *data)
{
	int i;
	struct perfmon_cpu_context *cctx = PERCPU_VARPTR(counters_env);
	uint64_t gctrl, status;

	spin_lock_irqsave(&cctx->lock);
	/* We need to save the global control status, because we need to disable
	 * counters in order to be able to reset their values.
	 * We will restore the global control status on exit.
	 */
	status = read_msr(MSR_CORE_PERF_GLOBAL_STATUS);
	gctrl = read_msr(MSR_CORE_PERF_GLOBAL_CTRL);
	write_msr(MSR_CORE_PERF_GLOBAL_CTRL, 0);
	for (i = 0; i < (int) cpu_caps.counters_x_proc; i++) {
		if (status & ((uint64_t) 1 << i)) {
			if (cctx->counters[i].event) {
				profiler_add_hw_sample(
					hw_tf, perfmon_make_sample_event(cctx->counters + i));
				write_msr(MSR_IA32_PERFCTR0 + i,
						  -(int64_t) cctx->counters[i].trigger_count);
			}
		}
	}
	for (i = 0; i < (int) cpu_caps.fix_counters_x_proc; i++) {
		if (status & ((uint64_t) 1 << (32 + i))) {
			if (cctx->fixed_counters[i].event) {
				profiler_add_hw_sample(
					hw_tf, perfmon_make_sample_event(cctx->fixed_counters + i));
				write_msr(MSR_CORE_PERF_FIXED_CTR0 + i,
						  -(int64_t) cctx->fixed_counters[i].trigger_count);
			}
		}
	}
	write_msr(MSR_CORE_PERF_GLOBAL_OVF_CTRL, status);
	write_msr(MSR_CORE_PERF_GLOBAL_CTRL, gctrl);
	spin_unlock_irqsave(&cctx->lock);

	/* We need to re-arm the IRQ as the PFM IRQ gets masked on trigger.
	 * Note that KVM and real HW seems to be doing two different things WRT
	 * re-arming the IRQ. KVM re-arms does not mask the IRQ, while real HW does.
	 */
	perfmon_arm_irq();
}
Beispiel #30
0
void
dump_rapl(){
	int package;
	uint64_t val;

	for( package=0; package<NUM_PACKAGES; package++){
		read_msr( package, MSR_PKG_ENERGY_STATUS, &val );
		fprintf(stdout, "%20lu ", val);
	}
	fprintf(stdout, "MSR_PKG_ENERGY_STATUS\n");

	for( package=0; package<NUM_PACKAGES; package++){
		read_msr( package, MSR_PP0_ENERGY_STATUS, &val );
		fprintf(stdout, "%20lu ", val);
	}
	fprintf(stdout, "MSR_PP0_ENERGY_STATUS\n");
#ifdef ARCH_062D
	for( package=0; package<NUM_PACKAGES; package++){
		read_msr( package, MSR_DRAM_ENERGY_STATUS, &val );
		fprintf(stdout, "%20lu ", val);
	}
	fprintf(stdout, "MSR_DRAM_ENERGY_STATUS\n");
#endif
	for( package=0; package<NUM_PACKAGES; package++){
		read_msr( package, MSR_PKG_POWER_INFO, &val );
		fprintf(stdout, "0x%018lx ", val);
	}
	fprintf(stdout, "MSR_PKG_POWER_INFO\n");

	for( package=0; package<NUM_PACKAGES; package++){
		read_msr( package, MSR_PKG_POWER_INFO, &val );
		fprintf(stdout, "0x%018lx ", val);
	}
	fprintf(stdout, "MSR_DRAM_POWER_INFO\n");

	for( package=0; package<NUM_PACKAGES; package++){
		read_msr( package, MSR_PKG_POWER_LIMIT, &val );
		fprintf(stdout, "0x%018lx ", val);
	}
	fprintf(stdout, "MSR_PKG_POWER_LIMIT\n");

	for( package=0; package<NUM_PACKAGES; package++){
		read_msr( package, MSR_PP0_POWER_LIMIT, &val );
		fprintf(stdout, "0x%018lx ", val);
	}
	fprintf(stdout, "MSR_PP0_POWER_LIMIT\n");
#ifdef ARCH_062D
	for( package=0; package<NUM_PACKAGES; package++){
		read_msr( package, MSR_DRAM_POWER_LIMIT, &val );
		fprintf(stdout, "0x%018lx ", val);
	}
	fprintf(stdout, "MSR_DRAM_POWER_LIMIT\n");
#endif
}