[Crash-utility] [PATCH] x86_64: Fix that Particular kvaddr is converted to wrong paddr (RHEL6 x86_64)

Nakajima Akira nakajima.akira at nttcom.co.jp
Tue Dec 22 07:36:12 UTC 2015


I didn't check XEN HYPER MODE, I don't have XEN.
If we need similar statement "if (kvaddr < MODULES_END)"
 please add inside in "if (XEN_HYPER_MODE())" (1859 at x86_64_kvtop)




>From ed300b74998e0923313e4fd14b9a41e305942b44 Mon Sep 17 00:00:00 2001
From: Nakajima Akira <nakajima.akira at nttcom.co.jp>
Date: Tue, 22 Dec 2015 15:46:42 +0900
Subject: [PATCH] Fix that particular kvaddr is converted to wrong paddr

BUG INFO
Particular kvaddr is converted to wrong paddr.
You can see this bug on RHEL6_x86_64. (at present only RHEL6)
 (I checked RHEL5, RHEL7, Fedora21, Fedora23)


from /proc/kallsyms
ffffffffff6008c0 D __jiffies

/////////// wrong ///////////
crash> vtop ffffffffff6008c0
VIRTUAL           PHYSICAL        
ffffffffff6008c0  7f6008c0        

      PAGE        PHYSICAL      MAPPING       INDEX CNT FLAGS
ffffea00000623b8   1c11000                0        0  1 20000000000400 reserved


crash> rd ffffffffff6008c0
ffffffffff6008c0:  0000000000000000                    ........


/////////// correct ///////////
crash> vtop ffffffffff6008c0
VIRTUAL           PHYSICAL        
ffffffffff6008c0  1c118c0         

      PAGE        PHYSICAL      MAPPING       INDEX CNT FLAGS
ffffea00000623b8   1c11000                0        0  1 20000000000400 reserved


crash> rd ffffffffff6008c0
ffffffffff6008c0:  00000000ffffe43a                    :.......

Reported-by: Nakajima Akira <nakajima.akira at nttcom.co.jp>
Signed-off-by: Nakajima Akira <nakajima.akira at nttcom.co.jp>

---
 x86_64.c |   28 +++++++++++++++-------------
 1 files changed, 15 insertions(+), 13 deletions(-)

diff --git a/x86_64.c b/x86_64.c
index ff6fdd5..dab4d43 100644
--- a/x86_64.c
+++ b/x86_64.c
@@ -1872,19 +1872,21 @@ x86_64_kvtop(struct task_context *tc, ulong kvaddr, physaddr_t *paddr, int verbo
                		fprintf(fp, "PAGE DIRECTORY: %lx\n", *pml4);
 		}
 	} else {
-        	if (!vt->vmalloc_start) {
-                	*paddr = x86_64_VTOP(kvaddr);
-                	return TRUE;
-        	}
-
-        	if (!IS_VMALLOC_ADDR(kvaddr)) {
-                	*paddr = x86_64_VTOP(kvaddr);
-                	if (!verbose)
-                        	return TRUE;
-        	}
-
-		if (XEN() && (kt->xen_flags & WRITABLE_PAGE_TABLES))
-			return (x86_64_kvtop_xen_wpt(tc, kvaddr, paddr, verbose));
+		if (kvaddr < MODULES_END) {
+	        	if (!vt->vmalloc_start) {
+	                	*paddr = x86_64_VTOP(kvaddr);
+	                	return TRUE;
+	        	}
+	
+	        	if (!IS_VMALLOC_ADDR(kvaddr)) {
+	                	*paddr = x86_64_VTOP(kvaddr);
+	                	if (!verbose)
+	                        	return TRUE;
+	        	}
+	
+			if (XEN() && (kt->xen_flags & WRITABLE_PAGE_TABLES))
+				return (x86_64_kvtop_xen_wpt(tc, kvaddr, paddr, verbose));
+		}
 
  		/*	
 		 *  pgd = pgd_offset_k(addr);
-- 
1.7.1

-------------- next part --------------
From ed300b74998e0923313e4fd14b9a41e305942b44 Mon Sep 17 00:00:00 2001
From: Nakajima Akira <nakajima.akira at nttcom.co.jp>
Date: Tue, 22 Dec 2015 15:46:42 +0900
Subject: [PATCH] Fix that particular kvaddr is converted to wrong paddr

BUG INFO
Particular kvaddr is converted to wrong paddr.
You can see this bug on RHEL6_x86_64. (at present only RHEL6)
 (I checked RHEL5, RHEL7, Fedora21, Fedora23)


from /proc/kallsyms
ffffffffff6008c0 D __jiffies

/////////// wrong ///////////
crash> vtop ffffffffff6008c0
VIRTUAL           PHYSICAL        
ffffffffff6008c0  7f6008c0        

      PAGE        PHYSICAL      MAPPING       INDEX CNT FLAGS
ffffea00000623b8   1c11000                0        0  1 20000000000400 reserved


crash> rd ffffffffff6008c0
ffffffffff6008c0:  0000000000000000                    ........


/////////// correct ///////////
crash> vtop ffffffffff6008c0
VIRTUAL           PHYSICAL        
ffffffffff6008c0  1c118c0         

      PAGE        PHYSICAL      MAPPING       INDEX CNT FLAGS
ffffea00000623b8   1c11000                0        0  1 20000000000400 reserved


crash> rd ffffffffff6008c0
ffffffffff6008c0:  00000000ffffe43a                    :.......

Reported-by: Nakajima Akira <nakajima.akira at nttcom.co.jp>
Signed-off-by: Nakajima Akira <nakajima.akira at nttcom.co.jp>

---
 x86_64.c |   28 +++++++++++++++-------------
 1 files changed, 15 insertions(+), 13 deletions(-)

diff --git a/x86_64.c b/x86_64.c
index ff6fdd5..dab4d43 100644
--- a/x86_64.c
+++ b/x86_64.c
@@ -1872,19 +1872,21 @@ x86_64_kvtop(struct task_context *tc, ulong kvaddr, physaddr_t *paddr, int verbo
                		fprintf(fp, "PAGE DIRECTORY: %lx\n", *pml4);
 		}
 	} else {
-        	if (!vt->vmalloc_start) {
-                	*paddr = x86_64_VTOP(kvaddr);
-                	return TRUE;
-        	}
-
-        	if (!IS_VMALLOC_ADDR(kvaddr)) {
-                	*paddr = x86_64_VTOP(kvaddr);
-                	if (!verbose)
-                        	return TRUE;
-        	}
-
-		if (XEN() && (kt->xen_flags & WRITABLE_PAGE_TABLES))
-			return (x86_64_kvtop_xen_wpt(tc, kvaddr, paddr, verbose));
+		if (kvaddr < MODULES_END) {
+	        	if (!vt->vmalloc_start) {
+	                	*paddr = x86_64_VTOP(kvaddr);
+	                	return TRUE;
+	        	}
+	
+	        	if (!IS_VMALLOC_ADDR(kvaddr)) {
+	                	*paddr = x86_64_VTOP(kvaddr);
+	                	if (!verbose)
+	                        	return TRUE;
+	        	}
+	
+			if (XEN() && (kt->xen_flags & WRITABLE_PAGE_TABLES))
+				return (x86_64_kvtop_xen_wpt(tc, kvaddr, paddr, verbose));
+		}
 
  		/*	
 		 *  pgd = pgd_offset_k(addr);
-- 
1.7.1



More information about the Crash-utility mailing list