paging_tmpl.h 30.6 KB
Newer Older
1
/* SPDX-License-Identifier: GPL-2.0-only */
A
Avi Kivity 已提交
2 3 4 5 6 7 8 9 10
/*
 * Kernel-based Virtual Machine driver for Linux
 *
 * This module enables machines with Intel VT-x extensions to run virtual
 * machines without emulation or binary translation.
 *
 * MMU support
 *
 * Copyright (C) 2006 Qumranet, Inc.
N
Nicolas Kaiser 已提交
11
 * Copyright 2010 Red Hat, Inc. and/or its affiliates.
A
Avi Kivity 已提交
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
 *
 * Authors:
 *   Yaniv Kamay  <yaniv@qumranet.com>
 *   Avi Kivity   <avi@qumranet.com>
 */

/*
 * We need the mmu code to access both 32-bit and 64-bit guest ptes,
 * so the code in this file is compiled twice, once per pte size.
 */

#if PTTYPE == 64
	#define pt_element_t u64
	#define guest_walker guest_walker64
	#define FNAME(name) paging##64_##name
	#define PT_BASE_ADDR_MASK PT64_BASE_ADDR_MASK
28 29
	#define PT_LVL_ADDR_MASK(lvl) PT64_LVL_ADDR_MASK(lvl)
	#define PT_LVL_OFFSET_MASK(lvl) PT64_LVL_OFFSET_MASK(lvl)
A
Avi Kivity 已提交
30
	#define PT_INDEX(addr, level) PT64_INDEX(addr, level)
31
	#define PT_LEVEL_BITS PT64_LEVEL_BITS
32 33
	#define PT_GUEST_DIRTY_SHIFT PT_DIRTY_SHIFT
	#define PT_GUEST_ACCESSED_SHIFT PT_ACCESSED_SHIFT
34
	#define PT_HAVE_ACCESSED_DIRTY(mmu) true
35
	#ifdef CONFIG_X86_64
36
	#define PT_MAX_FULL_LEVELS PT64_ROOT_MAX_LEVEL
37
	#define CMPXCHG cmpxchg
38
	#else
39
	#define CMPXCHG cmpxchg64
40 41
	#define PT_MAX_FULL_LEVELS 2
	#endif
A
Avi Kivity 已提交
42 43 44 45 46
#elif PTTYPE == 32
	#define pt_element_t u32
	#define guest_walker guest_walker32
	#define FNAME(name) paging##32_##name
	#define PT_BASE_ADDR_MASK PT32_BASE_ADDR_MASK
47 48
	#define PT_LVL_ADDR_MASK(lvl) PT32_LVL_ADDR_MASK(lvl)
	#define PT_LVL_OFFSET_MASK(lvl) PT32_LVL_OFFSET_MASK(lvl)
A
Avi Kivity 已提交
49
	#define PT_INDEX(addr, level) PT32_INDEX(addr, level)
50
	#define PT_LEVEL_BITS PT32_LEVEL_BITS
51
	#define PT_MAX_FULL_LEVELS 2
52 53
	#define PT_GUEST_DIRTY_SHIFT PT_DIRTY_SHIFT
	#define PT_GUEST_ACCESSED_SHIFT PT_ACCESSED_SHIFT
54
	#define PT_HAVE_ACCESSED_DIRTY(mmu) true
55
	#define CMPXCHG cmpxchg
56 57 58 59 60 61 62 63 64
#elif PTTYPE == PTTYPE_EPT
	#define pt_element_t u64
	#define guest_walker guest_walkerEPT
	#define FNAME(name) ept_##name
	#define PT_BASE_ADDR_MASK PT64_BASE_ADDR_MASK
	#define PT_LVL_ADDR_MASK(lvl) PT64_LVL_ADDR_MASK(lvl)
	#define PT_LVL_OFFSET_MASK(lvl) PT64_LVL_OFFSET_MASK(lvl)
	#define PT_INDEX(addr, level) PT64_INDEX(addr, level)
	#define PT_LEVEL_BITS PT64_LEVEL_BITS
65 66 67
	#define PT_GUEST_DIRTY_SHIFT 9
	#define PT_GUEST_ACCESSED_SHIFT 8
	#define PT_HAVE_ACCESSED_DIRTY(mmu) ((mmu)->ept_ad)
68
	#define CMPXCHG cmpxchg64
69
	#define PT_MAX_FULL_LEVELS PT64_ROOT_MAX_LEVEL
A
Avi Kivity 已提交
70 71 72 73
#else
	#error Invalid PTTYPE value
#endif

74 75 76
#define PT_GUEST_DIRTY_MASK    (1 << PT_GUEST_DIRTY_SHIFT)
#define PT_GUEST_ACCESSED_MASK (1 << PT_GUEST_ACCESSED_SHIFT)

77 78
#define gpte_to_gfn_lvl FNAME(gpte_to_gfn_lvl)
#define gpte_to_gfn(pte) gpte_to_gfn_lvl((pte), PT_PAGE_TABLE_LEVEL)
79

A
Avi Kivity 已提交
80 81 82 83 84 85
/*
 * The guest_walker structure emulates the behavior of the hardware page
 * table walker.
 */
struct guest_walker {
	int level;
86
	unsigned max_level;
87
	gfn_t table_gfn[PT_MAX_FULL_LEVELS];
88
	pt_element_t ptes[PT_MAX_FULL_LEVELS];
89
	pt_element_t prefetch_ptes[PTE_PREFETCH_NUM];
90
	gpa_t pte_gpa[PT_MAX_FULL_LEVELS];
91
	pt_element_t __user *ptep_user[PT_MAX_FULL_LEVELS];
92
	bool pte_writable[PT_MAX_FULL_LEVELS];
93 94
	unsigned pt_access;
	unsigned pte_access;
95
	gfn_t gfn;
96
	struct x86_exception fault;
A
Avi Kivity 已提交
97 98
};

99
static gfn_t gpte_to_gfn_lvl(pt_element_t gpte, int lvl)
100
{
101
	return (gpte & PT_LVL_ADDR_MASK(lvl)) >> PAGE_SHIFT;
102 103
}

104 105
static inline void FNAME(protect_clean_gpte)(struct kvm_mmu *mmu, unsigned *access,
					     unsigned gpte)
