WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

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

To: xen-devel <xen-devel@xxxxxxxxxxxxxxxxxxx>
Subject: [Xen-devel] Can I use xc_map_foreign_range() on a paused domain?
From: Randy Thelen <rthelen@xxxxxxxxxx>
Date: Tue, 24 Oct 2006 11:33:20 -0700
Delivery-date: Tue, 24 Oct 2006 11:34:13 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
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

<Prev in Thread] Current Thread [Next in Thread>