Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 09 Feb 2010 16:11:43 -0800
From:      Marcel Moolenaar <xcllnt@mac.com>
To:        Kostik Belousov <kostikbel@gmail.com>
Cc:        svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org
Subject:   Re: svn commit: r203696 - in head: lib/libc/sys sys/kern sys/sys
Message-ID:  <86989446-64EF-411F-8E25-173DB6AEE10B@mac.com>
In-Reply-To: <896B58E6-12EA-48AB-86C2-5BA9F0C59512@mac.com>
References:  <201002090552.o195qZcD074581@svn.freebsd.org> <20100209095722.GQ9991@deviant.kiev.zoral.com.ua> <65DCE552-7EFD-48F2-85A4-EA0F1F0638EE@mac.com> <20100209184043.GV9991@deviant.kiev.zoral.com.ua> <896B58E6-12EA-48AB-86C2-5BA9F0C59512@mac.com>

next in thread | previous in thread | raw e-mail | index | archive | help

--Boundary_(ID_n1FZHhxZlAiiO2ipDJ1qwg)
Content-type: text/plain; charset=us-ascii
Content-transfer-encoding: 7BIT


On Feb 9, 2010, at 11:17 AM, Marcel Moolenaar wrote:

> Action items:
> 
>>>> - vmspace should be referenced by vmspace_acquire_ref()
>>>> - vm_map should be read-locked before iterating the map entries.
> 
> I'll implement it and send a patch for review to avoid unnecessary
> repository churn...

Please review attached patch. I have a sample session of how
a debugger can use the information (see XXX lines):

hob% /usr/obj/nfs/bsddbg/trunk/bdb/bdb images/abort/abort
[cursor=0x2000000000000560:0]
bdb> run
process 1539 created
process 1539 stopped with signal 5
XXX: 1: 0x2000000000000000-0x2000000000001fff, 5, 0 37 `/nfs/bsddbg/trunk/images/abort/abort`
XXX: 2: 0x2000000000010000-0x2000000000011fff, 3, 0 0 ``
XXX: 3: 0x2000000040010000-0x2000000040077fff, 5, 0 21 `/libexec/ld-elf.so.1`
XXX: 4: 0x2000000040086000-0x2000000040089fff, 3, 0x66000 21 `/libexec/ld-elf.so.1`
XXX: 5: 0x200000004008a000-0x2000000040091fff, 3, 0 0 ``
XXX: 6: 0x8000000000000000-0x800000000001ffff, 3, 0 0 ``
XXX: 7: 0x9ffffffffffe0000-0x9fffffffffffffff, 3, 0 0 ``
  0x200000004001c560: { // MFB;
>         alloc   r2 = ar.pfs, 0x0, 0x3, 0x3, 0x0
          nop.f   0x0
          nop.b   0x0 ;;
  }
[cursor=0x200000004001c560:0]
bdb> step
process 1575 stopped with signal 5
  0x200000004001c560: { // MFB;
          alloc   r2 = ar.pfs, 0x0, 0x3, 0x3, 0x0
>         nop.f   0x0
          nop.b   0x0 ;;
  }
[cursor=0x200000004001c560:1]
bdb> continue
process 1539 stopped with signal 6
XXX: 1: 0x2000000000000000-0x2000000000001fff, 5, 0 37 `/nfs/bsddbg/trunk/images/abort/abort`
XXX: 2: 0x2000000000010000-0x2000000000011fff, 3, 0 0 ``
XXX: 3: 0x2000000040010000-0x2000000040077fff, 5, 0 21 `/libexec/ld-elf.so.1`
XXX: 4: 0x200000004007e000-0x2000000040085fff, 3, 0x6000 0 ``
XXX: 5: 0x2000000040086000-0x2000000040089fff, 3, 0x66000 21 `/libexec/ld-elf.so.1`
XXX: 6: 0x200000004008a000-0x2000000040099fff, 3, 0 0 ``
XXX: 7: 0x200000004009c000-0x20000000402e1fff, 5, 0 15 `/lib/libc.so.7`
XXX: 8: 0x20000000402e2000-0x20000000402effff, 0, 0x246000 0 ``
XXX: 9: 0x20000000402f0000-0x20000000402fdfff, 3, 0x244000 15 `/lib/libc.so.7`
XXX: 10: 0x20000000402fe000-0x2000000040319fff, 3, 0x262000 0 ``
XXX: 11: 0x2000000040328000-0x2000000040339fff, 3, 0xe000 0 ``
XXX: 12: 0x8000000000000000-0x800000000001ffff, 3, 0 0 ``
XXX: 13: 0x9ffffffffffe0000-0x9fffffffffffffff, 3, 0 0 ``
  0x20000000402a0c40: { // MBB;
>         cmp.eq  p0, p6 = r0, r10
  (p6)    br.sptk.few 20000000400ded00
          br.ret.sptk.few rp ;;
  }
[cursor=0x20000000402a0c40:0]
bdb> 

-- 
Marcel Moolenaar
xcllnt@mac.com



--Boundary_(ID_n1FZHhxZlAiiO2ipDJ1qwg)
Content-type: application/octet-stream; name=ptrace.diff
Content-transfer-encoding: 7bit
Content-disposition: attachment; filename=ptrace.diff