106 107 108
{
	unsigned mask;

109
	/* dirty bit is not supported, so no need to track it */
110
	if (!PT_HAVE_ACCESSED_DIRTY(mmu))
111 112
		return;

113 114 115 116
	BUILD_BUG_ON(PT_WRITABLE_MASK != ACC_WRITE_MASK);

	mask = (unsigned)~ACC_WRITE_MASK;
	/* Allow write access to dirty gptes */
117 118
	mask |= (gpte >> (PT_GUEST_DIRTY_SHIFT - PT_WRITABLE_SHIFT)) &
		PT_WRITABLE_MASK;
119 120 121 122 123
	*access &= mask;
}

static inline int FNAME(is_present_gpte)(unsigned long pte)
{
124
#if PTTYPE != PTTYPE_EPT
B
Bandan Das 已提交
125
	return pte & PT_PRESENT_MASK;
126 127 128
#else
	return pte & 7;
#endif
129 130
}

131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
static bool FNAME(is_bad_mt_xwr)(struct rsvd_bits_validate *rsvd_check, u64 gpte)
{
#if PTTYPE != PTTYPE_EPT
	return false;
#else
	return __is_bad_mt_xwr(rsvd_check, gpte);
#endif
}

static bool FNAME(is_rsvd_bits_set)(struct kvm_mmu *mmu, u64 gpte, int level)
{
	return __is_rsvd_bits_set(&mmu->guest_rsvd_check, gpte, level) ||
	       FNAME(is_bad_mt_xwr)(&mmu->guest_rsvd_check, gpte);
}

146
static int FNAME(cmpxchg_gpte)(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu,
147 148
			       pt_element_t __user *ptep_user, unsigned index,
			       pt_element_t orig_pte, pt_element_t new_pte)
149
{
150
	int npages;
151 152 153 154
	pt_element_t ret;
	pt_element_t *table;
	struct page *page;

155
	npages = get_user_pages_fast((unsigned long)ptep_user, 1, FOLL_WRITE, &page);
156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184
	if (likely(npages == 1)) {
		table = kmap_atomic(page);
		ret = CMPXCHG(&table[index], orig_pte, new_pte);
		kunmap_atomic(table);

		kvm_release_page_dirty(page);
	} else {
		struct vm_area_struct *vma;
		unsigned long vaddr = (unsigned long)ptep_user & PAGE_MASK;
		unsigned long pfn;
		unsigned long paddr;

		down_read(&current->mm->mmap_sem);
		vma = find_vma_intersection(current->mm, vaddr, vaddr + PAGE_SIZE);
		if (!vma || !(vma->vm_flags & VM_PFNMAP)) {
			up_read(&current->mm->mmap_sem);
			return -EFAULT;
		}
		pfn = ((vaddr - vma->vm_start) >> PAGE_SHIFT) + vma->vm_pgoff;
		paddr = pfn << PAGE_SHIFT;
		table = memremap(paddr, PAGE_SIZE, MEMREMAP_WB);
		if (!table) {
			up_read(&current->mm->mmap_sem);
			return -EFAULT;
		}
		ret = CMPXCHG(&table[index], orig_pte, new_pte);
		memunmap(table);
		up_read(&current->mm->mmap_sem);
	}
185 186 187 188

	return (ret != orig_pte);
}

189 190 191 192 193 194 195
static bool FNAME(prefetch_invalid_gpte)(struct kvm_vcpu *vcpu,
				  struct kvm_mmu_page *sp, u64 *spte,
				  u64 gpte)
{
	if (!FNAME(is_present_gpte)(gpte))
		goto no_present;

196
	/* if accessed bit is not supported prefetch non accessed gpte */
197 198
	if (PT_HAVE_ACCESSED_DIRTY(vcpu->arch.mmu) &&
	    !(gpte & PT_GUEST_ACCESSED_MASK))
199 200
		goto no_present;

201
	if (FNAME(is_rsvd_bits_set)(vcpu->arch.mmu, gpte, PT_PAGE_TABLE_LEVEL))
202 203
		goto no_present;

204 205 206 207 208 209 210
	return false;

no_present:
	drop_spte(vcpu->kvm, spte);
	return true;
}

211 212 213 214 215 216
/*
 * For PTTYPE_EPT, a page table can be executable but not readable
 * on supported processors. Therefore, set_spte does not automatically
 * set bit 0 if execute only is supported. Here, we repurpose ACC_USER_MASK
 * to signify readability since it isn't used in the EPT case
 */
217
static inline unsigned FNAME(gpte_access)(u64 gpte)
218 219
{
	unsigned access;
220 221 222
#if PTTYPE == PTTYPE_EPT
	access = ((gpte & VMX_EPT_WRITABLE_MASK) ? ACC_WRITE_MASK : 0) |
		((gpte & VMX_EPT_EXECUTABLE_MASK) ? ACC_EXEC_MASK : 0) |
223
		((gpte & VMX_EPT_READABLE_MASK) ? ACC_USER_MASK : 0);
224
#else
225 226 227 228 229
	BUILD_BUG_ON(ACC_EXEC_MASK != PT_PRESENT_MASK);
	BUILD_BUG_ON(ACC_EXEC_MASK != 1);
	access = gpte & (PT_WRITABLE_MASK | PT_USER_MASK | PT_PRESENT_MASK);
	/* Combine NX with P (which is set here) to get ACC_EXEC_MASK.  */
	access ^= (gpte >> PT64_NX_SHIFT);
230
#endif
231 232 233 234

	return access;
}

