CDP, one COS will corespond two CBMs other than one with CAT, due to the
sum of CBMs is fixed, that means actual `cos_max` in use will automatically
reduce to half when CDP is enabled.
+
+### pv-linear-pt
+> `= <boolean>`
+
+> Default: `true`
+
+Only available if Xen is compiled with CONFIG\_PV\_LINEAR\_PT support
+enabled.
+
+Allow PV guests to have pagetable entries pointing to other pagetables
+of the same level (i.e., allowing L2 PTEs to point to other L2 pages).
+This technique is often called "linear pagetables", and is sometimes
+used to allow operating systems a simple way to consistently map the
+current process's pagetables into its own virtual address space.
+
+Linux and MiniOS don't use this technique. NetBSD and Novell Netware
+do; there may be other custom operating systems which do. If you're
+certain you don't plan on having PV guests which use this feature,
+turning it off can reduce the attack surface.
### rcu-idle-timer-period-ms
> `= <integer>`
config PV
def_bool y
+config PV_LINEAR_PT
+ bool "Support for PV linear pagetables"
+ depends on PV
+ default y
+ ---help---
+ Linear pagetables (also called "recursive pagetables") refers
+ to the practice of a guest operating system having pagetable
+ entries pointing to other pagetables of the same level (i.e.,
+ allowing L2 PTEs to point to other L2 pages). Some operating
+ systems use it as a simple way to consistently map the current
+ process's pagetables into its own virtual address space.
+
+ Linux and MiniOS don't use this technique. NetBSD and Novell
+ Netware do; there may be other custom operating systems which
+ do. If you're certain you don't plan on having PV guests
+ which use this feature, turning it off can reduce the attack
+ surface.
+
+ If unsure, say Y.
+
config HVM
def_bool y
put_page(page);
}
+#ifdef CONFIG_PV_LINEAR_PT
+
static bool inc_linear_entries(struct page_info *pg)
{
typeof(pg->linear_pt_count) nc = read_atomic(&pg->linear_pt_count), oc;
* frame if it is mapped by a different root table. This is sufficient and
* also necessary to allow validation of a root table mapping itself.
*/
+static bool __read_mostly opt_pv_linear_pt = true;
+boolean_param("pv-linear-pt", opt_pv_linear_pt);
+
#define define_get_linear_pagetable(level) \
static int \
get_##level##_linear_pagetable( \
struct page_info *page; \
unsigned long pfn; \
\
+ if ( !opt_pv_linear_pt ) \
+ { \
+ gdprintk(XENLOG_WARNING, \
+ "Attempt to create linear p.t. (feature disabled)\n"); \
+ return 0; \
+ } \
+ \
if ( (level##e_get_flags(pde) & _PAGE_RW) ) \
{ \
gdprintk(XENLOG_WARNING, \
return 1; \
}
+#else /* CONFIG_PV_LINEAR_PT */
+
+#define define_get_linear_pagetable(level) \
+static int \
+get_##level##_linear_pagetable( \
+ level##_pgentry_t pde, unsigned long pde_pfn, struct domain *d) \
+{ \
+ return 0; \
+}
+
+static void dec_linear_uses(struct page_info *pg)
+{
+ ASSERT(pg->linear_pt_count == 0);
+}
+
+static void dec_linear_entries(struct page_info *pg)
+{
+ ASSERT(pg->linear_pt_count == 0);
+}
+
+#endif /* CONFIG_PV_LINEAR_PT */
bool is_iomem_page(mfn_t mfn)
{
break;
}
+#ifdef CONFIG_PV_LINEAR_PT
if ( ptpg && PGT_type_equal(x, ptpg->u.inuse.type_info) )
{
/*
ASSERT(ptpg->linear_pt_count > 0);
ptpg = NULL;
}
+#else /* CONFIG_PV_LINEAR_PT */
+ BUG_ON(ptpg && PGT_type_equal(x, ptpg->u.inuse.type_info));
+#endif
set_tlbflush_timestamp(page);
}