Module Name:    src
Committed By:   skrll
Date:           Tue Dec 18 16:25:47 UTC 2018

Modified Files:
        src/lib/libkvm: kvm_aarch64.c

Log Message:
Fix _kvm_kvatop so that it now works.


To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 src/lib/libkvm/kvm_aarch64.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/libkvm/kvm_aarch64.c
diff -u src/lib/libkvm/kvm_aarch64.c:1.5 src/lib/libkvm/kvm_aarch64.c:1.6
--- src/lib/libkvm/kvm_aarch64.c:1.5	Fri Nov  9 04:06:40 2018
+++ src/lib/libkvm/kvm_aarch64.c	Tue Dec 18 16:25:47 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: kvm_aarch64.c,v 1.5 2018/11/09 04:06:40 mrg Exp $ */
+/* $NetBSD: kvm_aarch64.c,v 1.6 2018/12/18 16:25:47 skrll Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -48,7 +48,7 @@
 
 #include "kvm_private.h"
 
-__RCSID("$NetBSD: kvm_aarch64.c,v 1.5 2018/11/09 04:06:40 mrg Exp $");
+__RCSID("$NetBSD: kvm_aarch64.c,v 1.6 2018/12/18 16:25:47 skrll Exp $");
 
 /*ARGSUSED*/
 void
@@ -83,27 +83,24 @@ lose:
 	}
 
 	const cpu_kcore_hdr_t * const cpu_kh = kd->cpu_data;
-	const uint64_t tg1 = cpu_kh->kh_tcr1 & TCR_TG1; 
+	const uint64_t tg1 = cpu_kh->kh_tcr1 & TCR_TG1;
 	const u_int t1siz = __SHIFTOUT(cpu_kh->kh_tcr1, TCR_T1SZ);
+	const u_int inputsz = 64 - t1siz;
 
 	/*
 	 * Real kernel virtual address: do the translation.
 	 */
 
-	u_int va_bits;
 	u_int page_shift;
 
 	switch (tg1) {
 	case TCR_TG1_4KB:
-		va_bits = t1siz + 36;
 		page_shift = 12;
 		break;
 	case TCR_TG1_16KB:
-		va_bits = 48;
 		page_shift = 14;
 		break;
 	case TCR_TG1_64KB:
-		va_bits = t1siz + 38;
 		page_shift = 16;
 		break;
 	default:
@@ -111,28 +108,27 @@ lose:
 	}
 
 	const size_t page_size = 1 << page_shift;
-	const uint64_t page_mask = (page_size - 1);
-	const uint64_t page_addr = __BITS(47, 0) & ~page_mask;
-	const uint64_t pte_mask = page_mask >> 3;
+	const uint64_t page_mask = __BITS(page_shift - 1, 0);
+	const uint64_t page_addr = __BITS(47, page_shift);
 	const u_int pte_shift = page_shift - 3;
 
-	/* how many level of page tables do we have? */
-	u_int level = (48 + page_shift - 1) / page_shift;
+	/* how many levels of page tables do we have? */
+	u_int levels = howmany(inputsz - page_shift, pte_shift);
 
 	/* restrict va to the valid VA bits */
-	va &= (1LL << va_bits) - 1;
+	va &= __BITS(inputsz - 1, 0);
 
-	u_int addr_shift = page_shift + (level - 1) * pte_shift;
+	u_int addr_shift = page_shift + (levels - 1) * pte_shift;
 
 	/* clear out the unused low bits of the table address */
-	paddr_t pte_addr = (cpu_kh->kh_ttbr1 & TTBR_BADDR);
-	pte_addr &= ~((8L << (va_bits - addr_shift)) - 1);
+	paddr_t pte_addr = cpu_kh->kh_ttbr1 & TTBR_BADDR;
 
 	for (;;) {
 		pt_entry_t pte;
 
 		/* now index into the pte table */
-		pte_addr += 8 * ((va >> addr_shift) & pte_mask);
+		const u_int idx_mask =  __BITS(addr_shift + pte_shift - 1, addr_shift);
+		pte_addr += 8 * __SHIFTOUT(va, idx_mask);
 
 		/* Find and read the PTE. */
 		if (_kvm_pread(kd, kd->pmfd, &pte, sizeof(pte),
@@ -148,15 +144,15 @@ lose:
 		}
 
 		if ((pte & LX_TYPE) == LX_TYPE_BLK) {
-			const paddr_t blk_mask = ((1L << addr_shift) - 1);
+			const size_t blk_size = 1 << addr_shift;
+			const paddr_t blk_mask = __BITS(addr_shift - 1, 0);
 
 			*pa = (pte & page_addr & ~blk_mask) | (va & blk_mask);
-			return 0;
+			return blk_size - (va & blk_mask);
 		}
-
-		if (level == page_shift) {
+		if (--levels == 0) {
 			*pa = (pte & page_addr) | (va & page_mask);
-			return 0;
+			return page_size - (va & page_mask); 
 		}
 
 		/*

Reply via email to