diff mbox series

[v2,11/11] TESTING XTF

Message ID 20200922182444.12350-12-andrew.cooper3@citrix.com (mailing list archive)
State New, archived
Headers show
Series Multiple fixes to XENMEM_acquire_resource | expand

Commit Message

Andrew Cooper Sept. 22, 2020, 6:24 p.m. UTC
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(-)
diff mbox series

Patch

diff --git a/xen/common/memory.c b/xen/common/memory.c
index ec276cb9b1..15a8ed253e 100644
--- a/xen/common/memory.c
+++ b/xen/common/memory.c
@@ -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",