]> xenbits.xensource.com Git - people/royger/xen.git/commitdiff
x86/HVM: fix setting mem access to default
authorJan Beulich <JBeulich@suse.com>
Wed, 2 Apr 2014 08:09:33 +0000 (09:09 +0100)
committerTim Deegan <tim@xen.org>
Thu, 3 Apr 2014 09:48:48 +0000 (10:48 +0100)
commit 3b0bcb89 ("x86/mm/p2m: Move p2m code in HVMOP_[gs]et_mem_access
into p2m.c") introduced an off-by-one mistake forcing an input of
HVMMEM_access_default to always fail. Since related, also eliminate the
inefficient setup of an on-stack array for each function invocation.

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Tim Deegan <tim@xen.org>
xen/arch/x86/mm/p2m.c

index fcc3ed68d516c11d0dd59e059a47c6e99739bc6c..c38f334a88dd1d805cfd9406e3db3ca0463625ea 100644 (file)
@@ -1358,25 +1358,32 @@ long p2m_set_mem_access(struct domain *d, unsigned long pfn, uint32_t nr,
     mfn_t mfn;
     long rc = 0;
 
-    /* N.B. _not_ static: initializer depends on p2m->default_access */
-    p2m_access_t memaccess[] = {
-        p2m_access_n,
-        p2m_access_r,
-        p2m_access_w,
-        p2m_access_rw,
-        p2m_access_x,
-        p2m_access_rx,
-        p2m_access_wx,
-        p2m_access_rwx,
-        p2m_access_rx2rw,
-        p2m_access_n2rwx,
-        p2m->default_access,
+    static const p2m_access_t memaccess[] = {
+#define ACCESS(ac) [HVMMEM_access_##ac] = p2m_access_##ac
+        ACCESS(n),
+        ACCESS(r),
+        ACCESS(w),
+        ACCESS(rw),
+        ACCESS(x),
+        ACCESS(rx),
+        ACCESS(wx),
+        ACCESS(rwx),
+        ACCESS(rx2rw),
+        ACCESS(n2rwx),
+#undef ACCESS
     };
 
-    if ( (unsigned) access >= HVMMEM_access_default )
+    switch ( access )
+    {
+    case 0 ... ARRAY_SIZE(memaccess) - 1:
+        a = memaccess[access];
+        break;
+    case HVMMEM_access_default:
+        a = p2m->default_access;
+        break;
+    default:
         return -EINVAL;
-
-    a = memaccess[access];
+    }
 
     /* If request to set default access */
     if ( pfn == ~0ul )