Index: kern/sys_process.c
===================================================================
--- kern/sys_process.c	(revision 203724)
+++ kern/sys_process.c	(working copy)
@@ -75,7 +75,8 @@
 };
 
 struct ptrace_vm_entry32 {
-	uint32_t	pve_cookie;
+	int		pve_entry;
+	int		pve_timestamp;
 	uint32_t	pve_start;
 	uint32_t	pve_end;
 	uint32_t	pve_offset;
@@ -363,42 +364,56 @@
 	vm_map_t map;
 	vm_map_entry_t entry;
 	vm_object_t obj, tobj, lobj;
+	struct vmspace *vm;
 	struct vnode *vp;
 	char *freepath, *fullpath;
 	u_int pathlen;
-	int error, vfslocked;
+	int error, index, vfslocked;
 
-	map = &p->p_vmspace->vm_map;
+	vm = vmspace_acquire_ref(p);
+	map = &vm->vm_map;
+	vm_map_lock_read(map);
+
 	entry = map->header.next;
-	if (pve->pve_cookie != NULL) {
-		while (entry != &map->header && entry != pve->pve_cookie)
-			entry = entry->next;
-		if (entry != pve->pve_cookie)
-			return (EINVAL);
+	index = 0;
+	while (index < pve->pve_entry && entry != &map->header) {
 		entry = entry->next;
+		index++;
 	}
-	while (entry != &map->header && (entry->eflags & MAP_ENTRY_IS_SUB_MAP))
+	if (index != pve->pve_entry) {
+		error = EINVAL;
+		goto out;
+	}
+	while (entry != &map->header &&
+	    (entry->eflags & MAP_ENTRY_IS_SUB_MAP) != 0) {
 		entry = entry->next;
-	if (entry == &map->header)
-		return (ENOENT);
+		index++;
+	}
+	if (entry == &map->header) {
+		error = ENOENT;
+		goto out;
+	}
 
 	/* We got an entry. */
-	pve->pve_cookie = entry;
+	pve->pve_entry = index + 1;
+	pve->pve_timestamp = map->timestamp;
 	pve->pve_start = entry->start;
 	pve->pve_end = entry->end - 1;
 	pve->pve_offset = entry->offset;
 	pve->pve_prot = entry->protection;
 
+	error = 0;
+
 	/* Backing object's path needed? */
 	if (pve->pve_pathlen == 0)
-		return (0);
+		goto out;
 
 	pathlen = pve->pve_pathlen;
 	pve->pve_pathlen = 0;
 
 	obj = entry->object.vm_object;
 	if (obj == NULL)
-		return (0);
+		goto out;
 
 	VM_OBJECT_LOCK(obj);
 	for (lobj = tobj = obj; tobj; tobj = tobj->backing_object) {
@@ -420,7 +435,7 @@
 		vp = NULL;
 
 	if (vp == NULL)
-		return (0);
+		goto out;
 
 	freepath = NULL;
 	fullpath = NULL;
@@ -429,7 +444,6 @@
 	vrele(vp);
 	VFS_UNLOCK_GIANT(vfslocked);
 
-	error = 0;
 	if (fullpath != NULL) {
 		pve->pve_pathlen = strlen(fullpath) + 1;
 		if (pve->pve_pathlen <= pathlen) {
@@ -440,9 +454,40 @@
 	}
 	if (freepath != NULL)
 		free(freepath, M_TEMP);
+
+ out:
+	vm_map_unlock_read(map);
+	vmspace_free(vm);
 	return (error);
 }
 
+#ifdef COMPAT_IA32
+static int      
+ptrace_vm_entry32(struct thread *td, struct proc *p,
+    struct ptrace_vm_entry32 *pve32)
+{
+	struct ptrace_vm_entry pve;
+	int error;
+
+	pve.pve_entry = pve32->pve_entry;
+	pve.pve_pathlen = pve32->pve_pathlen;
+	pve.pve_path = (void *)(uintptr_t)pve32->pve_path;
+
+	error = ptrace_vm_entry(td, p, &pve);
+	if (error == 0) {
+		pve32->pve_entry = pve.pve_entry;
+		pve32->pve_timestamp = pve.pve_timestamp;
+		pve32->pve_start = pve.pve_start;
+		pve32->pve_end = pve.pve_end;
+		pve32->pve_offset = pve.pve_offset;
+		pve32->pve_prot = pve.pve_prot;
+	}
+
+	pve32->pve_pathlen = pve.pve_pathlen;
+	return (error);
+}
+#endif /* COMPAT_IA32 */
+
 /*
  * Process debugging system call.
  */
@@ -1087,14 +1132,12 @@
 		break;
 
 	case PT_VM_ENTRY:
+		PROC_UNLOCK(p);
 #ifdef COMPAT_IA32
-		/* XXX to be implemented. */
-		if (wrap32) {
-			error = EDOOFUS;
-			break;
-		}
+		if (wrap32)
+			error = ptrace_vm_entry32(td, p, addr);
+		else
 #endif
-		PROC_UNLOCK(p);
 		error = ptrace_vm_entry(td, p, addr);
 		PROC_LOCK(p);
 		break;
Index: sys/ptrace.h
===================================================================
--- sys/ptrace.h	(revision 203724)
+++ sys/ptrace.h	(working copy)
@@ -104,7 +104,8 @@
 
 /* Argument structure for PT_VM_ENTRY. */
 struct ptrace_vm_entry {
-	void	*pve_cookie;		/* Token used to iterate. */
+	int	pve_entry;		/* Entry number used for iteration. */
+	int	pve_timestamp;		/* Generation number of VM map. */
 	u_long	pve_start;		/* Start VA of range. */
 	u_long	pve_end;		/* End VA of range (incl). */
 	u_long	pve_offset;		/* Offset in backing object. */

--Boundary_(ID_n1FZHhxZlAiiO2ipDJ1qwg)--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?86989446-64EF-411F-8E25-173DB6AEE10B>