235 236 237 238 239 240 241 242 243 244 245
static int FNAME(update_accessed_dirty_bits)(struct kvm_vcpu *vcpu,
					     struct kvm_mmu *mmu,
					     struct guest_walker *walker,
					     int write_fault)
{
	unsigned level, index;
	pt_element_t pte, orig_pte;
	pt_element_t __user *ptep_user;
	gfn_t table_gfn;
	int ret;

246
	/* dirty/accessed bits are not supported, so no need to update them */
247
	if (!PT_HAVE_ACCESSED_DIRTY(mmu))
248 249
		return 0;

250 251 252 253 254
	for (level = walker->max_level; level >= walker->level; --level) {
		pte = orig_pte = walker->ptes[level - 1];
		table_gfn = walker->table_gfn[level - 1];
		ptep_user = walker->ptep_user[level - 1];
		index = offset_in_page(ptep_user) / sizeof(pt_element_t);
255
		if (!(pte & PT_GUEST_ACCESSED_MASK)) {
256
			trace_kvm_mmu_set_accessed_bit(table_gfn, index, sizeof(pte));
257
			pte |= PT_GUEST_ACCESSED_MASK;
258
		}
259
		if (level == walker->level && write_fault &&
260
				!(pte & PT_GUEST_DIRTY_MASK)) {
261
			trace_kvm_mmu_set_dirty_bit(table_gfn, index, sizeof(pte));
262 263 264 265
#if PTTYPE == PTTYPE_EPT
			if (kvm_arch_write_log_dirty(vcpu))
				return -EINVAL;
#endif
266
			pte |= PT_GUEST_DIRTY_MASK;
267 268 269 270
		}
		if (pte == orig_pte)
			continue;

271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286
		/*
		 * If the slot is read-only, simply do not process the accessed
		 * and dirty bits.  This is the correct thing to do if the slot
		 * is ROM, and page tables in read-as-ROM/write-as-MMIO slots
		 * are only supported if the accessed and dirty bits are already
		 * set in the ROM (so that MMIO writes are never needed).
		 *
		 * Note that NPT does not allow this at all and faults, since
		 * it always wants nested page table entries for the guest
		 * page tables to be writable.  And EPT works but will simply
		 * overwrite the read-only memory to set the accessed and dirty
		 * bits.
		 */
		if (unlikely(!walker->pte_writable[level - 1]))
			continue;

287 288 289 290
		ret = FNAME(cmpxchg_gpte)(vcpu, mmu, ptep_user, index, orig_pte, pte);
		if (ret)
			return ret;

291
		kvm_vcpu_mark_page_dirty(vcpu, table_gfn);
292
		walker->ptes[level - 1] = pte;
293 294 295 296
	}
	return 0;
}

297 298 299 300 301 302 303 304 305 306 307
static inline unsigned FNAME(gpte_pkeys)(struct kvm_vcpu *vcpu, u64 gpte)
{
	unsigned pkeys = 0;
#if PTTYPE == 64
	pte_t pte = {.pte = gpte};

	pkeys = pte_flags_pkey(pte_flags(pte));
#endif
	return pkeys;
}

308
/*
309
 * Fetch a guest pte for a guest virtual address, or for an L2's GPA.
310
 */
311 312
static int FNAME(walk_addr_generic)(struct guest_walker *walker,
				    struct kvm_vcpu *vcpu, struct kvm_mmu *mmu,
313
				    gpa_t addr, u32 access)
A
Avi Kivity 已提交
314
{
315
	int ret;
316
	pt_element_t pte;
317
	pt_element_t __user *uninitialized_var(ptep_user);
318
	gfn_t table_gfn;
319 320
	u64 pt_access, pte_access;
	unsigned index, accessed_dirty, pte_pkey;
321
	unsigned nested_access;
322
	gpa_t pte_gpa;
323
	bool have_ad;
324
	int offset;
325
	u64 walk_nx_mask = 0;
326 327 328 329
	const int write_fault = access & PFERR_WRITE_MASK;
	const int user_fault  = access & PFERR_USER_MASK;
	const int fetch_fault = access & PFERR_FETCH_MASK;
	u16 errcode = 0;
330 331
	gpa_t real_gpa;
	gfn_t gfn;
A
Avi Kivity 已提交
332

333
	trace_kvm_mmu_pagetable_walk(addr, access);
334
retry_walk:
335 336
	walker->level = mmu->root_level;
	pte           = mmu->get_cr3(vcpu);
337
	have_ad       = PT_HAVE_ACCESSED_DIRTY(mmu);
338

339
#if PTTYPE == 64
340
	walk_nx_mask = 1ULL << PT64_NX_SHIFT;
341
	if (walker->level == PT32E_ROOT_LEVEL) {
342
		pte = mmu->get_pdptr(vcpu, (addr >> 30) & 3);
343
		trace_kvm_mmu_paging_element(pte, walker->level);
344
		if (!FNAME(is_present_gpte)(pte))
345
			goto error;
346 347 348
		--walker->level;
	}
#endif
349
	walker->max_level = walker->level;
350
	ASSERT(!(is_long_mode(vcpu) && !is_pae(vcpu)));
A
Avi Kivity 已提交
351

352 353 354 355 356 357 358
	/*
	 * FIXME: on Intel processors, loads of the PDPTE registers for PAE paging
	 * by the MOV to CR instruction are treated as reads and do not cause the
	 * processor to set the dirty flag in any EPT paging-structure entry.
	 */
	nested_access = (have_ad ? PFERR_WRITE_MASK : 0) | PFERR_USER_MASK;

359
	pte_access = ~0;
360
	++walker->level;
361

362
	do {
363 364 365
		gfn_t real_gfn;
		unsigned long host_addr;

366
		pt_access = pte_access;
367 368
		--walker->level;

369
		index = PT_INDEX(addr, walker->level);
370
		table_gfn = gpte_to_gfn(pte);
371 372
		offset    = index * sizeof(pt_element_t);
		pte_gpa   = gfn_to_gpa(table_gfn) + offset;
373 374

		BUG_ON(walker->level < 1);
375
		walker->table_gfn[walker->level - 1] = table_gfn;
376
		walker->pte_gpa[walker->level - 1] = pte_gpa;
377

378
		real_gfn = mmu->translate_gpa(vcpu, gfn_to_gpa(table_gfn),
379
					      nested_access,
380
					      &walker->fault);
381 382 383 384 385 386 387 388 389 390 391

		/*
		 * FIXME: This can happen if emulation (for of an INS/OUTS
		 * instruction) triggers a nested page fault.  The exit
		 * qualification / exit info field will incorrectly have
		 * "guest page access" as the nested page fault's cause,
		 * instead of "guest page structure access".  To fix this,
		 * the x86_exception struct should be augmented with enough
		 * information to fix the exit_qualification or exit_info_1
		 * fields.
		 */
392
		if (unlikely(real_gfn == UNMAPPED_GVA))
393
			return 0;
394

395 396
		real_gfn = gpa_to_gfn(real_gfn);

397
		host_addr = kvm_vcpu_gfn_to_hva_prot(vcpu, real_gfn,
398
					    &walker->pte_writable[walker->level - 1]);
399 400
		if (unlikely(kvm_is_error_hva(host_addr)))
			goto error;
401 402

		ptep_user = (pt_element_t __user *)((void *)host_addr + offset);
403 404
		if (unlikely(__copy_from_user(&pte, ptep_user, sizeof(pte))))
			goto error;
405
		walker->ptep_user[walker->level - 1] = ptep_user;
406

407
		trace_kvm_mmu_paging_element(pte, walker->level);
408

409 410 411 412 413 414
		/*
		 * Inverting the NX it lets us AND it like other
		 * permission bits.
		 */
		pte_access = pt_access & (pte ^ walk_nx_mask);

415
		if (unlikely(!FNAME(is_present_gpte)(pte)))
416
			goto error;
417

418
		if (unlikely(FNAME(is_rsvd_bits_set)(mmu, pte, walker->level))) {
419
			errcode = PFERR_RSVD_MASK | PFERR_PRESENT_MASK;
420
			goto error;
421
		}
422

423
		walker->ptes[walker->level - 1] = pte;
A
Avi Kivity 已提交
424
	} while (!is_last_gpte(mmu, walker->level, pte));
425

426
	pte_pkey = FNAME(gpte_pkeys)(vcpu, pte);
427 428 429
	accessed_dirty = have_ad ? pte_access & PT_GUEST_ACCESSED_MASK : 0;

	/* Convert to ACC_*_MASK flags for struct guest_walker.  */
430 431
	walker->pt_access = FNAME(gpte_access)(pt_access ^ walk_nx_mask);
	walker->pte_access = FNAME(gpte_access)(pte_access ^ walk_nx_mask);
432
	errcode = permission_fault(vcpu, mmu, walker->pte_access, pte_pkey, access);
433
	if (unlikely(errcode))
434 435
		goto error;

436 437 438 439 440 441
	gfn = gpte_to_gfn_lvl(pte, walker->level);
	gfn += (addr & PT_LVL_OFFSET_MASK(walker->level)) >> PAGE_SHIFT;

	if (PTTYPE == 32 && walker->level == PT_DIRECTORY_LEVEL && is_cpuid_PSE36())
		gfn += pse36_gfn_delta(pte);

442
	real_gpa = mmu->translate_gpa(vcpu, gfn_to_gpa(gfn), access, &walker->fault);
443 444 445 446 447
	if (real_gpa == UNMAPPED_GVA)
		return 0;

	walker->gfn = real_gpa >> PAGE_SHIFT;

448
	if (!write_fault)
449
		FNAME(protect_clean_gpte)(mmu, &walker->pte_access, pte);
450 451
	else
		/*
452 453 454
		 * On a write fault, fold the dirty bit into accessed_dirty.
		 * For modes without A/D bits support accessed_dirty will be
		 * always clear.
455
		 */
456 457
		accessed_dirty &= pte >>
			(PT_GUEST_DIRTY_SHIFT - PT_GUEST_ACCESSED_SHIFT);
458 459 460 461 462 463 464 465

	if (unlikely(!accessed_dirty)) {
		ret = FNAME(update_accessed_dirty_bits)(vcpu, mmu, walker, write_fault);
		if (unlikely(ret < 0))
			goto error;
		else if (ret)
			goto retry_walk;
	}
466

467
	pgprintk("%s: pte %llx pte_access %x pt_access %x\n",
468
		 __func__, (u64)pte, walker->pte_access, walker->pt_access);
469 470
	return 1;

471
error:
472
	errcode |= write_fault | user_fault;
473 474
	if (fetch_fault && (mmu->nx ||
			    kvm_read_cr4_bits(vcpu, X86_CR4_SMEP)))
475
		errcode |= PFERR_FETCH_MASK;
476

477 478 479
	walker->fault.vector = PF_VECTOR;
	walker->fault.error_code_valid = true;
	walker->fault.error_code = errcode;
480 481 482 483 484 485 486 487

#if PTTYPE == PTTYPE_EPT
	/*
	 * Use PFERR_RSVD_MASK in error_code to to tell if EPT
	 * misconfiguration requires to be injected. The detection is
	 * done by is_rsvd_bits_set() above.
	 *
	 * We set up the value of exit_qualification to inject:
488 489
	 * [2:0] - Derive from the access bits. The exit_qualification might be
	 *         out of date if it is serving an EPT misconfiguration.
490 491 492 493 494 495
	 * [5:3] - Calculated by the page walk of the guest EPT page tables
	 * [7:8] - Derived from [7:8] of real exit_qualification
	 *
	 * The other bits are set to 0.
	 */
	if (!(errcode & PFERR_RSVD_MASK)) {
496 497 498 499 500 501 502
		vcpu->arch.exit_qualification &= 0x180;
		if (write_fault)
			vcpu->arch.exit_qualification |= EPT_VIOLATION_ACC_WRITE;
		if (user_fault)
			vcpu->arch.exit_qualification |= EPT_VIOLATION_ACC_READ;
		if (fetch_fault)
			vcpu->arch.exit_qualification |= EPT_VIOLATION_ACC_INSTR;
503
		vcpu->arch.exit_qualification |= (pte_access & 0x7) << 3;
504 505
	}
#endif
506 507
	walker->fault.address = addr;
	walker->fault.nested_page_fault = mmu != vcpu->arch.walk_mmu;
508

509
	trace_kvm_mmu_walker_error(walker->fault.error_code);
510
	return 0;
A
Avi Kivity 已提交
511 512
}

513
static int FNAME(walk_addr)(struct guest_walker *walker,
514
			    struct kvm_vcpu *vcpu, gpa_t addr, u32 access)
515
{
516
	return FNAME(walk_addr_generic)(walker, vcpu, vcpu->arch.mmu, addr,
517
					access);
518 519
}

520
#if PTTYPE != PTTYPE_EPT
521 522
static int FNAME(walk_addr_nested)(struct guest_walker *walker,
				   struct kvm_vcpu *vcpu, gva_t addr,
523
				   u32 access)
524 525
{
	return FNAME(walk_addr_generic)(walker, vcpu, &vcpu->arch.nested_mmu,
526
					addr, access);
527
}
528
#endif
529

530 531 532
static bool
FNAME(prefetch_gpte)(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp,
		     u64 *spte, pt_element_t gpte, bool no_dirty_log)
