Randy Thelen
2006-Oct-24  18:33 UTC
[Xen-devel] Can I use xc_map_foreign_range() on a paused domain?
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@lists.xensource.com
http://lists.xensource.com/xen-devel
Keir Fraser
2006-Oct-24  19:24 UTC
Re: [Xen-devel] Can I use xc_map_foreign_range() on a paused domain?
On 24/10/06 7:33 pm, "Randy Thelen" <rthelen@netapp.com> wrote:> 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:You specifically chose a page-table page. You cannot map that for write access, even in domain 0. If you try to map it read-only, the mapping should succeed. -- Keir _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Randy Thelen
2006-Oct-24  19:57 UTC
Re: [Xen-devel] Can I use xc_map_foreign_range() on a paused domain?
Keir Fraser wrote:> You specifically chose a page-table page. You cannot map that for > write > access, even in domain 0. If you try to map it read-only, the > mapping should > succeed.Excellent. Thank you. -- Randy _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel