Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 7 Dec 2019 20:01:56 +0000 (UTC)
From:      Mark Johnston <markj@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r355506 - head/usr.bin/gcore
Message-ID:  <201912072001.xB7K1uBE016476@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: markj
Date: Sat Dec  7 20:01:55 2019
New Revision: 355506
URL: https://svnweb.freebsd.org/changeset/base/355506

Log:
  gcore: Avoid using vm_map_entry_t.
  
  Use an internally defined structure instead, to avoid relying on kernel
  structure details.  No functional change intended.
  
  MFC after:	1 week

Modified:
  head/usr.bin/gcore/elfcore.c

Modified: head/usr.bin/gcore/elfcore.c
==============================================================================
--- head/usr.bin/gcore/elfcore.c	Sat Dec  7 19:36:40 2019	(r355505)
+++ head/usr.bin/gcore/elfcore.c	Sat Dec  7 20:01:55 2019	(r355506)
@@ -44,8 +44,6 @@ __FBSDID("$FreeBSD$");
 #include <machine/elf.h>
 #include <vm/vm_param.h>
 #include <vm/vm.h>
-#include <vm/pmap.h>
-#include <vm/vm_map.h>
 #include <assert.h>
 #include <err.h>
 #include <errno.h>
@@ -64,8 +62,15 @@ __FBSDID("$FreeBSD$");
  * Code for generating ELF core dumps.
  */
 
-typedef void (*segment_callback)(vm_map_entry_t, void *);
+struct map_entry {
+	struct map_entry *next;
+	vm_offset_t start;
+	vm_offset_t end;
+	vm_prot_t protection;
+};
 
+typedef void (*segment_callback)(struct map_entry *, void *);
+
 /* Closure for cb_put_phdr(). */
 struct phdr_closure {
 	Elf_Phdr *phdr;		/* Program header to fill in */
@@ -101,9 +106,9 @@ typedef struct ptrace_lwpinfo elfcore_lwpinfo_t;
 
 typedef void* (*notefunc_t)(void *, size_t *);
 
-static void cb_put_phdr(vm_map_entry_t, void *);
-static void cb_size_segment(vm_map_entry_t, void *);
-static void each_dumpable_segment(vm_map_entry_t, segment_callback,
+static void cb_put_phdr(struct map_entry *, void *);
+static void cb_size_segment(struct map_entry *, void *);
+static void each_dumpable_segment(struct map_entry *, segment_callback,
     void *closure);
 static void elf_detach(void);	/* atexit() handler. */
 static void *elf_note_fpregset(void *, size_t *);
@@ -130,12 +135,12 @@ static void *elf_note_procstat_psstrings(void *, size_
 static void *elf_note_procstat_rlimit(void *, size_t *);
 static void *elf_note_procstat_umask(void *, size_t *);
 static void *elf_note_procstat_vmmap(void *, size_t *);
-static void elf_puthdr(int, pid_t, vm_map_entry_t, void *, size_t, size_t,
+static void elf_puthdr(int, pid_t, struct map_entry *, void *, size_t, size_t,
     size_t, int);
 static void elf_putnote(int, notefunc_t, void *, struct sbuf *);
 static void elf_putnotes(pid_t, struct sbuf *, size_t *);
-static void freemap(vm_map_entry_t);
-static vm_map_entry_t readmap(pid_t);
+static void freemap(struct map_entry *);
+static struct map_entry *readmap(pid_t);
 static void *procstat_sysctl(void *, int, size_t, size_t *sizep);
 
 static pid_t g_pid;		/* Pid being dumped, global for elf_detach */
@@ -193,7 +198,7 @@ elf_detach(void)
 static void
 elf_coredump(int efd, int fd, pid_t pid)
 {
-	vm_map_entry_t map;
+	struct map_entry *map;
 	struct sseg_closure seginfo;
 	struct sbuf *sb;
 	void *hdr;
@@ -294,7 +299,7 @@ elf_coredump(int efd, int fd, pid_t pid)
  * program header entry.
  */
 static void
-cb_put_phdr(vm_map_entry_t entry, void *closure)
+cb_put_phdr(struct map_entry *entry, void *closure)
 {
 	struct phdr_closure *phc = (struct phdr_closure *)closure;
 	Elf_Phdr *phdr = phc->phdr;
@@ -324,7 +329,7 @@ cb_put_phdr(vm_map_entry_t entry, void *closure)
  * the number of segments and their total size.
  */
 static void
-cb_size_segment(vm_map_entry_t entry, void *closure)
+cb_size_segment(struct map_entry *entry, void *closure)
 {
 	struct sseg_closure *ssc = (struct sseg_closure *)closure;
 
@@ -338,11 +343,12 @@ cb_size_segment(vm_map_entry_t entry, void *closure)
  * data.
  */
 static void
-each_dumpable_segment(vm_map_entry_t map, segment_callback func, void *closure)
+each_dumpable_segment(struct map_entry *map, segment_callback func,
+    void *closure)
 {
-	vm_map_entry_t entry;
+	struct map_entry *entry;
 
-	for (entry = map;  entry != NULL;  entry = entry->next)
+	for (entry = map; entry != NULL; entry = entry->next)
 		(*func)(entry, closure);
 }
 
@@ -440,7 +446,7 @@ elf_putnote(int type, notefunc_t notefunc, void *arg, 
  * Generate the ELF coredump header.
  */
 static void
-elf_puthdr(int efd, pid_t pid, vm_map_entry_t map, void *hdr, size_t hdrsize,
+elf_puthdr(int efd, pid_t pid, struct map_entry *map, void *hdr, size_t hdrsize,
     size_t notesz, size_t segoff, int numsegs)
 {
 	Elf_Ehdr *ehdr, binhdr;
@@ -531,11 +537,12 @@ elf_puthdr(int efd, pid_t pid, vm_map_entry_t map, voi
  * Free the memory map.
  */
 static void
-freemap(vm_map_entry_t map)
+freemap(struct map_entry *map)
 {
+	struct map_entry *next;
 
 	while (map != NULL) {
-		vm_map_entry_t next = map->next;
+		next = map->next;
 		free(map);
 		map = next;
 	}
@@ -547,10 +554,10 @@ freemap(vm_map_entry_t map)
  * returned.  The map entries in the list aren't fully filled in; only
  * the items we need are present.
  */
-static vm_map_entry_t
+static struct map_entry *
 readmap(pid_t pid)
 {
-	vm_map_entry_t ent, *linkp, map;
+	struct map_entry *ent, **linkp, *map;
 	struct kinfo_vmentry *vmentl, *kve;
 	int i, nitems;
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201912072001.xB7K1uBE016476>