|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] tools/misc/xencov.c: Use MAP_WIRED on NetBSD
Subject: [PATCH] gcov: Do not use mmap directly but use
xc_hypercall_buffer_alloc
xencov.c did not compile on NetBSD so use xc_hypercall_buffer which is
more portable.
Signed-off-by: Frediano Ziglio <frediano.ziglio@xxxxxxxxxx>
---
tools/misc/xencov.c | 22 +++++++++-------------
1 file changed, 9 insertions(+), 13 deletions(-)
Here you are. It get tested on a x64 machine, if somebody could test it
with a NetBSD would be great.
diff --git a/tools/misc/xencov.c b/tools/misc/xencov.c
index 6645a30..fb4b2ff 100644
--- a/tools/misc/xencov.c
+++ b/tools/misc/xencov.c
@@ -24,7 +24,6 @@
#include <unistd.h>
#include <errno.h>
#include <err.h>
-#include <sys/mman.h>
static xc_interface *gcov_xch = NULL;
@@ -35,16 +34,17 @@ static void gcov_init(void)
err(1, "opening interface");
}
-int gcov_get_info(int op, struct xen_sysctl *sys, void *ptr)
+int gcov_get_info(int op, struct xen_sysctl *sys, struct xc_hypercall_buffer
*ptr)
{
struct xen_sysctl_coverage_op *cov;
+ DECLARE_HYPERCALL_BUFFER_ARGUMENT(ptr);
memset(sys, 0, sizeof(*sys));
sys->cmd = XEN_SYSCTL_coverage_op;
cov = &sys->u.coverage_op;
cov->cmd = op;
- cov->u.raw_info.p = ptr;
+ set_xen_guest_handle(cov->u.raw_info, ptr);
return xc_sysctl(gcov_xch, sys);
}
@@ -52,10 +52,8 @@ int gcov_get_info(int op, struct xen_sysctl *sys, void *ptr)
static void gcov_read(const char *fn, int reset)
{
struct xen_sysctl sys;
- unsigned page_size = sysconf(_SC_PAGESIZE);
uint32_t total_len;
- uint8_t *p;
- size_t size;
+ DECLARE_HYPERCALL_BUFFER(uint8_t, p);
FILE *f;
int op = reset ? XEN_SYSCTL_COVERAGE_read_and_reset :
XEN_SYSCTL_COVERAGE_read;
@@ -71,16 +69,13 @@ static void gcov_read(const char *fn, int reset)
errx(1, "coverage size too big %u bytes\n", total_len);
/* allocate */
- size = total_len + page_size;
- size -= (size % page_size);
- p = mmap(0, size, PROT_WRITE|PROT_READ,
- MAP_PRIVATE|MAP_ANON|MAP_LOCKED, -1, 0);
- if ( p == (uint8_t *) -1 )
- err(1, "mapping memory for coverage");
+ p = xc_hypercall_buffer_alloc(gcov_xch, p, total_len);
+ if ( p == NULL )
+ err(1, "allocating memory for coverage");
/* get data */
memset(p, 0, total_len);
- if ( gcov_get_info(op, &sys, p) < 0 )
+ if ( gcov_get_info(op, &sys, HYPERCALL_BUFFER(p)) < 0 )
err(1, "getting coverage information");
/* write to a file */
@@ -94,6 +89,7 @@ static void gcov_read(const char *fn, int reset)
err(1, "writing coverage to file");
if (f != stdout)
fclose(f);
+ xc_hypercall_buffer_free(gcov_xch, p);
}
static void gcov_reset(void)
--
1.7.10.4
On Wed, 2013-06-12 at 10:21 +0100, Ian Campbell wrote:
> On Tue, 2013-06-11 at 14:46 +0100, Frediano Ziglio wrote:
> > Subject: [PATCH] gcov: Do not use mmap directly but use
> > xc_hypercall_buffer_alloc
> >
> > xencov.c did not compile on NetBSD so use xc_hypercall_buffer which is
> > more portable.
> >
> > Signed-off-by: Frediano Ziglio <frediano.ziglio@xxxxxxxxxx>
> > ---
> > tools/misc/xencov.c | 19 +++++++------------
> > 1 file changed, 7 insertions(+), 12 deletions(-)
> >
> > Here you are. It get tested on a x64 machine, if somebody could test it
> > with a NetBSD would be great.
> >
> > diff --git a/tools/misc/xencov.c b/tools/misc/xencov.c
> > index 6645a30..e38d473 100644
> > --- a/tools/misc/xencov.c
> > +++ b/tools/misc/xencov.c
> > @@ -24,7 +24,6 @@
> > #include <unistd.h>
> > #include <errno.h>
> > #include <err.h>
> > -#include <sys/mman.h>
> >
> > static xc_interface *gcov_xch = NULL;
> >
> > @@ -35,7 +34,7 @@ static void gcov_init(void)
> > err(1, "opening interface");
> > }
> >
> > -int gcov_get_info(int op, struct xen_sysctl *sys, void *ptr)
> > +int gcov_get_info(int op, struct xen_sysctl *sys, uint8_t *ptr)
> > {
> > struct xen_sysctl_coverage_op *cov;
> >
> > @@ -44,7 +43,7 @@ int gcov_get_info(int op, struct xen_sysctl *sys, void
> > *ptr)
> >
> > cov = &sys->u.coverage_op;
> > cov->cmd = op;
> > - cov->u.raw_info.p = ptr;
> > + set_xen_guest_handle_raw(cov->u.raw_info, ptr);
>
> This isn't right I'm afraid. Your "void *ptr" here should become "struct
> xc_hypercall_buffer *ptr" and you should use
> DECLARE_HYPERCALL_BUFFER_ARGUMENT(ptr) in the body of the function and
> then drop the _raw from the set.
>
> The caller of this function then needs to pass HYPERCALL_BUFFER(name) to
> the function (where it looks like name == p in this case).
>
> xc_perfc_query() and its callers are an example of this pattern.
> Likewise xc_lockprof_query().
>
> >
> > return xc_sysctl(gcov_xch, sys);
> > }
> > @@ -52,10 +51,8 @@ int gcov_get_info(int op, struct xen_sysctl *sys, void
> > *ptr)
> > static void gcov_read(const char *fn, int reset)
> > {
> > struct xen_sysctl sys;
> > - unsigned page_size = sysconf(_SC_PAGESIZE);
> > uint32_t total_len;
> > - uint8_t *p;
> > - size_t size;
> > + DECLARE_HYPERCALL_BUFFER(uint8_t, p);
> > FILE *f;
> > int op = reset ? XEN_SYSCTL_COVERAGE_read_and_reset :
> > XEN_SYSCTL_COVERAGE_read;
> > @@ -71,12 +68,9 @@ static void gcov_read(const char *fn, int reset)
> > errx(1, "coverage size too big %u bytes\n", total_len);
> >
> > /* allocate */
> > - size = total_len + page_size;
> > - size -= (size % page_size);
> > - p = mmap(0, size, PROT_WRITE|PROT_READ,
> > - MAP_PRIVATE|MAP_ANON|MAP_LOCKED, -1, 0);
> > - if ( p == (uint8_t *) -1 )
> > - err(1, "mapping memory for coverage");
> > + p = xc_hypercall_buffer_alloc(gcov_xch, p, total_len);
> > + if ( p == NULL )
> > + err(1, "allocating memory for coverage");
> >
> > /* get data */
> > memset(p, 0, total_len);
> > @@ -94,6 +88,7 @@ static void gcov_read(const char *fn, int reset)
> > err(1, "writing coverage to file");
> > if (f != stdout)
> > fclose(f);
> > + xc_hypercall_buffer_free(gcov_xch, p);
> > }
> >
> > static void gcov_reset(void)
>
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |