|
|
|
|
|
|
|
|
|
|
xen-devel
Re: [Xen-devel] xc_map_foreign_range usage
Hi Alex,
On Sun, Feb 24, 2008 at 10:22 AM, Alex V <allex.vong@xxxxxxxxx> wrote:
> It seemed pretty straightforward but in xenctrl.h it's stated that:
> --------------------------------------------
> In Linux, the ring queue for the control channel is accessible by
> mapping the shared_info_frame (from xc_domain_getinfo()) + 2048. The
> structure stored there is of type control_if_t.
> ---------------------------------------------
>
> which confuses me since I could not find info about this structure and
> therefore cast ret value to it.
I think this might be a spurious comment, as I cannot see anything
about this structure in the source of either Xen or PV Linux.
> All I need is basically just to have an access from dom0 to the buffer
> I allocated at domU. Could you tell me where I am able to see simple
> example which deals with that?
>
> Assume I already malloc'ed some buffer at domU and granted access to
> it (have a reference number - ref)
>
> Then in dom0 I map it using all info
>
> void* my_addr = xc_map_foreign_range(handle, dom_id, rw, ref);
>
> How can I change/read the buffer I granted access to dom0 previously?
> I casted it to unsigned long and got an address (I suppose) but
> casting it to (char*) and trying to print it out caused an segfault.
First of all some questions. Did you allocate the buffer in user-space
or kernel-space? Which guest operating system are you using? Did you
grant access to it using the Xen grant table mechanism?
xc_map_foreign_range() allows you to map the machine frame number
(essentially the real physical address) of a page of memory from
another domain into Dom0. Therefore, the last parameter in your call
should be a machine frame number, and not a grant reference.
However, a better way to do this would be to use the xc_gnttab_*
functions to map the page. These assume that you have created a grant
reference for your buffer in the guest domain. Then you can use the
code like this:
uint32_t domid = ...;
uint32_t ref = ...;
int xcg = xc_gnttab_open();
void *my_addr = xc_gnttab_map_grant_ref(xcg, dom_id, ref, PROT_READ |
PROT_WRITE);
Let me know if you have any further questions.
Regards,
Derek Murray.
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|
|
|
|
|