4 * Licensed under the terms of the GNU GPL License version 2.
6 * MTRR register dumping.
7 * TODO : decode the registers too.
14 #define IA32_MTRRCAP_SMRR 0x800
15 #define IA32_MTRRCAP_WC 0x400
16 #define IA32_MTRRCAP_FIX 0x100
17 #define IA32_MTRRCAP_VCNT 0xFF
19 #define IA32_MTRR_DEFTYPE_E 0x800
20 #define IA32_MTRR_DEFTYPE_FE 0x400
21 #define IA32_MTRR_DEFTYPE_TYPE 0xFF
23 #define IA32_PHYBASE_TYPE 0XFF
24 #define IA32_PHYMASK_VALID 0X800
26 static unsigned int max_phy_addr = 0;
28 static char * mtrr_types[MTRR_NUM_TYPES] =
39 static void decode_address(unsigned long long val)
41 switch (max_phy_addr) {
43 printf("0x%07x ", (unsigned int) ((val >> 12) & 0xFFFFFFF));
47 printf("0x%06x ", (unsigned int) ((val >> 12) & 0xFFFFFF));
52 static void set_max_phy_addr(struct cpudata *cpu)
57 cpuid(cpu->number, 0x80000008,&value, NULL, NULL, NULL);
58 max_phy_addr = (value & 0xFF);
62 static int mtrr_value(int cpu, int msr, unsigned long long * val)
64 if (read_msr(cpu, msr, val) == 1)
70 static void dump_mtrr(int cpu, int msr)
72 unsigned long long val=0;
74 if (read_msr(cpu, msr, &val) == 1)
75 printf("0x%016llx\n", val);
78 static void decode_mtrrcap(int cpu, int msr)
80 unsigned long long val;
83 ret = mtrr_value(cpu,msr,&val);
85 printf("0x%016llx ", val);
86 printf("(smrr flag: 0x%01x, ",(unsigned int) (val & IA32_MTRRCAP_SMRR) >> 11 );
87 printf("wc flag: 0x%01x, ",(unsigned int) (val&IA32_MTRRCAP_WC) >> 10);
88 printf("fix flag: 0x%01x, ",(unsigned int) (val&IA32_MTRRCAP_FIX) >> 8);
89 printf("vcnt field: 0x%02x (%d))\n",(unsigned int) (val&IA32_MTRRCAP_VCNT) , (int) (val&IA32_MTRRCAP_VCNT));
93 static void decode_mtrr_deftype(int cpu, int msr)
95 unsigned long long val;
98 ret = mtrr_value(cpu,msr,&val);
100 printf("0x%016llx ", val);
101 printf("(fixed-range flag: 0x%01x, ",(unsigned int) (val&IA32_MTRR_DEFTYPE_FE) >> 10);
102 printf("mtrr flag: 0x%01x, ",(unsigned int) (val&IA32_MTRR_DEFTYPE_E) >> 11);
103 printf("type field: 0x%02x (%s))\n", (unsigned int) (val&IA32_MTRR_DEFTYPE_TYPE) >> 8,
104 mtrr_types[((val&IA32_MTRR_DEFTYPE_TYPE) >> 8)]);
108 static void decode_mtrr_physbase(int cpu, int msr)
110 unsigned long long val;
113 ret = mtrr_value(cpu,msr,&val);
115 printf("0x%016llx ", val);
117 printf("(physbase field:");
120 printf("type field: 0x%02x (%s))\n",(unsigned int) (val&IA32_PHYBASE_TYPE),
121 mtrr_types[((val&IA32_PHYBASE_TYPE))]);
125 static void decode_mtrr_physmask(int cpu, int msr)
127 unsigned long long val;
130 ret = mtrr_value(cpu,msr,&val);
132 printf("0x%016llx ", val);
134 printf("(physmask field:");
137 printf("valid flag: %d)\n",(int) (val&IA32_PHYMASK_VALID)>>11);
142 void dump_mtrrs(struct cpudata *cpu)
144 unsigned long long val = 0;
147 if (!(cpu->flags_edx & (X86_FEATURE_MTRR)))
151 * If MTRR registers are not accessible like in some
152 * virtualization systems then return
154 if (!read_msr(cpu->number, 0xfe, &val))
157 printf("MTRR registers:\n");
159 printf("MTRRcap (0xfe): ");
160 decode_mtrrcap(cpu->number, 0xfe);
162 set_max_phy_addr(cpu);
164 for (i = 0; i < 16; i+=2) {
165 printf("MTRRphysBase%u (0x%x): ", i/2, (unsigned int) 0x200+i);
166 decode_mtrr_physbase(cpu->number, 0x200+i);
167 printf("MTRRphysMask%u (0x%x): ", i/2, (unsigned int) 0x201+i);
168 decode_mtrr_physmask(cpu->number, 0x201+i);
171 printf("MTRRfix64K_00000 (0x250): ");
172 dump_mtrr (cpu->number, 0x250);
173 printf("MTRRfix16K_80000 (0x258): ");
174 dump_mtrr (cpu->number, 0x258);
175 printf("MTRRfix16K_A0000 (0x259): ");
176 dump_mtrr (cpu->number, 0x259);
178 printf("MTRRfix4K_C8000 (0x269): ");
179 dump_mtrr (cpu->number, 0x269);
180 printf("MTRRfix4K_D0000 0x26a: ");
181 dump_mtrr (cpu->number, 0x26a);
182 printf("MTRRfix4K_D8000 0x26b: ");
183 dump_mtrr (cpu->number, 0x26b);
184 printf("MTRRfix4K_E0000 0x26c: ");
185 dump_mtrr (cpu->number, 0x26c);
186 printf("MTRRfix4K_E8000 0x26d: ");
187 dump_mtrr (cpu->number, 0x26d);
188 printf("MTRRfix4K_F0000 0x26e: ");
189 dump_mtrr (cpu->number, 0x26e);
190 printf("MTRRfix4K_F8000 0x26f: ");
191 dump_mtrr (cpu->number, 0x26f);
193 printf("MTRRdefType (0x2ff): ");
194 decode_mtrr_deftype(cpu->number, 0x2ff);