xref: /openbmc/linux/arch/x86/kvm/mtrr.c (revision f4356947)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * vMTRR implementation
4  *
5  * Copyright (C) 2006 Qumranet, Inc.
6  * Copyright 2010 Red Hat, Inc. and/or its affiliates.
7  * Copyright(C) 2015 Intel Corporation.
8  *
9  * Authors:
10  *   Yaniv Kamay  <yaniv@qumranet.com>
11  *   Avi Kivity   <avi@qumranet.com>
12  *   Marcelo Tosatti <mtosatti@redhat.com>
13  *   Paolo Bonzini <pbonzini@redhat.com>
14  *   Xiao Guangrong <guangrong.xiao@linux.intel.com>
15  */
16 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
17 
18 #include <linux/kvm_host.h>
19 #include <asm/mtrr.h>
20 
21 #include "cpuid.h"
22 #include "mmu.h"
23 
24 #define IA32_MTRR_DEF_TYPE_E		(1ULL << 11)
25 #define IA32_MTRR_DEF_TYPE_FE		(1ULL << 10)
26 #define IA32_MTRR_DEF_TYPE_TYPE_MASK	(0xff)
27 
28 static bool msr_mtrr_valid(unsigned msr)
29 {
30 	switch (msr) {
31 	case 0x200 ... 0x200 + 2 * KVM_NR_VAR_MTRR - 1:
32 	case MSR_MTRRfix64K_00000:
33 	case MSR_MTRRfix16K_80000:
34 	case MSR_MTRRfix16K_A0000:
35 	case MSR_MTRRfix4K_C0000:
36 	case MSR_MTRRfix4K_C8000:
37 	case MSR_MTRRfix4K_D0000:
38 	case MSR_MTRRfix4K_D8000:
39 	case MSR_MTRRfix4K_E0000:
40 	case MSR_MTRRfix4K_E8000:
41 	case MSR_MTRRfix4K_F0000:
42 	case MSR_MTRRfix4K_F8000:
43 	case MSR_MTRRdefType:
44 	case MSR_IA32_CR_PAT:
45 		return true;
46 	}
47 	return false;
48 }
49 
50 static bool valid_mtrr_type(unsigned t)
51 {
52 	return t < 8 && (1 << t) & 0x73; /* 0, 1, 4, 5, 6 */
53 }
54 
55 bool kvm_mtrr_valid(struct kvm_vcpu *vcpu, u32 msr, u64 data)
56 {
57 	int i;
58 	u64 mask;
59 
60 	if (!msr_mtrr_valid(msr))
61 		return false;
62 
63 	if (msr == MSR_IA32_CR_PAT) {
64 		return kvm_pat_valid(data);
65 	} else if (msr == MSR_MTRRdefType) {
66 		if (data & ~0xcff)
67 			return false;
68 		return valid_mtrr_type(data & 0xff);
69 	} else if (msr >= MSR_MTRRfix64K_00000 && msr <= MSR_MTRRfix4K_F8000) {
70 		for (i = 0; i < 8 ; i++)
71 			if (!valid_mtrr_type((data >> (i * 8)) & 0xff))
72 				return false;
73 		return true;
74 	}
75 
76 	/* variable MTRRs */
77 	WARN_ON(!(msr >= 0x200 && msr < 0x200 + 2 * KVM_NR_VAR_MTRR));
78 
79 	mask = kvm_vcpu_reserved_gpa_bits_raw(vcpu);
80 	if ((msr & 1) == 0) {
81 		/* MTRR base */
82 		if (!valid_mtrr_type(data & 0xff))
83 			return false;
84 		mask |= 0xf00;
85 	} else
86 		/* MTRR mask */
87 		mask |= 0x7ff;
88 
89 	return (data & mask) == 0;
90 }
91 EXPORT_SYMBOL_GPL(kvm_mtrr_valid);
92 
93 static bool mtrr_is_enabled(struct kvm_mtrr *mtrr_state)
94 {
95 	return !!(mtrr_state->deftype & IA32_MTRR_DEF_TYPE_E);
96 }
97 
98 static bool fixed_mtrr_is_enabled(struct kvm_mtrr *mtrr_state)
99 {
100 	return !!(mtrr_state->deftype & IA32_MTRR_DEF_TYPE_FE);
101 }
102 
103 static u8 mtrr_default_type(struct kvm_mtrr *mtrr_state)
104 {
105 	return mtrr_state->deftype & IA32_MTRR_DEF_TYPE_TYPE_MASK;
106 }
107 
108 static u8 mtrr_disabled_type(struct kvm_vcpu *vcpu)
109 {
110 	/*
111 	 * Intel SDM 11.11.2.2: all MTRRs are disabled when
112 	 * IA32_MTRR_DEF_TYPE.E bit is cleared, and the UC
113 	 * memory type is applied to all of physical memory.
114 	 *
115 	 * However, virtual machines can be run with CPUID such that
116 	 * there are no MTRRs.  In that case, the firmware will never
117 	 * enable MTRRs and it is obviously undesirable to run the
118 	 * guest entirely with UC memory and we use WB.
119 	 */
120 	if (guest_cpuid_has(vcpu, X86_FEATURE_MTRR))
121 		return MTRR_TYPE_UNCACHABLE;
122 	else
123 		return MTRR_TYPE_WRBACK;
124 }
125 
126 /*
127 * Three terms are used in the following code:
128 * - segment, it indicates the address segments covered by fixed MTRRs.
129 * - unit, it corresponds to the MSR entry in the segment.
130 * - range, a range is covered in one memory cache type.
131 */
132 struct fixed_mtrr_segment {
133 	u64 start;
134 	u64 end;
135 
136 	int range_shift;
137 
138 	/* the start position in kvm_mtrr.fixed_ranges[]. */
139 	int range_start;
140 };
141 
142 static struct fixed_mtrr_segment fixed_seg_table[] = {
143 	/* MSR_MTRRfix64K_00000, 1 unit. 64K fixed mtrr. */
144 	{
145 		.start = 0x0,
146 		.end = 0x80000,
147 		.range_shift = 16, /* 64K */
148 		.range_start = 0,
149 	},
150 
151 	/*
152 	 * MSR_MTRRfix16K_80000 ... MSR_MTRRfix16K_A0000, 2 units,
153 	 * 16K fixed mtrr.
154 	 */
155 	{
156 		.start = 0x80000,
157 		.end = 0xc0000,
158 		.range_shift = 14, /* 16K */
159 		.range_start = 8,
160 	},
161 
162 	/*
163 	 * MSR_MTRRfix4K_C0000 ... MSR_MTRRfix4K_F8000, 8 units,
164 	 * 4K fixed mtrr.
165 	 */
166 	{
167 		.start = 0xc0000,
168 		.end = 0x100000,
169 		.range_shift = 12, /* 12K */
170 		.range_start = 24,
171 	}
172 };
173 
174 /*
175  * The size of unit is covered in one MSR, one MSR entry contains
176  * 8 ranges so that unit size is always 8 * 2^range_shift.
177  */
178 static u64 fixed_mtrr_seg_unit_size(int seg)
179 {
180 	return 8 << fixed_seg_table[seg].range_shift;
181 }
182 
183 static bool fixed_msr_to_seg_unit(u32 msr, int *seg, int *unit)
184 {
185 	switch (msr) {
186 	case MSR_MTRRfix64K_00000:
187 		*seg = 0;
188 		*unit = 0;
189 		break;
190 	case MSR_MTRRfix16K_80000 ... MSR_MTRRfix16K_A0000:
191 		*seg = 1;
192 		*unit = array_index_nospec(
193 			msr - MSR_MTRRfix16K_80000,
194 			MSR_MTRRfix16K_A0000 - MSR_MTRRfix16K_80000 + 1);
195 		break;
196 	case MSR_MTRRfix4K_C0000 ... MSR_MTRRfix4K_F8000:
197 		*seg = 2;
198 		*unit = array_index_nospec(
199 			msr - MSR_MTRRfix4K_C0000,
200 			MSR_MTRRfix4K_F8000 - MSR_MTRRfix4K_C0000 + 1);
201 		break;
202 	default:
203 		return false;
204 	}
205 
206 	return true;
207 }
208 
209 static void fixed_mtrr_seg_unit_range(int seg, int unit, u64 *start, u64 *end)
210 {
211 	struct fixed_mtrr_segment *mtrr_seg = &fixed_seg_table[seg];
212 	u64 unit_size = fixed_mtrr_seg_unit_size(seg);
213 
214 	*start = mtrr_seg->start + unit * unit_size;
215 	*end = *start + unit_size;
216 	WARN_ON(*end > mtrr_seg->end);
217 }
218 
219 static int fixed_mtrr_seg_unit_range_index(int seg, int unit)
220 {
221 	struct fixed_mtrr_segment *mtrr_seg = &fixed_seg_table[seg];
222 
223 	WARN_ON(mtrr_seg->start + unit * fixed_mtrr_seg_unit_size(seg)
224 		> mtrr_seg->end);
225 
226 	/* each unit has 8 ranges. */
227 	return mtrr_seg->range_start + 8 * unit;
228 }
229 
230 static int fixed_mtrr_seg_end_range_index(int seg)
231 {
232 	struct fixed_mtrr_segment *mtrr_seg = &fixed_seg_table[seg];
233 	int n;
234 
235 	n = (mtrr_seg->end - mtrr_seg->start) >> mtrr_seg->range_shift;
236 	return mtrr_seg->range_start + n - 1;
237 }
238 
239 static bool fixed_msr_to_range(u32 msr, u64 *start, u64 *end)
240 {
241 	int seg, unit;
242 
243 	if (!fixed_msr_to_seg_unit(msr, &seg, &unit))
244 		return false;
245 
246 	fixed_mtrr_seg_unit_range(seg, unit, start, end);
247 	return true;
248 }
249 
250 static int fixed_msr_to_range_index(u32 msr)
251 {
252 	int seg, unit;
253 
254 	if (!fixed_msr_to_seg_unit(msr, &seg, &unit))
255 		return -1;
256 
257 	return fixed_mtrr_seg_unit_range_index(seg, unit);
258 }
259 
260 static int fixed_mtrr_addr_to_seg(u64 addr)
261 {
262 	struct fixed_mtrr_segment *mtrr_seg;
263 	int seg, seg_num = ARRAY_SIZE(fixed_seg_table);
264 
265 	for (seg = 0; seg < seg_num; seg++) {
266 		mtrr_seg = &fixed_seg_table[seg];
267 		if (mtrr_seg->start <= addr && addr < mtrr_seg->end)
268 			return seg;
269 	}
270 
271 	return -1;
272 }
273 
274 static int fixed_mtrr_addr_seg_to_range_index(u64 addr, int seg)
275 {
276 	struct fixed_mtrr_segment *mtrr_seg;
277 	int index;
278 
279 	mtrr_seg = &fixed_seg_table[seg];
280 	index = mtrr_seg->range_start;
281 	index += (addr - mtrr_seg->start) >> mtrr_seg->range_shift;
282 	return index;
283 }
284 
285 static u64 fixed_mtrr_range_end_addr(int seg, int index)
286 {
287 	struct fixed_mtrr_segment *mtrr_seg = &fixed_seg_table[seg];
288 	int pos = index - mtrr_seg->range_start;
289 
290 	return mtrr_seg->start + ((pos + 1) << mtrr_seg->range_shift);
291 }
292 
293 static void var_mtrr_range(struct kvm_mtrr_range *range, u64 *start, u64 *end)
294 {
295 	u64 mask;
296 
297 	*start = range->base & PAGE_MASK;
298 
299 	mask = range->mask & PAGE_MASK;
300 
301 	/* This cannot overflow because writing to the reserved bits of
302 	 * variable MTRRs causes a #GP.
303 	 */
304 	*end = (*start | ~mask) + 1;
305 }
306 
307 static void update_mtrr(struct kvm_vcpu *vcpu, u32 msr)
308 {
309 	struct kvm_mtrr *mtrr_state = &vcpu->arch.mtrr_state;
310 	gfn_t start, end;
311 	int index;
312 
313 	if (msr == MSR_IA32_CR_PAT || !tdp_enabled ||
314 	      !kvm_arch_has_noncoherent_dma(vcpu->kvm))
315 		return;
316 
317 	if (!mtrr_is_enabled(mtrr_state) && msr != MSR_MTRRdefType)
318 		return;
319 
320 	/* fixed MTRRs. */
321 	if (fixed_msr_to_range(msr, &start, &end)) {
322 		if (!fixed_mtrr_is_enabled(mtrr_state))
323 			return;
324 	} else if (msr == MSR_MTRRdefType) {
325 		start = 0x0;
326 		end = ~0ULL;
327 	} else {
328 		/* variable range MTRRs. */
329 		index = (msr - 0x200) / 2;
330 		var_mtrr_range(&mtrr_state->var_ranges[index], &start, &end);
331 	}
332 
333 	kvm_zap_gfn_range(vcpu->kvm, gpa_to_gfn(start), gpa_to_gfn(end));
334 }
335 
336 static bool var_mtrr_range_is_valid(struct kvm_mtrr_range *range)
337 {
338 	return (range->mask & (1 << 11)) != 0;
339 }
340 
341 static void set_var_mtrr_msr(struct kvm_vcpu *vcpu, u32 msr, u64 data)
342 {
343 	struct kvm_mtrr *mtrr_state = &vcpu->arch.mtrr_state;
344 	struct kvm_mtrr_range *tmp, *cur;
345 	int index, is_mtrr_mask;
346 
347 	index = (msr - 0x200) / 2;
348 	is_mtrr_mask = msr - 0x200 - 2 * index;
349 	cur = &mtrr_state->var_ranges[index];
350 
351 	/* remove the entry if it's in the list. */
352 	if (var_mtrr_range_is_valid(cur))
353 		list_del(&mtrr_state->var_ranges[index].node);
354 
355 	/*
356 	 * Set all illegal GPA bits in the mask, since those bits must
357 	 * implicitly be 0.  The bits are then cleared when reading them.
358 	 */
359 	if (!is_mtrr_mask)
360 		cur->base = data;
361 	else
362 		cur->mask = data | kvm_vcpu_reserved_gpa_bits_raw(vcpu);
363 
364 	/* add it to the list if it's enabled. */
365 	if (var_mtrr_range_is_valid(cur)) {
366 		list_for_each_entry(tmp, &mtrr_state->head, node)
367 			if (cur->base >= tmp->base)
368 				break;
369 		list_add_tail(&cur->node, &tmp->node);
370 	}
371 }
372 
373 int kvm_mtrr_set_msr(struct kvm_vcpu *vcpu, u32 msr, u64 data)
374 {
375 	int index;
376 
377 	if (!kvm_mtrr_valid(vcpu, msr, data))
378 		return 1;
379 
380 	index = fixed_msr_to_range_index(msr);
381 	if (index >= 0)
382 		*(u64 *)&vcpu->arch.mtrr_state.fixed_ranges[index] = data;
383 	else if (msr == MSR_MTRRdefType)
384 		vcpu->arch.mtrr_state.deftype = data;
385 	else if (msr == MSR_IA32_CR_PAT)
386 		vcpu->arch.pat = data;
387 	else
388 		set_var_mtrr_msr(vcpu, msr, data);
389 
390 	update_mtrr(vcpu, msr);
391 	return 0;
392 }
393 
394 int kvm_mtrr_get_msr(struct kvm_vcpu *vcpu, u32 msr, u64 *pdata)
395 {
396 	int index;
397 
398 	/* MSR_MTRRcap is a readonly MSR. */
399 	if (msr == MSR_MTRRcap) {
400 		/*
401 		 * SMRR = 0
402 		 * WC = 1
403 		 * FIX = 1
404 		 * VCNT = KVM_NR_VAR_MTRR
405 		 */
406 		*pdata = 0x500 | KVM_NR_VAR_MTRR;
407 		return 0;
408 	}
409 
410 	if (!msr_mtrr_valid(msr))
411 		return 1;
412 
413 	index = fixed_msr_to_range_index(msr);
414 	if (index >= 0)
415 		*pdata = *(u64 *)&vcpu->arch.mtrr_state.fixed_ranges[index];
416 	else if (msr == MSR_MTRRdefType)
417 		*pdata = vcpu->arch.mtrr_state.deftype;
418 	else if (msr == MSR_IA32_CR_PAT)
419 		*pdata = vcpu->arch.pat;
420 	else {	/* Variable MTRRs */
421 		int is_mtrr_mask;
422 
423 		index = (msr - 0x200) / 2;
424 		is_mtrr_mask = msr - 0x200 - 2 * index;
425 		if (!is_mtrr_mask)
426 			*pdata = vcpu->arch.mtrr_state.var_ranges[index].base;
427 		else
428 			*pdata = vcpu->arch.mtrr_state.var_ranges[index].mask;
429 
430 		*pdata &= ~kvm_vcpu_reserved_gpa_bits_raw(vcpu);
431 	}
432 
433 	return 0;
434 }
435 
436 void kvm_vcpu_mtrr_init(struct kvm_vcpu *vcpu)
437 {
438 	INIT_LIST_HEAD(&vcpu->arch.mtrr_state.head);
439 }
440 
441 struct mtrr_iter {
442 	/* input fields. */
443 	struct kvm_mtrr *mtrr_state;
444 	u64 start;
445 	u64 end;
446 
447 	/* output fields. */
448 	int mem_type;
449 	/* mtrr is completely disabled? */
450 	bool mtrr_disabled;
451 	/* [start, end) is not fully covered in MTRRs? */
452 	bool partial_map;
453 
454 	/* private fields. */
455 	union {
456 		/* used for fixed MTRRs. */
457 		struct {
458 			int index;
459 			int seg;
460 		};
461 
462 		/* used for var MTRRs. */
463 		struct {
464 			struct kvm_mtrr_range *range;
465 			/* max address has been covered in var MTRRs. */
466 			u64 start_max;
467 		};
468 	};
469 
470 	bool fixed;
471 };
472 
473 static bool mtrr_lookup_fixed_start(struct mtrr_iter *iter)
474 {
475 	int seg, index;
476 
477 	if (!fixed_mtrr_is_enabled(iter->mtrr_state))
478 		return false;
479 
480 	seg = fixed_mtrr_addr_to_seg(iter->start);
481 	if (seg < 0)
482 		return false;
483 
484 	iter->fixed = true;
485 	index = fixed_mtrr_addr_seg_to_range_index(iter->start, seg);
486 	iter->index = index;
487 	iter->seg = seg;
488 	return true;
489 }
490 
491 static bool match_var_range(struct mtrr_iter *iter,
492 			    struct kvm_mtrr_range *range)
493 {
494 	u64 start, end;
495 
496 	var_mtrr_range(range, &start, &end);
497 	if (!(start >= iter->end || end <= iter->start)) {
498 		iter->range = range;
499 
500 		/*
501 		 * the function is called when we do kvm_mtrr.head walking.
502 		 * Range has the minimum base address which interleaves
503 		 * [looker->start_max, looker->end).
504 		 */
505 		iter->partial_map |= iter->start_max < start;
506 
507 		/* update the max address has been covered. */
508 		iter->start_max = max(iter->start_max, end);
509 		return true;
510 	}
511 
512 	return false;
513 }
514 
515 static void __mtrr_lookup_var_next(struct mtrr_iter *iter)
516 {
517 	struct kvm_mtrr *mtrr_state = iter->mtrr_state;
518 
519 	list_for_each_entry_continue(iter->range, &mtrr_state->head, node)
520 		if (match_var_range(iter, iter->range))
521 			return;
522 
523 	iter->range = NULL;
524 	iter->partial_map |= iter->start_max < iter->end;
525 }
526 
527 static void mtrr_lookup_var_start(struct mtrr_iter *iter)
528 {
529 	struct kvm_mtrr *mtrr_state = iter->mtrr_state;
530 
531 	iter->fixed = false;
532 	iter->start_max = iter->start;
533 	iter->range = NULL;
534 	iter->range = list_prepare_entry(iter->range, &mtrr_state->head, node);
535 
536 	__mtrr_lookup_var_next(iter);
537 }
538 
539 static void mtrr_lookup_fixed_next(struct mtrr_iter *iter)
540 {
541 	/* terminate the lookup. */
542 	if (fixed_mtrr_range_end_addr(iter->seg, iter->index) >= iter->end) {
543 		iter->fixed = false;
544 		iter->range = NULL;
545 		return;
546 	}
547 
548 	iter->index++;
549 
550 	/* have looked up for all fixed MTRRs. */
551 	if (iter->index >= ARRAY_SIZE(iter->mtrr_state->fixed_ranges))
552 		return mtrr_lookup_var_start(iter);
553 
554 	/* switch to next segment. */
555 	if (iter->index > fixed_mtrr_seg_end_range_index(iter->seg))
556 		iter->seg++;
557 }
558 
559 static void mtrr_lookup_var_next(struct mtrr_iter *iter)
560 {
561 	__mtrr_lookup_var_next(iter);
562 }
563 
564 static void mtrr_lookup_start(struct mtrr_iter *iter)
565 {
566 	if (!mtrr_is_enabled(iter->mtrr_state)) {
567 		iter->mtrr_disabled = true;
568 		return;
569 	}
570 
571 	if (!mtrr_lookup_fixed_start(iter))
572 		mtrr_lookup_var_start(iter);
573 }
574 
575 static void mtrr_lookup_init(struct mtrr_iter *iter,
576 			     struct kvm_mtrr *mtrr_state, u64 start, u64 end)
577 {
578 	iter->mtrr_state = mtrr_state;
579 	iter->start = start;
580 	iter->end = end;
581 	iter->mtrr_disabled = false;
582 	iter->partial_map = false;
583 	iter->fixed = false;
584 	iter->range = NULL;
585 
586 	mtrr_lookup_start(iter);
587 }
588 
589 static bool mtrr_lookup_okay(struct mtrr_iter *iter)
590 {
591 	if (iter->fixed) {
592 		iter->mem_type = iter->mtrr_state->fixed_ranges[iter->index];
593 		return true;
594 	}
595 
596 	if (iter->range) {
597 		iter->mem_type = iter->range->base & 0xff;
598 		return true;
599 	}
600 
601 	return false;
602 }
603 
604 static void mtrr_lookup_next(struct mtrr_iter *iter)
605 {
606 	if (iter->fixed)
607 		mtrr_lookup_fixed_next(iter);
608 	else
609 		mtrr_lookup_var_next(iter);
610 }
611 
612 #define mtrr_for_each_mem_type(_iter_, _mtrr_, _gpa_start_, _gpa_end_) \
613 	for (mtrr_lookup_init(_iter_, _mtrr_, _gpa_start_, _gpa_end_); \
614 	     mtrr_lookup_okay(_iter_); mtrr_lookup_next(_iter_))
615 
616 u8 kvm_mtrr_get_guest_memory_type(struct kvm_vcpu *vcpu, gfn_t gfn)
617 {
618 	struct kvm_mtrr *mtrr_state = &vcpu->arch.mtrr_state;
619 	struct mtrr_iter iter;
620 	u64 start, end;
621 	int type = -1;
622 	const int wt_wb_mask = (1 << MTRR_TYPE_WRBACK)
623 			       | (1 << MTRR_TYPE_WRTHROUGH);
624 
625 	start = gfn_to_gpa(gfn);
626 	end = start + PAGE_SIZE;
627 
628 	mtrr_for_each_mem_type(&iter, mtrr_state, start, end) {
629 		int curr_type = iter.mem_type;
630 
631 		/*
632 		 * Please refer to Intel SDM Volume 3: 11.11.4.1 MTRR
633 		 * Precedences.
634 		 */
635 
636 		if (type == -1) {
637 			type = curr_type;
638 			continue;
639 		}
640 
641 		/*
642 		 * If two or more variable memory ranges match and the
643 		 * memory types are identical, then that memory type is
644 		 * used.
645 		 */
646 		if (type == curr_type)
647 			continue;
648 
649 		/*
650 		 * If two or more variable memory ranges match and one of
651 		 * the memory types is UC, the UC memory type used.
652 		 */
653 		if (curr_type == MTRR_TYPE_UNCACHABLE)
654 			return MTRR_TYPE_UNCACHABLE;
655 
656 		/*
657 		 * If two or more variable memory ranges match and the
658 		 * memory types are WT and WB, the WT memory type is used.
659 		 */
660 		if (((1 << type) & wt_wb_mask) &&
661 		      ((1 << curr_type) & wt_wb_mask)) {
662 			type = MTRR_TYPE_WRTHROUGH;
663 			continue;
664 		}
665 
666 		/*
667 		 * For overlaps not defined by the above rules, processor
668 		 * behavior is undefined.
669 		 */
670 
671 		/* We use WB for this undefined behavior. :( */
672 		return MTRR_TYPE_WRBACK;
673 	}
674 
675 	if (iter.mtrr_disabled)
676 		return mtrr_disabled_type(vcpu);
677 
678 	/* not contained in any MTRRs. */
679 	if (type == -1)
680 		return mtrr_default_type(mtrr_state);
681 
682 	/*
683 	 * We just check one page, partially covered by MTRRs is
684 	 * impossible.
685 	 */
686 	WARN_ON(iter.partial_map);
687 
688 	return type;
689 }
690 EXPORT_SYMBOL_GPL(kvm_mtrr_get_guest_memory_type);
691 
692 bool kvm_mtrr_check_gfn_range_consistency(struct kvm_vcpu *vcpu, gfn_t gfn,
693 					  int page_num)
694 {
695 	struct kvm_mtrr *mtrr_state = &vcpu->arch.mtrr_state;
696 	struct mtrr_iter iter;
697 	u64 start, end;
698 	int type = -1;
699 
700 	start = gfn_to_gpa(gfn);
701 	end = gfn_to_gpa(gfn + page_num);
702 	mtrr_for_each_mem_type(&iter, mtrr_state, start, end) {
703 		if (type == -1) {
704 			type = iter.mem_type;
705 			continue;
706 		}
707 
708 		if (type != iter.mem_type)
709 			return false;
710 	}
711 
712 	if (iter.mtrr_disabled)
713 		return true;
714 
715 	if (!iter.partial_map)
716 		return true;
717 
718 	if (type == -1)
719 		return true;
720 
721 	return type == mtrr_default_type(mtrr_state);
722 }
723