@@ -1022,11 +1022,33 @@ static unsigned int resource_max_frames(struct domain *d,
case XENMEM_resource_grant_table:
return gnttab_resource_max_frames(d, id);
+ case 2:
+ return 2900;
+
default:
return arch_resource_max_frames(d, type, id);
}
}
+static int _acquire_2(unsigned int id, unsigned long frame,
+ unsigned int nr_frames, xen_pfn_t mfn_list[])
+{
+ unsigned int i;
+
+ for ( i = 0; i < nr_frames; ++i )
+ {
+ mfn_list[i] = 0xdead0000 + frame + i;
+
+ /* Simulate some -ERESTARTs */
+ if ( i && ((frame + i) == 22 ||
+ (frame + i) == 37 ||
+ (frame + i) == 1040) )
+ break;
+ }
+
+ return i;
+}
+
/*
* Returns -errno on error, or positive in the range [1, nr_frames] on
* success. Returning less than nr_frames contitutes a request for a
@@ -1041,6 +1063,9 @@ static int _acquire_resource(
case XENMEM_resource_grant_table:
return gnttab_acquire_resource(d, id, frame, nr_frames, mfn_list);
+ case 2:
+ return _acquire_2(id, frame, nr_frames, mfn_list);
+
default:
return arch_acquire_resource(d, type, id, frame, nr_frames, mfn_list);
}
@@ -1151,6 +1176,18 @@ static int acquire_resource(
for ( i = 0; !rc && i < done; i++ )
{
+ /*
+ * For debug type 2, check that the marshalled-in frames are
+ * correct, rather than actually inserting them into the P2M.
+ */
+ if ( xmar.type == 2 )
+ {
+ if ( gfn_list[i] != mfn_list[i] )
+ panic("gfn %#lx != mfn %#lx, i %lu\n",
+ gfn_list[i], mfn_list[i], i + xmar.frame);
+ continue;
+ }
+
rc = set_foreign_p2m_entry(currd, gfn_list[i],
_mfn(mfn_list[i]));
/* rc should be -EIO for any iteration other than the first */
@@ -1172,7 +1209,7 @@ static int acquire_resource(
* still got work to do other work is pending.
*/
if ( done < todo ||
- (xmar.nr_frames && hypercall_preempt_check()) )
+ (0 && xmar.nr_frames && hypercall_preempt_check()) )
{
rc = hypercall_create_continuation(
__HYPERVISOR_memory_op, "lh",
Add an arbitrary "resource type 2" which uses "frames" of a fixed format so both Xen (for a PVH dom0) and XTF (for a PV dom0) can check the integrity of the marshalled buffer. Skip the hypercall preempt check to allow the compat PVH logic a chance to hit the 1020 limit in the XLAT buffer. Do not apply. Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com> --- xen/common/memory.c | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-)