gdb/libkvm problem - can someone explain this?

John Baldwin jhb at freebsd.org
Thu Nov 5 13:56:37 UTC 2009


On Wednesday 04 November 2009 6:06:17 pm Dorr H. Clark wrote:
> 
> With FreeBSD 4.x, gdb -k is able to read and interpret
> the last 4 bytes of a page (4k) boundary.
> 
> In BSD 6.x/7.x/8.x using the kgdb program,
> if one issues the kgdb command:
>   (gdb) x /x 0xcbed8ffd
> An "invalid address" error is returned.  
> 
> However, if one issues the command:
>   (gdb) x /10x 0xcbed8ff0
> it is able to read the memory (and past) just fine.
> 
> The following patch returns the usr/src/lib/libkvm/kvm_i386.c 
> behavior closer to the BSD4.x version and seems to remedy this situation.
> 
> @@ -289,11 +289,13 @@
>  #define        PG_FRAME4M      (~PAGE4M_MASK)
>                 pde_pa = ((u_long)pde & PG_FRAME4M) + (va & PAGE4M_MASK);
>                 s = _kvm_pa2off(kd, pde_pa, &ofs);
> +#if 0
>                 if (s < sizeof pde) {
>                         _kvm_syserr(kd, kd->program,
>                             "_kvm_vatop: pde_pa not found");
>                         goto invalid;
>                 }
> +#endif
>                 *pa = ofs;
>                 return (NBPDR - (va & PAGE4M_MASK));
>         }
> 
> Does anyone see any problem or have any comments about this?

How about this.  It needs to fail if the page is not found at all, but this
should fix your edge case.  It also matches what kvm_amd64.c does.  I think
this was just a copy and paste bug.

Index: kvm_i386.c
===================================================================
--- kvm_i386.c	(revision 198888)
+++ kvm_i386.c	(working copy)
@@ -295,9 +295,9 @@
 #define	PG_FRAME4M	(~PAGE4M_MASK)
 		pde_pa = ((u_long)pde & PG_FRAME4M) + (va & PAGE4M_MASK);
 		s = _kvm_pa2off(kd, pde_pa, &ofs);
-		if (s < sizeof pde) {
-			_kvm_syserr(kd, kd->program,
-			    "_kvm_vatop: pde_pa not found");
+		if (s == 0) {
+			_kvm_err(kd, kd->program,
+			    "_kvm_vatop: 4MB page address not in dump");
 			goto invalid;
 		}
 		*pa = ofs;
@@ -391,9 +391,9 @@
 #define	PG_FRAME2M	(~PAGE2M_MASK)
 		pde_pa = ((u_long)pde & PG_FRAME2M) + (va & PAGE2M_MASK);
 		s = _kvm_pa2off(kd, pde_pa, &ofs);
-		if (s < sizeof pde) {
-			_kvm_syserr(kd, kd->program,
-			    "_kvm_vatop_pae: pde_pa not found");
+		if (s == 0) {
+			_kvm_err(kd, kd->program,
+			    "_kvm_vatop: 2MB page address not in dump");
 			goto invalid;
 		}
 		*pa = ofs;

-- 
John Baldwin


More information about the freebsd-hackers mailing list