diff --git a/defs.h b/defs.h
index a942dbb..f3ca47b 100755
--- a/defs.h
+++ b/defs.h
@@ -2241,6 +2241,7 @@ struct load_module {
 #define PRINT_INODES      (0x10)   /* KVADDR, UVADDR, and PHYSADDR */
 #define PRINT_MM_STRUCT   (0x20)
 #define PRINT_VMA_STRUCTS (0x40)
+#define PRINT_SINGLE_VMA  (0x80)
 
 #define MIN_PAGE_SIZE  (4096)
 
diff --git a/help.c b/help.c
index f752283..e294908 100755
--- a/help.c
+++ b/help.c
@@ -3108,7 +3108,7 @@ NULL
 char *help_vm[] = { 
 "vm",
 "virtual memory",
-"[-p | -v | -m | [-R reference] | [-f vm_flags]] [pid | taskp] ... ",
+"[-p | -P vmaddr | -v | -m | [-R reference] | [-f vm_flags]] [pid | taskp] ... ",
 "  This command displays basic virtual memory information of a context,",
 "  consisting of a pointer to its mm_struct and page dirctory, its RSS and ",
 "  total virtual memory size; and a list of pointers to each vm_area_struct,",
@@ -3124,6 +3124,8 @@ char *help_vm[] = {
 "            -p  translate each virtual page to its physical address, or if", 
 "                the page is not mapped, its swap device and offset, or",
 "                filename and offset.",
+"     -P vmaddr  translate each virtual page of the specified VM area to its",
+"                physical address, the output is like -p option.",
 "  -R reference  search for references to this number or filename.",
 "            -m  dump the mm_struct assocated with the task.",
 "            -v  dump all of the vm_area_structs associated with the task.",
@@ -3302,6 +3304,20 @@ char *help_vm[] = {
 "  Translate a FLAGS value:\n",
 "    %s> vm -f 3875",
 "    3875: (READ|EXEC|MAYREAD|MAYWRITE|MAYEXEC|DENYWRITE|EXECUTABLE|LOCKED)",
+" ",
+"  Display the page translations of VM area ffff880037638b70:\n",
+"    %s> vm -P ffff880037638b70",
+"    PID: 24406  TASK: ffff88003baa6b40  CPU: 1   COMMAND: \"crash\"",
+"          VMA           START       END     FLAGS FILE",
+"    ffff880037638b70 7f089c697000 7f089c69e000 80000d1 /usr/lib64/gconv/gconv-modules.cache",
+"    VIRTUAL     PHYSICAL",
+"    7f089c697000  36c3e000",
+"    7f089c698000  36c3d000",
+"    7f089c699000  36c3c000",
+"    7f089c69a000  FILE: /usr/lib64/gconv/gconv-modules.cache  OFFSET: 3000",
+"    7f089c69b000  36c3a000",
+"    7f089c69c000  FILE: /usr/lib64/gconv/gconv-modules.cache  OFFSET: 5000",
+"    7f089c69d000  36c38000",
 NULL               
 };
 
diff --git a/memory.c b/memory.c
index 55a184b..7397c7b 100755
--- a/memory.c
+++ b/memory.c
@@ -3036,16 +3036,18 @@ cmd_vm(void)
 	int c;
 	ulong flag;
 	ulong value;
+	ulong single_vma;
 	ulonglong llvalue;
 	struct task_context *tc;
 	struct reference reference, *ref;
 	int subsequent;
 
 	flag = 0;
+	single_vma = 0;
 	ref = NULL;
 	BZERO(&reference, sizeof(struct reference));
 
-        while ((c = getopt(argcnt, args, "f:pmvR:")) != EOF) {
+        while ((c = getopt(argcnt, args, "f:pmvR:P:")) != EOF) {
                 switch(c)
 		{
 		case 'f':
@@ -3090,6 +3092,15 @@ cmd_vm(void)
 			}
 			break;
 
+		case 'P':
+			if (flag) {
+				argerrs++;
+			} else {
+				flag |= PRINT_SINGLE_VMA;
+				single_vma = htol(optarg, FAULT_ON_ERROR, NULL);
+			}
+			break;
+
 		default:
 			argerrs++;
 			break;
@@ -3102,7 +3113,7 @@ cmd_vm(void)
 	if (!args[optind]) {
 		if (!ref)
 			print_task_header(fp, CURRENT_CONTEXT(), 0);
-		vm_area_dump(CURRENT_TASK(), flag, 0, ref);
+		vm_area_dump(CURRENT_TASK(), flag, single_vma, ref);
 		return;
 	}
 
@@ -3115,14 +3126,14 @@ cmd_vm(void)
 			for (tc = pid_to_context(value); tc; tc = tc->tc_next) {
                                 if (!ref)
                                         print_task_header(fp, tc, subsequent++);
-                                vm_area_dump(tc->task, flag, 0, ref);
+                                vm_area_dump(tc->task, flag, single_vma, ref);
                         }
 			break;
 
 		case STR_TASK:
 			if (!ref)
                                 print_task_header(fp, tc, subsequent++);
-                        vm_area_dump(tc->task, flag, 0, ref);
+                        vm_area_dump(tc->task, flag, single_vma, ref);
 			break;
 
 		case STR_INVALID:
@@ -3388,6 +3399,8 @@ vm_area_dump(ulong task, ulong flag, ulong vaddr, struct reference *ref)
 	ulonglong vm_flags;
 	ulong vm_file, inode;
 	ulong dentry, vfsmnt;
+	ulong single_vma;
+	int single_vma_found;
 	int found;
 	struct task_mem_usage task_mem_usage, *tm;
 	char buf1[BUFSIZE];
@@ -3401,6 +3414,13 @@ vm_area_dump(ulong task, ulong flag, ulong vaddr, struct reference *ref)
 	tm = &task_mem_usage;
 	get_task_mem_usage(task, tm);
 
+	single_vma = 0;
+	single_vma_found = FALSE;
+	if (flag & PRINT_SINGLE_VMA) {
+		single_vma = vaddr;
+		vaddr = 0;
+	}
+
 	if (ref) {
 		ref->cmdflags = VM_REF_SEARCH;
 		if (IS_A_NUMBER(ref->str)) {
@@ -3420,7 +3440,7 @@ vm_area_dump(ulong task, ulong flag, ulong vaddr, struct reference *ref)
                 return (ulong)NULL;
         }
 
-        if (!(flag & (UVADDR|PRINT_MM_STRUCT|PRINT_VMA_STRUCTS)) &&
+        if (!(flag & (UVADDR|PRINT_MM_STRUCT|PRINT_VMA_STRUCTS|PRINT_SINGLE_VMA)) &&
 	    !DO_REF_SEARCH(ref)) 
 		PRINT_VM_DATA();
 
@@ -3443,7 +3463,7 @@ vm_area_dump(ulong task, ulong flag, ulong vaddr, struct reference *ref)
                 mkstring(buf3, UVADDR_PRLEN, CENTER|RJUST, "END"),
 		space(MINSPACE));
 
-	if (!(flag & (PHYSADDR|VERIFY_ADDR|PRINT_VMA_STRUCTS)) && 
+	if (!(flag & (PHYSADDR|VERIFY_ADDR|PRINT_VMA_STRUCTS|PRINT_SINGLE_VMA)) && 
 	    !DO_REF_SEARCH(ref)) 
 		fprintf(fp, vma_header);
 
@@ -3462,6 +3482,13 @@ vm_area_dump(ulong task, ulong flag, ulong vaddr, struct reference *ref)
 		vm_start = ULONG(vma_buf + OFFSET(vm_area_struct_vm_start));
 		vm_flags = get_vm_flags(vma_buf);
 		vm_file = ULONG(vma_buf + OFFSET(vm_area_struct_vm_file));
+		
+		if (flag & PRINT_SINGLE_VMA) {
+			if (vma != single_vma)
+				continue;
+			fprintf(fp, "%s", vma_header);
+			single_vma_found = TRUE;
+		}
 
 		if (flag & PRINT_VMA_STRUCTS) {
 			dump_struct("vm_area_struct", vma, 0);
@@ -3551,7 +3578,7 @@ vm_area_dump(ulong task, ulong flag, ulong vaddr, struct reference *ref)
 			} else {
 				PRINT_VMA_DATA();
 				     
-				if (flag & PHYSADDR) 
+				if (flag & (PHYSADDR|PRINT_SINGLE_VMA)) 
 					vm_area_page_dump(vma, task,
 						vm_start, vm_end, vm_mm, ref);
 			}
@@ -3564,6 +3591,9 @@ vm_area_dump(ulong task, ulong flag, ulong vaddr, struct reference *ref)
 	if (flag & VERIFY_ADDR)
 		return (ulong)NULL;
 
+	if ((flag & PRINT_SINGLE_VMA) && !single_vma_found)
+		fprintf(fp, "(not found)\n");
+
 	if ((flag & UVADDR) && !found) 
 		fprintf(fp, "(not found)\n");
 
