9 #define WRITECOMBINING 1
10 #define WRITETHROUGH 4
11 #define WRITEPROTECT 5
14 bool mtrr_is_supported =
false;
15 bool mtrr_wc_available =
false;
16 bool mtrr_fixed_size_available =
false;
17 size_t variable_size_mtrrs = 0;
19 #define CALC_MASK(size) (~(size - 1) & 0xffffffff)
22 uint32_t unused, eax, edx;
24 cpuid(1, unused, unused, unused, edx);
26 qemu_log(
"%x", edx & (1 << 12));
29 mtrr_is_supported =
true;
34 rdmsr(0xFE, eax, unused);
36 variable_size_mtrrs = eax & 0xff;
37 mtrr_fixed_size_available = eax & (1 << 8) ?
true :
false;
38 mtrr_wc_available = eax & (1 << 10) ?
true :
false;
40 qemu_log(
"Variable size MTRRs count: %d", variable_size_mtrrs);
41 qemu_log(
"Fixed size available: %d", mtrr_fixed_size_available);
42 qemu_log(
"Writecombining available: %d", mtrr_wc_available);
44 for(
size_t i = 0; i < variable_size_mtrrs; i++) {
47 read_mtrr(i, &base, &mask);
49 qemu_log(
"[%d] MTRR: base: %x; mask: %x", i, base, mask);
54 tty_printf(
"Physical FB is: %x", getDisplayAddr());
56 for(
size_t i = 0; i < variable_size_mtrrs; i++) {
59 read_mtrr(i, &base, &mask);
61 qemu_log(
"[%d] MTRR: base: %x; mask: %x", i, base, mask);
62 tty_printf(
"[%d] MTRR: base: %x; mask: %x\n", i, base, mask);
66 uint32_t get_mtrr_index(uint32_t address) {
67 for(
size_t i = 0; i < variable_size_mtrrs; i++) {
70 read_mtrr(i, &base, &mask);
72 if((mask & (1 << 11)) && (base & ~0xfff) == ALIGN(address, 4096)) {
81 void read_mtrr(
size_t index, uint32_t* base, uint32_t* mask) {
84 if(index >= variable_size_mtrrs)
87 rdmsr(0x200 + (index * 2), *base, unused);
88 rdmsr(0x201 + (index * 2), *mask, unused);
91 void write_mtrr(
size_t index, uint32_t base, uint32_t mask) {
94 if(index >= variable_size_mtrrs)
97 wrmsr(0x200 + (index * 2), base, unused);
98 wrmsr(0x201 + (index * 2), mask, unused);
101 void write_mtrr_size(
size_t index, uint32_t base, uint32_t size,
size_t type) {
104 if(index >= variable_size_mtrrs)
107 wrmsr(0x200 + (index * 2), ALIGN(base, 4096) | type, unused);
108 wrmsr(0x201 + (index * 2), CALC_MASK(ALIGN(size, 4096)) | (1 << 11), unused);
111 size_t find_free_mtrr() {
112 for(
size_t i = 0; i < variable_size_mtrrs; i++) {
115 read_mtrr(i, &base, &mask);
117 if((mask & (1 << 11)) == 0) {
Основные определения ядра