|
@@ -122,29 +122,6 @@ struct gnttab_ops {
|
|
|
* by bit operations.
|
|
|
*/
|
|
|
int (*query_foreign_access)(grant_ref_t ref);
|
|
|
- /*
|
|
|
- * Grant a domain to access a range of bytes within the page referred by
|
|
|
- * an available grant entry. Ref parameter is reference of a grant entry
|
|
|
- * which will be sub-page accessed, domid is id of grantee domain, frame
|
|
|
- * is frame address of subpage grant, flags is grant type and flag
|
|
|
- * information, page_off is offset of the range of bytes, and length is
|
|
|
- * length of bytes to be accessed.
|
|
|
- */
|
|
|
- void (*update_subpage_entry)(grant_ref_t ref, domid_t domid,
|
|
|
- unsigned long frame, int flags,
|
|
|
- unsigned page_off, unsigned length);
|
|
|
- /*
|
|
|
- * Redirect an available grant entry on domain A to another grant
|
|
|
- * reference of domain B, then allow domain C to use grant reference
|
|
|
- * of domain B transitively. Ref parameter is an available grant entry
|
|
|
- * reference on domain A, domid is id of domain C which accesses grant
|
|
|
- * entry transitively, flags is grant type and flag information,
|
|
|
- * trans_domid is id of domain B whose grant entry is finally accessed
|
|
|
- * transitively, trans_gref is grant entry transitive reference of
|
|
|
- * domain B.
|
|
|
- */
|
|
|
- void (*update_trans_entry)(grant_ref_t ref, domid_t domid, int flags,
|
|
|
- domid_t trans_domid, grant_ref_t trans_gref);
|
|
|
};
|
|
|
|
|
|
struct unmap_refs_callback_data {
|
|
@@ -292,122 +269,6 @@ int gnttab_grant_foreign_access(domid_t domid, unsigned long frame,
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(gnttab_grant_foreign_access);
|
|
|
|
|
|
-static void gnttab_update_subpage_entry_v2(grant_ref_t ref, domid_t domid,
|
|
|
- unsigned long frame, int flags,
|
|
|
- unsigned page_off, unsigned length)
|
|
|
-{
|
|
|
- gnttab_shared.v2[ref].sub_page.frame = frame;
|
|
|
- gnttab_shared.v2[ref].sub_page.page_off = page_off;
|
|
|
- gnttab_shared.v2[ref].sub_page.length = length;
|
|
|
- gnttab_shared.v2[ref].hdr.domid = domid;
|
|
|
- wmb();
|
|
|
- gnttab_shared.v2[ref].hdr.flags =
|
|
|
- GTF_permit_access | GTF_sub_page | flags;
|
|
|
-}
|
|
|
-
|
|
|
-int gnttab_grant_foreign_access_subpage_ref(grant_ref_t ref, domid_t domid,
|
|
|
- unsigned long frame, int flags,
|
|
|
- unsigned page_off,
|
|
|
- unsigned length)
|
|
|
-{
|
|
|
- if (flags & (GTF_accept_transfer | GTF_reading |
|
|
|
- GTF_writing | GTF_transitive))
|
|
|
- return -EPERM;
|
|
|
-
|
|
|
- if (gnttab_interface->update_subpage_entry == NULL)
|
|
|
- return -ENOSYS;
|
|
|
-
|
|
|
- gnttab_interface->update_subpage_entry(ref, domid, frame, flags,
|
|
|
- page_off, length);
|
|
|
-
|
|
|
- return 0;
|
|
|
-}
|
|
|
-EXPORT_SYMBOL_GPL(gnttab_grant_foreign_access_subpage_ref);
|
|
|
-
|
|
|
-int gnttab_grant_foreign_access_subpage(domid_t domid, unsigned long frame,
|
|
|
- int flags, unsigned page_off,
|
|
|
- unsigned length)
|
|
|
-{
|
|
|
- int ref, rc;
|
|
|
-
|
|
|
- ref = get_free_entries(1);
|
|
|
- if (unlikely(ref < 0))
|
|
|
- return -ENOSPC;
|
|
|
-
|
|
|
- rc = gnttab_grant_foreign_access_subpage_ref(ref, domid, frame, flags,
|
|
|
- page_off, length);
|
|
|
- if (rc < 0) {
|
|
|
- put_free_entry(ref);
|
|
|
- return rc;
|
|
|
- }
|
|
|
-
|
|
|
- return ref;
|
|
|
-}
|
|
|
-EXPORT_SYMBOL_GPL(gnttab_grant_foreign_access_subpage);
|
|
|
-
|
|
|
-bool gnttab_subpage_grants_available(void)
|
|
|
-{
|
|
|
- return gnttab_interface->update_subpage_entry != NULL;
|
|
|
-}
|
|
|
-EXPORT_SYMBOL_GPL(gnttab_subpage_grants_available);
|
|
|
-
|
|
|
-static void gnttab_update_trans_entry_v2(grant_ref_t ref, domid_t domid,
|
|
|
- int flags, domid_t trans_domid,
|
|
|
- grant_ref_t trans_gref)
|
|
|
-{
|
|
|
- gnttab_shared.v2[ref].transitive.trans_domid = trans_domid;
|
|
|
- gnttab_shared.v2[ref].transitive.gref = trans_gref;
|
|
|
- gnttab_shared.v2[ref].hdr.domid = domid;
|
|
|
- wmb();
|
|
|
- gnttab_shared.v2[ref].hdr.flags =
|
|
|
- GTF_permit_access | GTF_transitive | flags;
|
|
|
-}
|
|
|
-
|
|
|
-int gnttab_grant_foreign_access_trans_ref(grant_ref_t ref, domid_t domid,
|
|
|
- int flags, domid_t trans_domid,
|
|
|
- grant_ref_t trans_gref)
|
|
|
-{
|
|
|
- if (flags & (GTF_accept_transfer | GTF_reading |
|
|
|
- GTF_writing | GTF_sub_page))
|
|
|
- return -EPERM;
|
|
|
-
|
|
|
- if (gnttab_interface->update_trans_entry == NULL)
|
|
|
- return -ENOSYS;
|
|
|
-
|
|
|
- gnttab_interface->update_trans_entry(ref, domid, flags, trans_domid,
|
|
|
- trans_gref);
|
|
|
-
|
|
|
- return 0;
|
|
|
-}
|
|
|
-EXPORT_SYMBOL_GPL(gnttab_grant_foreign_access_trans_ref);
|
|
|
-
|
|
|
-int gnttab_grant_foreign_access_trans(domid_t domid, int flags,
|
|
|
- domid_t trans_domid,
|
|
|
- grant_ref_t trans_gref)
|
|
|
-{
|
|
|
- int ref, rc;
|
|
|
-
|
|
|
- ref = get_free_entries(1);
|
|
|
- if (unlikely(ref < 0))
|
|
|
- return -ENOSPC;
|
|
|
-
|
|
|
- rc = gnttab_grant_foreign_access_trans_ref(ref, domid, flags,
|
|
|
- trans_domid, trans_gref);
|
|
|
- if (rc < 0) {
|
|
|
- put_free_entry(ref);
|
|
|
- return rc;
|
|
|
- }
|
|
|
-
|
|
|
- return ref;
|
|
|
-}
|
|
|
-EXPORT_SYMBOL_GPL(gnttab_grant_foreign_access_trans);
|
|
|
-
|
|
|
-bool gnttab_trans_grants_available(void)
|
|
|
-{
|
|
|
- return gnttab_interface->update_trans_entry != NULL;
|
|
|
-}
|
|
|
-EXPORT_SYMBOL_GPL(gnttab_trans_grants_available);
|
|
|
-
|
|
|
static int gnttab_query_foreign_access_v1(grant_ref_t ref)
|
|
|
{
|
|
|
return gnttab_shared.v1[ref].flags & (GTF_reading|GTF_writing);
|
|
@@ -1296,8 +1157,6 @@ static const struct gnttab_ops gnttab_v2_ops = {
|
|
|
.end_foreign_access_ref = gnttab_end_foreign_access_ref_v2,
|
|
|
.end_foreign_transfer_ref = gnttab_end_foreign_transfer_ref_v2,
|
|
|
.query_foreign_access = gnttab_query_foreign_access_v2,
|
|
|
- .update_subpage_entry = gnttab_update_subpage_entry_v2,
|
|
|
- .update_trans_entry = gnttab_update_trans_entry_v2,
|
|
|
};
|
|
|
|
|
|
static void gnttab_request_version(void)
|
|
@@ -1313,15 +1172,6 @@ static void gnttab_request_version(void)
|
|
|
grefs_per_grant_frame = XEN_PAGE_SIZE /
|
|
|
sizeof(union grant_entry_v2);
|
|
|
gnttab_interface = &gnttab_v2_ops;
|
|
|
- } else if (grant_table_version == 2) {
|
|
|
- /*
|
|
|
- * If we've already used version 2 features,
|
|
|
- * but then suddenly discover that they're not
|
|
|
- * available (e.g. migrating to an older
|
|
|
- * version of Xen), almost unbounded badness
|
|
|
- * can happen.
|
|
|
- */
|
|
|
- panic("we need grant tables version 2, but only version 1 is available");
|
|
|
} else {
|
|
|
grant_table_version = 1;
|
|
|
grefs_per_grant_frame = XEN_PAGE_SIZE /
|