533
{
534
	unsigned pte_access;
535
	gfn_t gfn;
D
Dan Williams 已提交
536
	kvm_pfn_t pfn;
537

538
	if (FNAME(prefetch_invalid_gpte)(vcpu, sp, spte, gpte))
539
		return false;
540

541
	pgprintk("%s: gpte %llx spte %p\n", __func__, (u64)gpte, spte);
542 543

	gfn = gpte_to_gfn(gpte);
544
	pte_access = sp->role.access & FNAME(gpte_access)(gpte);
545
	FNAME(protect_clean_gpte)(vcpu->arch.mmu, &pte_access, gpte);
546 547
	pfn = pte_prefetch_gfn_to_pfn(vcpu, gfn,
			no_dirty_log && (pte_access & ACC_WRITE_MASK));
548
	if (is_error_pfn(pfn))
549
		return false;
550

551
	/*
552 553
	 * we call mmu_set_spte() with host_writable = true because
	 * pte_prefetch_gfn_to_pfn always gets a writable pfn.
554
	 */
555 556
	mmu_set_spte(vcpu, spte, pte_access, 0, PT_PAGE_TABLE_LEVEL, gfn, pfn,
		     true, true);
557

558
	kvm_release_pfn_clean(pfn);
559 560 561 562 563 564 565 566 567
	return true;
}

static void FNAME(update_pte)(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp,
			      u64 *spte, const void *pte)
{
	pt_element_t gpte = *(const pt_element_t *)pte;

	FNAME(prefetch_gpte)(vcpu, sp, spte, gpte, false);
568 569
}

A
Avi Kivity 已提交
570 571 572 573
static bool FNAME(gpte_changed)(struct kvm_vcpu *vcpu,
				struct guest_walker *gw, int level)
{
	pt_element_t curr_pte;
574 575 576 577 578 579 580 581 582
	gpa_t base_gpa, pte_gpa = gw->pte_gpa[level - 1];
	u64 mask;
	int r, index;

	if (level == PT_PAGE_TABLE_LEVEL) {
		mask = PTE_PREFETCH_NUM * sizeof(pt_element_t) - 1;
		base_gpa = pte_gpa & ~mask;
		index = (pte_gpa - base_gpa) / sizeof(pt_element_t);

583
		r = kvm_vcpu_read_guest_atomic(vcpu, base_gpa,
584 585 586
				gw->prefetch_ptes, sizeof(gw->prefetch_ptes));
		curr_pte = gw->prefetch_ptes[index];
	} else
587
		r = kvm_vcpu_read_guest_atomic(vcpu, pte_gpa,
A
Avi Kivity 已提交
588
				  &curr_pte, sizeof(curr_pte));
589

A
Avi Kivity 已提交
590 591 592
	return r || curr_pte != gw->ptes[level - 1];
}

593 594
static void FNAME(pte_prefetch)(struct kvm_vcpu *vcpu, struct guest_walker *gw,
				u64 *sptep)
595 596
{
	struct kvm_mmu_page *sp;
597
	pt_element_t *gptep = gw->prefetch_ptes;
598
	u64 *spte;
599
	int i;
600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615

	sp = page_header(__pa(sptep));

	if (sp->role.level > PT_PAGE_TABLE_LEVEL)
		return;

	if (sp->role.direct)
		return __direct_pte_prefetch(vcpu, sp, sptep);

	i = (sptep - sp->spt) & ~(PTE_PREFETCH_NUM - 1);
	spte = sp->spt + i;

	for (i = 0; i < PTE_PREFETCH_NUM; i++, spte++) {
		if (spte == sptep)
			continue;

616
		if (is_shadow_present_pte(*spte))
617 618
			continue;

619
		if (!FNAME(prefetch_gpte)(vcpu, sp, spte, gptep[i], true))
620 621 622 623
			break;
	}
}

A
Avi Kivity 已提交
624 625
/*
 * Fetch a shadow pte for a specific level in the paging hierarchy.
626 627
 * If the guest tries to write a write-protected page, we need to
 * emulate this operation, return 1 to indicate this case.
A
Avi Kivity 已提交
628
 */
629
static int FNAME(fetch)(struct kvm_vcpu *vcpu, gpa_t addr,
630
			 struct guest_walker *gw,
631
			 int write_fault, int max_level,
P
Paolo Bonzini 已提交
632 633
			 kvm_pfn_t pfn, bool map_writable, bool prefault,
			 bool lpage_disallowed)
