Beispiel #1
0
INTVAL
Parrot_get_num_cpus(SHIM_INTERP) {
    INTVAL nprocs = -1;

#ifdef _SC_NPROCESSORS_ONLN
    nprocs = sysconf(_SC_NPROCESSORS_ONLN);
#elif defined(PARROT_HAS_HEADER_LIBCPUID)
    struct cpu_raw_data_t raw;
    struct cpu_id_t data;

    if (!cpuid_present()) {
        printf("cpuid_present failed\n");
        exit(EXIT_FAILURE);
    }
    if (cpuid_get_raw_data(&raw) < 0) {
        printf("cpuid_get_raw_data failed\n");
        printf("Error: %s\n", cpuid_error());
        exit(EXIT_FAILURE);
    }
    if (cpu_identify(&raw, &data) < 0) {
        printf("cpu_identify failed\n");
        printf("Error: %s\n", cpuid_error());
        exit(EXIT_FAILURE);
    }
    nprocs = data.num_cores;
#else
    FILE *f;
    char line[128];

    if (!fopen("/proc/cpuinfo", "rb"))
        return nprocs;

    while (!feof(f)) {
        fgets(line, 128, f);
        if (strlen(line) == 1) continue;
        if (strncmp(line, "cpu cores", 8) == 0) {
            sscanf(line, "cpu cores\t: %d", &nprocs);
            fclose(f);
            return nprocs;
        }
    }
    fclose(f);
#endif
    return nprocs;
}
Beispiel #2
0
static void print_info(output_data_switch query, struct cpu_raw_data_t* raw,
                       struct cpu_id_t* data)
{
	int i, value;
	struct msr_driver_t* handle;
	switch (query) {
		case NEED_CPUID_PRESENT:
			fprintf(fout, "%d\n", cpuid_present());
			break;
		case NEED_VENDOR_STR:
			fprintf(fout, "%s\n", data->vendor_str);
			break;
		case NEED_VENDOR_ID:
			fprintf(fout, "%d\n", data->vendor);
			break;
		case NEED_BRAND_STRING:
			fprintf(fout, "%s\n", data->brand_str);
			break;
		case NEED_FAMILY:
			fprintf(fout, "%d\n", data->family);
			break;
		case NEED_MODEL:
			fprintf(fout, "%d\n", data->model);
			break;
		case NEED_STEPPING:
			fprintf(fout, "%d\n", data->stepping);
			break;
		case NEED_EXT_FAMILY:
			fprintf(fout, "%d\n", data->ext_family);
			break;
		case NEED_EXT_MODEL:
			fprintf(fout, "%d\n", data->ext_model);
			break;
		case NEED_NUM_CORES:
			fprintf(fout, "%d\n", data->num_cores);
			break;
		case NEED_NUM_LOGICAL:
			fprintf(fout, "%d\n", data->num_logical_cpus);
			break;
		case NEED_TOTAL_CPUS:
			fprintf(fout, "%d\n", cpuid_get_total_cpus());
			break;
		case NEED_L1D_SIZE:
			fprintf(fout, "%d\n", data->l1_data_cache);
			break;
		case NEED_L1I_SIZE:
			fprintf(fout, "%d\n", data->l1_instruction_cache);
			break;
		case NEED_L2_SIZE:
			fprintf(fout, "%d\n", data->l2_cache);
			break;
		case NEED_L3_SIZE:
			fprintf(fout, "%d\n", data->l3_cache);
			break;
		case NEED_L4_SIZE:
			fprintf(fout, "%d\n", data->l4_cache);
			break;
		case NEED_L1D_ASSOC:
			fprintf(fout, "%d\n", data->l1_assoc);
			break;
		case NEED_L2_ASSOC:
			fprintf(fout, "%d\n", data->l2_assoc);
			break;
		case NEED_L3_ASSOC:
			fprintf(fout, "%d\n", data->l3_assoc);
			break;
		case NEED_L4_ASSOC:
			fprintf(fout, "%d\n", data->l4_assoc);
			break;
		case NEED_L1D_CACHELINE:
			fprintf(fout, "%d\n", data->l1_cacheline);
			break;
		case NEED_L2_CACHELINE:
			fprintf(fout, "%d\n", data->l2_cacheline);
			break;
		case NEED_L3_CACHELINE:
			fprintf(fout, "%d\n", data->l3_cacheline);
			break;
		case NEED_L4_CACHELINE:
			fprintf(fout, "%d\n", data->l4_cacheline);
			break;
		case NEED_CODENAME:
			fprintf(fout, "%s\n", data->cpu_codename);
			break;
		case NEED_FEATURES:
		{
			for (i = 0; i < NUM_CPU_FEATURES; i++)
				if (data->flags[i])
					fprintf(fout, " %s", cpu_feature_str(i));
			fprintf(fout, "\n");
			break;
		}
		case NEED_CLOCK:
			fprintf(fout, "%d\n", cpu_clock());
			break;
		case NEED_CLOCK_OS:
			fprintf(fout, "%d\n", cpu_clock_by_os());
			break;
		case NEED_CLOCK_RDTSC:
			fprintf(fout, "%d\n", cpu_clock_measure(400, 1));
			break;
		case NEED_CLOCK_IC:
			fprintf(fout, "%d\n", cpu_clock_by_ic(25, 16));
			break;
		case NEED_RDMSR:
		{
			if ((handle = cpu_msr_driver_open()) == NULL) {
				fprintf(fout, "Cannot open MSR driver: %s\n", cpuid_error());
			} else {
				if ((value = cpu_msrinfo(handle, INFO_MPERF)) != CPU_INVALID_VALUE)
					fprintf(fout, "  MSR.mperf  : %d MHz\n", value);
				if ((value = cpu_msrinfo(handle, INFO_APERF)) != CPU_INVALID_VALUE)
					fprintf(fout, "  MSR.aperf  : %d MHz\n", value);
				if ((value = cpu_msrinfo(handle, INFO_CUR_MULTIPLIER)) != CPU_INVALID_VALUE)
					fprintf(fout, "  cur. multi.: %d MHz\n", value);
				if ((value = cpu_msrinfo(handle, INFO_MAX_MULTIPLIER)) != CPU_INVALID_VALUE)
					fprintf(fout, "  max. multi.: %d MHz\n", value);
				if ((value = cpu_msrinfo(handle, INFO_TEMPERATURE)) != CPU_INVALID_VALUE)
					fprintf(fout, "  temperature: %d degrees Celsius\n", value);
				if ((value = cpu_msrinfo(handle, INFO_THROTTLING)) != CPU_INVALID_VALUE)
					fprintf(fout, "  throttling : %s\n", value ? "yes" : "no");
				if ((value = cpu_msrinfo(handle, INFO_VOLTAGE)) != CPU_INVALID_VALUE)
					fprintf(fout, "  core volt. : %.2lf Volts\n", value / 100.0);
				if ((value = cpu_msrinfo(handle, INFO_BCLK)) != CPU_INVALID_VALUE)
					fprintf(fout, "  base clock : %.2lf MHz\n", value / 100.0);
				cpu_msr_driver_close(handle);
			}
			break;
		}
		case NEED_SSE_UNIT_SIZE:
		{
			fprintf(fout, "%d (%s)\n", data->sse_size, 
				data->detection_hints[CPU_HINT_SSE_SIZE_AUTH] ? "authoritative" : "non-authoritative");
			break;
		}
		default:
			fprintf(fout, "How did you get here?!?\n");
			break;
	}
}