1
2 #include "ht_utils.h"
3
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include <alloca.h>
7 #include <string.h>
8 #include <linux/unistd.h>
9 #include "ltp_cpuid.h"
10
11 #define PROC_PATH "/proc"
12 #define BUFF_SIZE 8192
13 #define PROCESSOR_STR "processor"
14
15 #define MAX_CPU_NUM 128
16
17 char buffer[BUFF_SIZE];
18
is_ht_cpu(void)19 int is_ht_cpu(void)
20 {
21 /*Number of logic processor in a physical processor */
22 int smp_num_siblings = -1;
23 /*ht flag */
24 int ht = -1;
25 unsigned int eax, ebx, ecx, edx;
26 cpuid(1, &eax, &ebx, &ecx, &edx);
27 smp_num_siblings = (ebx & 0xff0000) >> 16;
28 ht = (edx & 0x10000000) >> 28;
29
30 if (ht == 1 && smp_num_siblings >= 2) {
31 /*printf("The processor in this system supports HT\n"); */
32 return 1;
33 } else {
34 /*printf("The processor in this system does not support
35 * HT\n");*/
36 return 0;
37 }
38 }
39
40 /* return 0 means Pass,
41 return 1 means ht is not enabled,*/
check_ht_capability(void)42 int check_ht_capability(void)
43 {
44 int result;
45 if (is_ht_cpu())
46 result = 0; /*HT is enabled by default in this system. */
47 else
48 result = 1; /*HT is not enabled by default in this system. */
49
50 return result;
51 }
52
53 #define PROCFS_PATH "/proc/"
54 #define CPUINFO_PATH "/proc/cpuinfo"
55 #define CPU_NAME "processor"
56 #define STAT_NAME "stat"
57
58 char buf[256];
59
get_cpu_count(void)60 int get_cpu_count(void)
61 {
62 FILE *pfile;
63 int count;
64
65 pfile = fopen(CPUINFO_PATH, "r");
66 if (pfile == NULL)
67 return 0;
68
69 count = 0;
70
71 while (fgets(buf, 255, pfile) != NULL) {
72 if (strncmp(buf, CPU_NAME, strlen(CPU_NAME)) == 0)
73 count++;
74 }
75
76 fclose(pfile);
77
78 return count;
79 }
80
get_current_cpu(pid_t pid)81 int get_current_cpu(pid_t pid)
82 {
83 int cpu = -1;
84 int da;
85 char str[100];
86 char ch;
87
88 FILE *pfile;
89
90 sprintf(buf, "%s%d/%s%c", PROCFS_PATH, pid, STAT_NAME, 0);
91
92 pfile = fopen(buf, "r");
93 if (pfile == NULL)
94 return -1;
95
96 if (fscanf(pfile, "%d %s %c %d %d %d %d %d %d %d %d %d %d %d %d %d %d\
97 %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d", &da, str, &ch, &da, &da, &da, &da, &da, &da, &da, &da, &da, &da, &da, &da, &da, &da, &da, &da, &da, &da, &da, &da, &da, &da, &da, &da, &da, &da, &da, &da, &da, &da, &da, &da, &da, &da, &da, &cpu) <= 0) {
98 fclose(pfile);
99 return -1;
100 }
101
102 fclose(pfile);
103
104 return cpu;
105 }
106