A
Avi Kivity 已提交
634
{
635
	struct kvm_mmu_page *sp = NULL;
636
	struct kvm_shadow_walk_iterator it;
637
	unsigned direct_access, access = gw->pt_access;
638
	int top_level, hlevel, ret;
639
	gfn_t base_gfn = gw->gfn;
640

641
	direct_access = gw->pte_access;
642

643
	top_level = vcpu->arch.mmu->root_level;
644 645 646 647 648 649 650 651 652 653 654
	if (top_level == PT32E_ROOT_LEVEL)
		top_level = PT32_ROOT_LEVEL;
	/*
	 * Verify that the top-level gpte is still there.  Since the page
	 * is a root page, it is either write protected (and cannot be
	 * changed from now on) or it is invalid (in which case, we don't
	 * really care if it changes underneath us after this point).
	 */
	if (FNAME(gpte_changed)(vcpu, gw, top_level))
		goto out_gpte_changed;

655
	if (WARN_ON(!VALID_PAGE(vcpu->arch.mmu->root_hpa)))
656 657
		goto out_gpte_changed;

658 659 660
	for (shadow_walk_init(&it, vcpu, addr);
	     shadow_walk_okay(&it) && it.level > gw->level;
	     shadow_walk_next(&it)) {
661 662
		gfn_t table_gfn;

663
		clear_sp_write_flooding_count(it.sptep);
664
		drop_large_spte(vcpu, it.sptep);
665

666
		sp = NULL;
667 668 669
		if (!is_shadow_present_pte(*it.sptep)) {
			table_gfn = gw->table_gfn[it.level - 2];
			sp = kvm_mmu_get_page(vcpu, table_gfn, addr, it.level-1,
670
					      false, access);
671
		}
672 673 674 675 676

		/*
		 * Verify that the gpte in the page we've just write
		 * protected is still there.
		 */
677
		if (FNAME(gpte_changed)(vcpu, gw, it.level - 1))
678
			goto out_gpte_changed;
679

680
		if (sp)
681
			link_shadow_page(vcpu, it.sptep, sp);
682
	}
A
Avi Kivity 已提交
683

684
	hlevel = kvm_mmu_hugepage_adjust(vcpu, gw->gfn, max_level, &pfn);
685

686 687
	trace_kvm_mmu_spte_requested(addr, gw->level, pfn);

688
	for (; shadow_walk_okay(&it); shadow_walk_next(&it)) {
689
		clear_sp_write_flooding_count(it.sptep);
P
Paolo Bonzini 已提交
690 691 692 693 694

		/*
		 * We cannot overwrite existing page tables with an NX
		 * large page, as the leaf could be executable.
		 */
695
		disallowed_hugepage_adjust(it, gw->gfn, &pfn, &hlevel);
P
Paolo Bonzini 已提交
696

697
		base_gfn = gw->gfn & ~(KVM_PAGES_PER_HPAGE(it.level) - 1);
698 699 700
		if (it.level == hlevel)
			break;

701
		validate_direct_spte(vcpu, it.sptep, direct_access);
702

703
		drop_large_spte(vcpu, it.sptep);
704

705 706 707 708
		if (!is_shadow_present_pte(*it.sptep)) {
			sp = kvm_mmu_get_page(vcpu, base_gfn, addr,
					      it.level - 1, true, direct_access);
			link_shadow_page(vcpu, it.sptep, sp);
P
Paolo Bonzini 已提交
709 710
			if (lpage_disallowed)
				account_huge_nx_page(vcpu->kvm, sp);
711
		}
712 713
	}

714
	ret = mmu_set_spte(vcpu, it.sptep, gw->pte_access, write_fault,
715
			   it.level, base_gfn, pfn, prefault, map_writable);
716
	FNAME(pte_prefetch)(vcpu, gw, it.sptep);
717
	++vcpu->stat.pf_fixed;
718
	return ret;
719 720

out_gpte_changed:
721
	return RET_PF_RETRY;
A
Avi Kivity 已提交
722 723
}

724 725 726 727 728 729 730 731 732 733
 /*
 * To see whether the mapped gfn can write its page table in the current
 * mapping.
 *
 * It is the helper function of FNAME(page_fault). When guest uses large page
 * size to map the writable gfn which is used as current page table, we should
 * force kvm to use small page size to map it because new shadow page will be
 * created when kvm establishes shadow page table that stop kvm using large
 * page size. Do it early can avoid unnecessary #PF and emulation.
 *
734 735 736
 * @write_fault_to_shadow_pgtable will return true if the fault gfn is
 * currently used as its page table.
 *
737 738 739 740 741 742
 * Note: the PDPT page table is not checked for PAE-32 bit guest. It is ok
 * since the PDPT is always shadowed, that means, we can not use large page
 * size to map the gfn which is used as PDPT.
 */
static bool
FNAME(is_self_change_mapping)(struct kvm_vcpu *vcpu,
743 744
			      struct guest_walker *walker, int user_fault,
			      bool *write_fault_to_shadow_pgtable)
745 746 747
{
	int level;
	gfn_t mask = ~(KVM_PAGES_PER_HPAGE(walker->level) - 1);
748
	bool self_changed = false;
749 750 751 752 753

	if (!(walker->pte_access & ACC_WRITE_MASK ||
	      (!is_write_protection(vcpu) && !user_fault)))
		return false;

754 755 756 757 758 759
	for (level = walker->level; level <= walker->max_level; level++) {
		gfn_t gfn = walker->gfn ^ walker->table_gfn[level - 1];

		self_changed |= !(gfn & mask);
		*write_fault_to_shadow_pgtable |= !gfn;
	}
760

761
	return self_changed;
762 763
}

A
Avi Kivity 已提交
764 765 766 767 768 769 770 771 772 773 774
/*
 * Page fault handler.  There are several causes for a page fault:
 *   - there is no shadow pte for the guest pte
 *   - write access through a shadow pte marked read only so that we can set
 *     the dirty bit
 *   - write access to a shadow pte marked read only so we can update the page
 *     dirty bitmap, when userspace requests it
 *   - mmio access; in this case we will never install a present shadow pte
 *   - normal guest page fault due to the guest pte marked not present, not
 *     writable, or not executable
 *
775 776
 *  Returns: 1 if we need to emulate the instruction, 0 otherwise, or
 *           a negative value on error.
A
Avi Kivity 已提交
777
 */
778
static int FNAME(page_fault)(struct kvm_vcpu *vcpu, gpa_t addr, u32 error_code,
779
			     bool prefault)
