[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen master] libelf: allow having HYPERCALL_PAGE entry before VIRT_BASE in __xen_guest section



commit f2613bd7f203a79abde270d9fa54b4add8dd911b
Author:     Gregory Herrero <gregory.herrero@xxxxxxxxxx>
AuthorDate: Mon Dec 4 11:01:48 2017 +0100
Commit:     Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Mon Dec 4 11:01:48 2017 +0100

    libelf: allow having HYPERCALL_PAGE entry before VIRT_BASE in __xen_guest 
section
    
    When filling __xen_guest section of a guest, user may define
    HYPERCALL_PAGE earlier than VIRT_BASE in the section leading to an
    incorrect hypercall page address since an undefined virt_base could be
    used to compute hypercall page address.
    If there is no VIRT_BASE entry in __xen_guest section, default value of
    0 is used for virt_base. Thus, setting hypercall page address to
    HYPERCALL_PAGE value is correct in this case too.
    
    Signed-off-by: Gregory Herrero <gregory.herrero@xxxxxxxxxx>
    Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>
---
 xen/common/libelf/libelf-dominfo.c | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/xen/common/libelf/libelf-dominfo.c 
b/xen/common/libelf/libelf-dominfo.c
index a52900c..829d517 100644
--- a/xen/common/libelf/libelf-dominfo.c
+++ b/xen/common/libelf/libelf-dominfo.c
@@ -269,6 +269,7 @@ elf_errorstatus elf_xen_parse_guest_info(struct elf_binary 
*elf,
     elf_ptrval h;
     unsigned char name[32], value[128];
     unsigned len;
+    elf_errorstatus ret = 0;
 
     h = parms->guest_info;
 #define STAR(h) (elf_access_unsigned(elf, (h), 0, 1))
@@ -336,16 +337,23 @@ elf_errorstatus elf_xen_parse_guest_info(struct 
elf_binary *elf,
         if ( !strcmp(name, "ELF_PADDR_OFFSET") )
             parms->elf_paddr_offset = strtoull(value, NULL, 0);
         if ( !strcmp(name, "HYPERCALL_PAGE") )
-            parms->virt_hypercall = (strtoull(value, NULL, 0) << 12) +
-                parms->virt_base;
+            parms->virt_hypercall = strtoull(value, NULL, 0) << 12;
 
         /* other */
         if ( !strcmp(name, "FEATURES") )
             if ( elf_xen_parse_features(value, parms->f_supported,
                                         parms->f_required) )
-                return -1;
+            {
+                ret = -1;
+                break;
+            }
     }
-    return 0;
+
+    if ( (parms->virt_base != UNSET_ADDR) &&
+         (parms->virt_hypercall != UNSET_ADDR) )
+        parms->virt_hypercall += parms->virt_base;
+
+    return ret;
 }
 
 /* ------------------------------------------------------------------------ */
--
generated by git-patchbot for /home/xen/git/xen.git#master

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/xen-changelog

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.