Date: Wed, 10 Jul 2013 09:34:08 +0300 From: Mikolaj Golub <to.my.trociny@gmail.com> To: Jilles Tjoelker <jilles@stack.nl> Cc: freebsd-arch@freebsd.org, Robert Millan <rmh@freebsd.org> Subject: Re: ABI change in libkvm (kvm_uread removal) Message-ID: <20130710063406.GA39842@gmail.com> In-Reply-To: <20130709211657.GA86400@stack.nl> References: <CAOfDtXPT-BQt9aqTNYHRK0XdiqKZsPnsO6s9vei=XCpyBvZZ6w@mail.gmail.com> <20130709185846.GA19508@gmail.com> <20130709211657.GA86400@stack.nl>
next in thread | previous in thread | raw e-mail | index | archive | help
--oyUTqETQ0mS9luUI
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
On Tue, Jul 09, 2013 at 11:16:57PM +0200, Jilles Tjoelker wrote:
> On Tue, Jul 09, 2013 at 09:59:19PM +0300, Mikolaj Golub wrote:
> > Suggestions how this should be fixed properly (if possible) are highly
> > appreciated. I will do what people suggest.
>
> I would suggest bringing back kvm_uread() in stable/9 so that the ABI is
> kept. In head, I suggest removing kvm_uread() from the header file and
> bumping the soname. I think MFCing the soname bump will cause more
> annoyance than the removal of kvm_uread() itself.
>
> Much of the code using libkvm uses it to access kernel internals, which
> are not a proper ABI/API and change fairly frequently. Therefore, it is
> probably acceptable for this library not to use symbol versioning.
>
> The functions that do not expose the caller to kernel internals like
> kvm_getprocs() should probably not be used; instead, libprocstat
> provides a more ABI-stable way to do the same. Calling the sysctls
> directly is also an option.
Thank you all for your suggestions. I like Jilles' the most. So I am
going to return kvm_uread back to stable/9 by a direct commit and
remove it entirely from head and bump soname.
--
Mikolaj Golub
--oyUTqETQ0mS9luUI
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: inline; filename="libkvm.kvm_uread.all.1.patch"
Index: head/ObsoleteFiles.inc
===================================================================
--- head/ObsoleteFiles.inc (revision 253133)
+++ head/ObsoleteFiles.inc (working copy)
@@ -38,6 +38,9 @@
# xargs -n1 | sort | uniq -d;
# done
+# 20130710: libkvm version bump
+OLD_LIBS+=lib/libkvm.so.5
+OLD_LIBS+=usr/lib32/libkvm.so.5
# 20130623: dialog update from 1.1 to 1.2
OLD_LIBS+=usr/lib/libdialog.so.7
OLD_LIBS+=usr/lib32/libdialog.so.7
Index: head/lib/libkvm/Makefile
===================================================================
--- head/lib/libkvm/Makefile (revision 253133)
+++ head/lib/libkvm/Makefile (working copy)
@@ -3,6 +3,7 @@
LIB= kvm
SHLIBDIR?= /lib
+SHLIB_MAJOR= 6
CFLAGS+=-DLIBC_SCCS -I${.CURDIR}
.if exists(${.CURDIR}/kvm_${MACHINE_ARCH}.c)
Index: head/lib/libkvm/kvm.h
===================================================================
--- head/lib/libkvm/kvm.h (revision 253133)
+++ head/lib/libkvm/kvm.h (working copy)
@@ -89,8 +89,6 @@ kvm_t *kvm_openfiles
(const char *, const char *, const char *, int, char *);
ssize_t kvm_read(kvm_t *, unsigned long, void *, size_t);
ssize_t kvm_read_zpcpu(kvm_t *, void *, u_long, size_t, int);
-ssize_t kvm_uread
- (kvm_t *, const struct kinfo_proc *, unsigned long, char *, size_t);
ssize_t kvm_write(kvm_t *, unsigned long, const void *, size_t);
__END_DECLS
Index: stable/9/lib/libkvm/kvm_proc.c
===================================================================
--- stable/9/lib/libkvm/kvm_proc.c (revision 253133)
+++ stable/9/lib/libkvm/kvm_proc.c (working copy)
@@ -712,3 +712,55 @@ kvm_getenvv(kvm_t *kd, const struct kinfo_proc *kp
{
return (kvm_argv(kd, kp, 1, nchr));
}
+
+/*
+ * Read from user space. The user context is given by p.
+ */
+ssize_t
+kvm_uread(kvm_t *kd, const struct kinfo_proc *kp, u_long uva, char *buf,
+ size_t len)
+{
+ char *cp;
+ char procfile[MAXPATHLEN];
+ ssize_t amount;
+ int fd;
+
+ if (!ISALIVE(kd)) {
+ _kvm_err(kd, kd->program,
+ "cannot read user space from dead kernel");
+ return (0);
+ }
+
+ sprintf(procfile, "/proc/%d/mem", kp->ki_pid);
+ fd = open(procfile, O_RDONLY, 0);
+ if (fd < 0) {
+ _kvm_err(kd, kd->program, "cannot open %s", procfile);
+ return (0);
+ }
+
+ cp = buf;
+ while (len > 0) {
+ errno = 0;
+ if (lseek(fd, (off_t)uva, 0) == -1 && errno != 0) {
+ _kvm_err(kd, kd->program, "invalid address (%lx) in %s",
+ uva, procfile);
+ break;
+ }
+ amount = read(fd, cp, len);
+ if (amount < 0) {
+ _kvm_syserr(kd, kd->program, "error reading %s",
+ procfile);
+ break;
+ }
+ if (amount == 0) {
+ _kvm_err(kd, kd->program, "EOF reading %s", procfile);
+ break;
+ }
+ cp += amount;
+ uva += amount;
+ len -= amount;
+ }
+
+ close(fd);
+ return ((ssize_t)(cp - buf));
+}
--oyUTqETQ0mS9luUI--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20130710063406.GA39842>
