zero_page[PAGE_SIZE];
+#ifdef CONFIG_PV
static int alloc_segdesc_page(struct page_info *page)
{
const struct domain *owner = page_get_owner(page);
return i == 512 ? 0 : -EINVAL;
}
+#endif
static int _get_page_type(struct page_info *page, unsigned long type,
bool preemptible);
-static int get_page_and_type_from_mfn(
- mfn_t mfn, unsigned long type, struct domain *d,
- int partial, int preemptible)
-{
- struct page_info *page = mfn_to_page(mfn);
- int rc;
-
- if ( likely(partial >= 0) &&
- unlikely(!get_page_from_mfn(mfn, d)) )
- return -EINVAL;
-
- rc = _get_page_type(page, type, preemptible);
-
- if ( unlikely(rc) && partial >= 0 &&
- (!preemptible || page != current->arch.old_guest_table) )
- put_page(page);
-
- return rc;
-}
-
-static void put_data_page(struct page_info *page, bool writeable)
-{
- if ( writeable )
- put_page_and_type(page);
- else
- put_page(page);
-}
-
#ifdef CONFIG_PV_LINEAR_PT
static bool inc_linear_entries(struct page_info *pg)
return -EBUSY;
}
+#ifdef CONFIG_PV
+static int get_page_and_type_from_mfn(
+ mfn_t mfn, unsigned long type, struct domain *d,
+ int partial, int preemptible)
+{
+ struct page_info *page = mfn_to_page(mfn);
+ int rc;
+
+ if ( likely(partial >= 0) &&
+ unlikely(!get_page_from_mfn(mfn, d)) )
+ return -EINVAL;
+
+ rc = _get_page_type(page, type, preemptible);
+
+ if ( unlikely(rc) && partial >= 0 &&
+ (!preemptible || page != current->arch.old_guest_table) )
+ put_page(page);
+
+ return rc;
+}
+
define_get_linear_pagetable(l2);
static int
get_page_from_l2e(
return rc;
}
+#endif /* CONFIG_PV */
static int _put_page_type(struct page_info *page, bool preemptible,
struct page_info *ptpg);
}
}
+#ifdef CONFIG_PV
+static void put_data_page(struct page_info *page, bool writeable)
+{
+ if ( writeable )
+ put_page_and_type(page);
+ else
+ put_page(page);
+}
/*
* NB. Virtual address 'l2e' maps to a machine address within frame 'pfn'.
l2_table_offset(HIRO_COMPAT_MPT_VIRT_START)],
COMPAT_L2_PAGETABLE_XEN_SLOTS(d) * sizeof(*l2t));
}
+#endif /* CONFIG_PV */
/*
* Fill an L4 with Xen entries.
unmap_domain_page(l4tab);
}
+#ifdef CONFIG_PV
static int alloc_l4_table(struct page_info *page)
{
struct domain *d = page_get_owner(page);
return rc;
}
+#endif /* CONFIG_PV */
#ifndef NDEBUG
/*
current_locked_page_set(NULL);
}
+#ifdef CONFIG_PV
/*
* PTE flags that a guest may change without re-validating the PTE.
* All other bits affect translation, caching, or Xen's safety.
put_page_from_l4e(ol4e, pfn, 0, 1);
return rc;
}
+#endif /* CONFIG_PV */
static int cleanup_page_cacheattr(struct page_info *page)
{
static int alloc_page_type(struct page_info *page, unsigned long type,
int preemptible)
{
+#ifdef CONFIG_PV
struct domain *owner = page_get_owner(page);
int rc;
}
return rc;
+#else
+ ASSERT_UNREACHABLE();
+ return -EINVAL;
+#endif
}
int free_page_type(struct page_info *page, unsigned long type,
int preemptible)
{
+#ifdef CONFIG_PV
struct domain *owner = page_get_owner(page);
unsigned long gmfn;
int rc;
}
return rc;
+#else
+ ASSERT_UNREACHABLE();
+ return -EINVAL;
+#endif
}
int new_guest_cr3(mfn_t mfn)
{
+#ifdef CONFIG_PV
struct vcpu *curr = current;
struct domain *d = curr->domain;
int rc;
}
return rc;
-}
-
-static struct domain *get_pg_owner(domid_t domid)
-{
- struct domain *pg_owner = NULL, *curr = current->domain;
-
- if ( likely(domid == DOMID_SELF) )
- {
- pg_owner = rcu_lock_current_domain();
- goto out;
- }
-
- if ( unlikely(domid == curr->domain_id) )
- {
- gdprintk(XENLOG_WARNING, "Cannot specify itself as foreign domain\n");
- goto out;
- }
-
- switch ( domid )
- {
- case DOMID_IO:
- pg_owner = rcu_lock_domain(dom_io);
- break;
- case DOMID_XEN:
- pg_owner = rcu_lock_domain(dom_xen);
- break;
- default:
- if ( (pg_owner = rcu_lock_domain_by_id(domid)) == NULL )
- {
- gdprintk(XENLOG_WARNING, "Unknown domain d%d\n", domid);
- break;
- }
- break;
- }
-
- out:
- return pg_owner;
-}
-
-static void put_pg_owner(struct domain *pg_owner)
-{
- rcu_unlock_domain(pg_owner);
+#else
+ ASSERT_UNREACHABLE();
+ return -EINVAL;
+#endif
}
static inline int vcpumask_to_pcpumask(
}
}
+#ifdef CONFIG_PV
+static struct domain *get_pg_owner(domid_t domid)
+{
+ struct domain *pg_owner = NULL, *curr = current->domain;
+
+ if ( likely(domid == DOMID_SELF) )
+ {
+ pg_owner = rcu_lock_current_domain();
+ goto out;
+ }
+
+ if ( unlikely(domid == curr->domain_id) )
+ {
+ gdprintk(XENLOG_WARNING, "Cannot specify itself as foreign domain\n");
+ goto out;
+ }
+
+ switch ( domid )
+ {
+ case DOMID_IO:
+ pg_owner = rcu_lock_domain(dom_io);
+ break;
+ case DOMID_XEN:
+ pg_owner = rcu_lock_domain(dom_xen);
+ break;
+ default:
+ if ( (pg_owner = rcu_lock_domain_by_id(domid)) == NULL )
+ {
+ gdprintk(XENLOG_WARNING, "Unknown domain d%d\n", domid);
+ break;
+ }
+ break;
+ }
+
+ out:
+ return pg_owner;
+}
+
+static void put_pg_owner(struct domain *pg_owner)
+{
+ rcu_unlock_domain(pg_owner);
+}
+
long do_mmuext_op(
XEN_GUEST_HANDLE_PARAM(mmuext_op_t) uops,
unsigned int count,
return rc;
}
+#endif /* CONFIG_PV */
int donate_page(
struct domain *d, struct page_info *page, unsigned int memflags)
return -EINVAL;
}
+#ifdef CONFIG_PV
static int __do_update_va_mapping(
unsigned long va, u64 val64, unsigned long flags, struct domain *pg_owner)
{
return rc;
}
+#endif /* CONFIG_PV */
typedef struct e820entry e820entry_t;
DEFINE_XEN_GUEST_HANDLE(e820entry_t);