A
Avi Kivity 已提交
780 781 782 783
{
	int write_fault = error_code & PFERR_WRITE_MASK;
	int user_fault = error_code & PFERR_USER_MASK;
	struct guest_walker walker;
784
	int r;
D
Dan Williams 已提交
785
	kvm_pfn_t pfn;
786
	unsigned long mmu_seq;
787
	bool map_writable, is_self_change_mapping;
P
Paolo Bonzini 已提交
788 789
	bool lpage_disallowed = (error_code & PFERR_FETCH_MASK) &&
				is_nx_huge_page_enabled();
790
	int max_level;
A
Avi Kivity 已提交
791

792
	pgprintk("%s: addr %lx err %x\n", __func__, addr, error_code);
793

794 795 796
	r = mmu_topup_memory_caches(vcpu);
	if (r)
		return r;
797

798 799 800 801 802 803
	/*
	 * If PFEC.RSVD is set, this is a shadow page fault.
	 * The bit needs to be cleared before walking guest page tables.
	 */
	error_code &= ~PFERR_RSVD_MASK;

A
Avi Kivity 已提交
804
	/*
805
	 * Look up the guest pte for the faulting address.
A
Avi Kivity 已提交
806
	 */
807
	r = FNAME(walk_addr)(&walker, vcpu, addr, error_code);
A
Avi Kivity 已提交
808 809 810 811

	/*
	 * The page is not mapped by the guest.  Let the guest handle it.
	 */
812
	if (!r) {
813
		pgprintk("%s: guest page fault\n", __func__);
814
		if (!prefault)
X
Xiao Guangrong 已提交
815
			inject_page_fault(vcpu, &walker.fault);
816

817
		return RET_PF_RETRY;
A
Avi Kivity 已提交
818 819
	}

820 821
	if (page_fault_handle_page_track(vcpu, error_code, walker.gfn)) {
		shadow_page_table_clear_flood(vcpu, addr);
822
		return RET_PF_EMULATE;
823
	}
824

825 826 827 828 829
	vcpu->arch.write_fault_to_shadow_pgtable = false;

	is_self_change_mapping = FNAME(is_self_change_mapping)(vcpu,
	      &walker, user_fault, &vcpu->arch.write_fault_to_shadow_pgtable);

830
	if (lpage_disallowed || is_self_change_mapping)
831
		max_level = PT_PAGE_TABLE_LEVEL;
832 833 834
	else
		max_level = walker.level;

835
	mmu_seq = vcpu->kvm->mmu_notifier_seq;
836
	smp_rmb();
837

838
	if (try_async_pf(vcpu, prefault, walker.gfn, addr, &pfn, write_fault,
839
			 &map_writable))
840
		return RET_PF_RETRY;
841

842
	if (handle_abnormal_pfn(vcpu, addr, walker.gfn, pfn, walker.pte_access, &r))
843 844
		return r;

845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864
	/*
	 * Do not change pte_access if the pfn is a mmio page, otherwise
	 * we will cache the incorrect access into mmio spte.
	 */
	if (write_fault && !(walker.pte_access & ACC_WRITE_MASK) &&
	     !is_write_protection(vcpu) && !user_fault &&
	      !is_noslot_pfn(pfn)) {
		walker.pte_access |= ACC_WRITE_MASK;
		walker.pte_access &= ~ACC_USER_MASK;

		/*
		 * If we converted a user page to a kernel page,
		 * so that the kernel can write to it when cr0.wp=0,
		 * then we should prevent the kernel from executing it
		 * if SMEP is enabled.
		 */
		if (kvm_read_cr4_bits(vcpu, X86_CR4_SMEP))
			walker.pte_access &= ~ACC_EXEC_MASK;
	}

865
	r = RET_PF_RETRY;
866
	spin_lock(&vcpu->kvm->mmu_lock);
867
	if (mmu_notifier_retry(vcpu->kvm, mmu_seq))
868
		goto out_unlock;
869

870
	kvm_mmu_audit(vcpu, AUDIT_PRE_PAGE_FAULT);
871 872
	if (make_mmu_pages_available(vcpu) < 0)
		goto out_unlock;
873 874
	r = FNAME(fetch)(vcpu, addr, &walker, write_fault, max_level, pfn,
			 map_writable, prefault, lpage_disallowed);
875
	kvm_mmu_audit(vcpu, AUDIT_POST_PAGE_FAULT);
876 877 878 879

out_unlock:
	spin_unlock(&vcpu->kvm->mmu_lock);
	kvm_release_pfn_clean(pfn);
880
	return r;
A
Avi Kivity 已提交
881 882
}

X
Xiao Guangrong 已提交
883 884 885 886
static gpa_t FNAME(get_level1_sp_gpa)(struct kvm_mmu_page *sp)
{
	int offset = 0;

887
	WARN_ON(sp->role.level != PT_PAGE_TABLE_LEVEL);
X
Xiao Guangrong 已提交
888 889 890 891 892 893 894

	if (PTTYPE == 32)
		offset = sp->role.quadrant << PT64_LEVEL_BITS;

	return gfn_to_gpa(sp->gfn) + offset * sizeof(pt_element_t);
}

895
static void FNAME(invlpg)(struct kvm_vcpu *vcpu, gva_t gva, hpa_t root_hpa)
M
Marcelo Tosatti 已提交
896
{
897
	struct kvm_shadow_walk_iterator iterator;
898
	struct kvm_mmu_page *sp;
899 900 901
	int level;
	u64 *sptep;

902 903
	vcpu_clear_mmio_info(vcpu, gva);

904 905 906 907 908
	/*
	 * No need to check return value here, rmap_can_add() can
	 * help us to skip pte prefetch later.
	 */
	mmu_topup_memory_caches(vcpu);
M
Marcelo Tosatti 已提交
909

910
	if (!VALID_PAGE(root_hpa)) {
911 912 913 914
		WARN_ON(1);
		return;
	}

915
	spin_lock(&vcpu->kvm->mmu_lock);
916
	for_each_shadow_entry_using_root(vcpu, root_hpa, gva, iterator) {
917 918
		level = iterator.level;
		sptep = iterator.sptep;
919

920
		sp = page_header(__pa(sptep));
X
Xiao Guangrong 已提交
921
		if (is_last_spte(*sptep, level)) {
922 923 924
			pt_element_t gpte;
			gpa_t pte_gpa;

925 926 927
			if (!sp->unsync)
				break;

X
Xiao Guangrong 已提交
928
			pte_gpa = FNAME(get_level1_sp_gpa)(sp);
929
			pte_gpa += (sptep - sp->spt) * sizeof(pt_element_t);
930

X
Xiao Guangrong 已提交
931
			if (mmu_page_zap_pte(vcpu->kvm, sp, sptep))
932 933
				kvm_flush_remote_tlbs_with_address(vcpu->kvm,
					sp->gfn, KVM_PAGES_PER_HPAGE(sp->role.level));
934 935 936 937

			if (!rmap_can_add(vcpu))
				break;

938 939
			if (kvm_vcpu_read_guest_atomic(vcpu, pte_gpa, &gpte,
						       sizeof(pt_element_t)))
940 941 942
				break;

			FNAME(update_pte)(vcpu, sp, sptep, &gpte);
943
		}
M
Marcelo Tosatti 已提交
944

945
		if (!is_shadow_present_pte(*sptep) || !sp->unsync_children)
946 947
			break;
	}
948
	spin_unlock(&vcpu->kvm->mmu_lock);
M
Marcelo Tosatti 已提交
949 950
}

951 952
/* Note, @addr is a GPA when gva_to_gpa() translates an L2 GPA to an L1 GPA. */
static gpa_t FNAME(gva_to_gpa)(struct kvm_vcpu *vcpu, gpa_t addr, u32 access,
953
			       struct x86_exception *exception)
