[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] Can I use xc_map_foreign_range() on a paused domain?


  • To: xen-devel <xen-devel@xxxxxxxxxxxxxxxxxxx>
  • From: Randy Thelen <rthelen@xxxxxxxxxx>
  • Date: Tue, 24 Oct 2006 11:33:20 -0700
  • Delivery-date: Tue, 24 Oct 2006 11:34:13 -0700
  • List-id: Xen developer discussion <xen-devel.lists.xensource.com>

Folks --

I've written a pretty simple program to peer into a guest domain and I'm getting an error. I'm wondering what the explanation is and I'm hoping one of you can help. Here's my program which I wrote in xen- unstable/tools/libxc/ as test.c and linked against the libxenctrl.a:

# cat test.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>

#include "xenctrl.h"

int main(int argc, char **argv)
{
    int xc_handle, dom_id, mfn;
    unsigned char *p;

    if (argc != 3) {
fprintf(stderr, "USAGE: %s <dom-id> <mfn-within-dom>\n", argv [0]);
        exit(-1);
    }

    dom_id = strtol(argv[1], NULL, 0);
    mfn = strtol(argv[2], NULL, 0);

    xc_handle = xc_interface_open();

p = xc_map_foreign_range(xc_handle, dom_id, 4096, PROT_READ| PROT_WRITE, mfn);

printf("handle = %d, dom_id = %d, mfn == %#x, p == %p\n", xc_handle, dom_id, mfn, p);

    if (p) {
        munmap(p, 4096);
    }

    xc_interface_close(xc_handle);

    return 0;
}


/*
 * Local variables:
 * mode: C
 * c-set-style: "BSD"
 * c-basic-offset: 4
 * tab-width: 4
 * indent-tabs-mode: nil
 * End:
 */

Here's my modification to Makefile to build it:

# hg diff Makefile
diff -r 0dc4ae151be2 tools/libxc/Makefile
--- a/tools/libxc/Makefile      Thu Oct  5 08:30:07 2006
+++ b/tools/libxc/Makefile      Tue Oct 24 11:12:53 2006
@@ -41,7 +41,7 @@
# Define this to make it possible to run valgrind on code linked with these
# libraries.
-#CFLAGS   += -DVALGRIND -O0 -ggdb3
+CFLAGS   += -DVALGRIND -O0 -ggdb3
# Get gcc to generate the dependencies for us.
CFLAGS   += -Wp,-MD,.$(@F).d
@@ -112,6 +112,13 @@
        mv staging/i386/*.rpm .
        rm -rf staging
+test: libxenctrl.a test.o
+       $(CC) $(CFLAGS) $(LDFLAGS) -lxenctrl -o $@ $^
+
# libxenctrl
libxenctrl.a: $(CTRL_LIB_OBJS)

So, make works like expected:

# make test
gcc -O1 -fno-omit-frame-pointer -g -m32 -march=i686 -Wall -Wstrict- prototypes -Wdeclaration-after-statement -D__XEN_TOOLS__ -Werror - fno-strict-aliasing -I. -DVALGRIND -O0 -ggdb3 -Wp,-MD,.test.o.d -c - o test.o test.c gcc -O1 -fno-omit-frame-pointer -g -m32 -march=i686 -Wall -Wstrict- prototypes -Wdeclaration-after-statement -D__XEN_TOOLS__ -Werror - fno-strict-aliasing -I. -DVALGRIND -O0 -ggdb3 -Wp,-MD,.test.d -L. - lxenctrl -o test libxenctrl.a test.o
#

And, last, here's my output with an mfn (which I believe the interface takes as input):

# ./test 3 0xd1756
handle = 3, dom_id = 3, mfn == 0xd1756, p == (nil)
#

For good measure, I tried with pfn:

# ./test 3 0x3ae
handle = 3, dom_id = 3, mfn == 0x3ae, p == (nil)
#

To show that my dom is 3:

# xm list
Name ID Mem(MiB) VCPUs State Time(s) Domain-0 0 694 1 r----- 270.4 rthelen-bsd 3 1200 1 -- p--- 0.0


I determined 0x3ae as being the machine frame page of a page in my domain by using the pt_base of my domain. Note that the link address of my domain is 0xC000.0000:

(gdb) p *xen_start_info
$1 = {magic = "xen-3.0-x86_32p", '\0' <repeats 16 times>, nr_pages = 307200, shared_info = 2310144, flags = 0, store_mfn = 857944, store_evtchn = 1, console_mfn = 857943, console_evtchn = 2, pt_base = 3225083904,
  nr_pt_frames = 9, mfn_list = 3223842816, mod_start = 0, mod_len = 0,
  cmd_line = " root=/dev/hda1 ro", '\0' <repeats 1005 times>}
(gdb) p/x xen_start_info->pt_base
$2 = 0xc03ae000
(gdb) p/x $2-0xc0000000
$3 = 0x3ae000
(gdb) p/x ((int *) xen_start_info->mfn_list)[$3>>12]
$4 = 0xd1756

So, 0xd1756 is the machine frame number for the physical page 0x3ae. Am I wrong in that basic understanding?

Any idea why I can't access the mfn of my guest domain using xc_map_foreign_range()?

-- Randy

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.