|
|
|
|
|
|
|
|
|
|
xen-devel
[Xen-devel] getting a 32-bit mfn from a 32-on-64 HVM guest
I'm working on getting tmem working for HVM guests
(on top of Stefano's PV on HVM patch). I've discovered
that the guest mfn passed in for some tmem operations
from a 32-bit HVM guest is getting interpreted in
the following function as a 64-bit mfn, and the
upper bits are confusing the translation to a Xen mfn.
What is the "proper" way to ensure that the cmfn
is properly truncated for a 32-bit HVM guest
without truncating it for a 64-bit guest? I
have used is_pv_32on64_vcpu()... is there an equivalent
for HVM? Or do I need to do something entirely different?
Thanks,
Dan
/* from xen/common/tmem_xen.c */
static inline void *cli_mfn_to_va(tmem_cli_mfn_t cmfn,
unsigned long *pcli_mfn)
{
unsigned long cli_mfn;
p2m_type_t t;
cli_mfn = mfn_x(gfn_to_mfn(current->domain, cmfn, &t));
if (t != p2m_ram_rw)
return NULL;
if (pcli_mfn != NULL)
*pcli_mfn = cli_mfn;
return map_domain_page(cli_mfn);
}
/* following from include/public/tmem.h, look for cmfn */
typedef xen_pfn_t tmem_cli_mfn_t;
typedef XEN_GUEST_HANDLE(char) tmem_cli_va_t;
struct tmem_op {
uint32_t cmd;
int32_t pool_id;
union {
struct {
uint64_t uuid[2];
uint32_t flags;
uint32_t arg1;
} new; /* for cmd == TMEM_NEW_POOL, TMEM_AUTH, TMEM_RESTORE_NEW */
struct {
uint32_t subop;
uint32_t cli_id;
uint32_t arg1;
uint32_t arg2;
uint64_t arg3;
tmem_cli_va_t buf;
} ctrl; /* for cmd == TMEM_CONTROL */
struct {
uint64_t object;
uint32_t index;
uint32_t tmem_offset;
uint32_t pfn_offset;
uint32_t len;
tmem_cli_mfn_t cmfn; /* client machine page frame */
} gen; /* for all other cmd ("generic") */
} u;
};
typedef struct tmem_op tmem_op_t;
DEFINE_XEN_GUEST_HANDLE(tmem_op_t);
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|
<Prev in Thread] |
Current Thread |
[Next in Thread>
|
- [Xen-devel] getting a 32-bit mfn from a 32-on-64 HVM guest,
Dan Magenheimer <=
|
|
|
|
|