A
Avi Kivity 已提交
954 955
{
	struct guest_walker walker;
A
Avi Kivity 已提交
956 957
	gpa_t gpa = UNMAPPED_GVA;
	int r;
A
Avi Kivity 已提交
958

959
	r = FNAME(walk_addr)(&walker, vcpu, addr, access);
A
Avi Kivity 已提交
960

A
Avi Kivity 已提交
961
	if (r) {
A
Avi Kivity 已提交
962
		gpa = gfn_to_gpa(walker.gfn);
963
		gpa |= addr & ~PAGE_MASK;
964 965
	} else if (exception)
		*exception = walker.fault;
A
Avi Kivity 已提交
966 967 968 969

	return gpa;
}

970
#if PTTYPE != PTTYPE_EPT
971 972
/* Note, gva_to_gpa_nested() is only used to translate L2 GVAs. */
static gpa_t FNAME(gva_to_gpa_nested)(struct kvm_vcpu *vcpu, gpa_t vaddr,
973 974
				      u32 access,
				      struct x86_exception *exception)
975 976 977 978 979
{
	struct guest_walker walker;
	gpa_t gpa = UNMAPPED_GVA;
	int r;

980 981 982 983 984
#ifndef CONFIG_X86_64
	/* A 64-bit GVA should be impossible on 32-bit KVM. */
	WARN_ON_ONCE(vaddr >> 32);
#endif

985
	r = FNAME(walk_addr_nested)(&walker, vcpu, vaddr, access);
986 987 988 989

	if (r) {
		gpa = gfn_to_gpa(walker.gfn);
		gpa |= vaddr & ~PAGE_MASK;
990 991
	} else if (exception)
		*exception = walker.fault;
992 993 994

	return gpa;
}
995
#endif
996

997 998 999 1000
/*
 * Using the cached information from sp->gfns is safe because:
 * - The spte has a reference to the struct page, so the pfn for a given gfn
 *   can't change unless all sptes pointing to it are nuked first.
1001 1002 1003 1004 1005 1006 1007
 *
 * Note:
 *   We should flush all tlbs if spte is dropped even though guest is
 *   responsible for it. Since if we don't, kvm_mmu_notifier_invalidate_page
 *   and kvm_mmu_notifier_invalidate_range_start detect the mapping page isn't
 *   used by guest then tlbs are not flushed, so guest is allowed to access the
 *   freed pages.
1008
 *   And we increase kvm->tlbs_dirty to delay tlbs flush in this case.
1009
 */
1010
static int FNAME(sync_page)(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp)
1011
{
X
Xiao Guangrong 已提交
1012
	int i, nr_present = 0;
1013
	bool host_writable;
1014
	gpa_t first_pte_gpa;
1015
	int set_spte_ret = 0;
1016

1017 1018 1019
	/* direct kvm_mmu_page can not be unsync. */
	BUG_ON(sp->role.direct);

X
Xiao Guangrong 已提交
1020
	first_pte_gpa = FNAME(get_level1_sp_gpa)(sp);
1021

1022 1023 1024 1025
	for (i = 0; i < PT64_ENT_PER_PAGE; i++) {
		unsigned pte_access;
		pt_element_t gpte;
		gpa_t pte_gpa;
1026
		gfn_t gfn;
1027

1028
		if (!sp->spt[i])
1029 1030
			continue;

1031
		pte_gpa = first_pte_gpa + i * sizeof(pt_element_t);
1032

1033 1034
		if (kvm_vcpu_read_guest_atomic(vcpu, pte_gpa, &gpte,
					       sizeof(pt_element_t)))
1035
			return 0;
1036

1037
		if (FNAME(prefetch_invalid_gpte)(vcpu, sp, &sp->spt[i], gpte)) {
1038 1039 1040 1041 1042 1043
			/*
			 * Update spte before increasing tlbs_dirty to make
			 * sure no tlb flush is lost after spte is zapped; see
			 * the comments in kvm_flush_remote_tlbs().
			 */
			smp_wmb();
1044
			vcpu->kvm->tlbs_dirty++;
1045 1046 1047
			continue;
		}

1048 1049
		gfn = gpte_to_gfn(gpte);
		pte_access = sp->role.access;
1050
		pte_access &= FNAME(gpte_access)(gpte);
1051
		FNAME(protect_clean_gpte)(vcpu->arch.mmu, &pte_access, gpte);
1052

1053
		if (sync_mmio_spte(vcpu, &sp->spt[i], gfn, pte_access,
1054
		      &nr_present))
1055 1056
			continue;

1057
		if (gfn != sp->gfns[i]) {
1058
			drop_spte(vcpu->kvm, &sp->spt[i]);
1059 1060 1061 1062 1063
			/*
			 * The same as above where we are doing
			 * prefetch_invalid_gpte().
			 */
			smp_wmb();
1064
			vcpu->kvm->tlbs_dirty++;
1065 1066 1067 1068
			continue;
		}

		nr_present++;
1069

1070 1071
		host_writable = sp->spt[i] & SPTE_HOST_WRITEABLE;

1072 1073 1074 1075
		set_spte_ret |= set_spte(vcpu, &sp->spt[i],
					 pte_access, PT_PAGE_TABLE_LEVEL,
					 gfn, spte_to_pfn(sp->spt[i]),
					 true, false, host_writable);
1076 1077
	}

1078 1079 1080
	if (set_spte_ret & SET_SPTE_NEED_REMOTE_TLB_FLUSH)
		kvm_flush_remote_tlbs(vcpu->kvm);

1081
	return nr_present;
1082 1083
}

A
Avi Kivity 已提交
1084 1085 1086 1087 1088
#undef pt_element_t
#undef guest_walker
#undef FNAME
#undef PT_BASE_ADDR_MASK
#undef PT_INDEX
1089 1090
#undef PT_LVL_ADDR_MASK
#undef PT_LVL_OFFSET_MASK
1091
#undef PT_LEVEL_BITS
1092
#undef PT_MAX_FULL_LEVELS
1093
#undef gpte_to_gfn
1094
#undef gpte_to_gfn_lvl
1095
#undef CMPXCHG
1096 1097 1098 1099
#undef PT_GUEST_ACCESSED_MASK
#undef PT_GUEST_DIRTY_MASK
#undef PT_GUEST_DIRTY_SHIFT
#undef PT_GUEST_ACCESSED_SHIFT
1100
#undef PT_HAVE_ACCESSED_DIRTY