xen-unstable.hg.
return 0;
}
+static int map_pte_fn_status(pte_t *pte, struct page *pmd_page,
+ unsigned long addr, void *data)
+{
+ uint64_t **frames = (uint64_t **)data;
+
+ set_pte_at(&init_mm, addr, pte, mfn_pte((*frames)[0], PAGE_KERNEL));
+ (*frames)++;
+ return 0;
+}
+
static int unmap_pte_fn(pte_t *pte, struct page *pmd_page,
unsigned long addr, void *data)
{
return rc;
}
+int arch_gnttab_map_status(uint64_t *frames, unsigned long nr_frames,
+ unsigned long max_nr_frames, void **__shared)
+
+{
+ int rc;
+ void *shared = *__shared;
+
+ if (shared == NULL) {
+ struct vm_struct *area =
+ xen_alloc_vm_area(PAGE_SIZE * max_nr_frames);
+ BUG_ON(area == NULL);
+ shared = area->addr;
+ *__shared = shared;
+ }
+
+ rc = apply_to_page_range(&init_mm, (unsigned long)shared,
+ PAGE_SIZE * nr_frames,
+ map_pte_fn_status, &frames);
+ return rc;
+}
+
void arch_gnttab_unmap_shared(void *shared, unsigned long nr_frames)
{
apply_to_page_range(&init_mm, (unsigned long)shared,
struct gnttab_setup_table setup;
struct gnttab_get_status_frames getframes;
unsigned long *frames;
- unsigned long *sframes;
+ uint64_t *sframes;
unsigned int nr_gframes = end_idx + 1;
unsigned int nr_sframes = nr_status_frames(nr_gframes);
int rc;
if (grant_table_version > 1) {
getframes.dom = DOMID_SELF;
getframes.nr_frames = nr_sframes;
- set_xen_guest_handle(getframes.frame_list, sframes);
+ getframes.frame_list = (unsigned long)sframes;
rc = HYPERVISOR_grant_table_op(GNTTABOP_get_status_frames,
&getframes, 1);
BUG_ON(rc || getframes.status);
- rc = arch_gnttab_map_shared(sframes, nr_sframes,
+ rc = arch_gnttab_map_status(sframes, nr_sframes,
max_nr_grant_status_frames(),
(void **)&grstatus);
BUG_ON(rc);
int arch_gnttab_map_shared(unsigned long *frames, unsigned long nr_frames,
unsigned long max_nr_frames, void **__shared);
+int arch_gnttab_map_status(uint64_t *frames, unsigned long nr_frames,
+ unsigned long max_nr_frames, void **__shared);
void arch_gnttab_unmap_shared(void *shared, unsigned long nr_frames);
#define gnttab_map_vaddr(map) ((void *)(map.host_virt_addr))
#define GNTTABOP_get_status_frames 9
struct gnttab_get_status_frames {
/* IN parameters. */
- domid_t dom;
uint32_t nr_frames;
+ domid_t dom;
/* OUT parameters. */
int16_t status; /* GNTST_* */
- GUEST_HANDLE(ulong) frame_list;
+ uint64_t frame_list;
};
DEFINE_GUEST_HANDLE_STRUCT(gnttab_get_status_frames);