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
|