x86/pv: Support do_set_segment_base() for compat guests
authorAndrew Cooper <andrew.cooper3@citrix.com>
Fri, 15 Jul 2016 13:12:01 +0000 (13:12 +0000)
committerAndrew Cooper <andrew.cooper3@citrix.com>
Tue, 6 Sep 2016 12:33:44 +0000 (13:33 +0100)
set_segment_base is the only hypercall exists in only one of the two modes
guests might run in; all other hypercalls are either implemented, or
unimplemented in both modes.

Remove this split, by allowing do_set_segment_base() to be called in the
compat hypercall path.  This change will simplify the verification logic in a
later change.

No behavioural change from a guests point of view.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Acked-by: Jan Beulich <JBeulich@suse.com>
xen/arch/x86/x86_64/compat/entry.S
xen/arch/x86/x86_64/mm.c

index e80c53cc714bf608d6f1ecacf0171d9989daeba0..1b6a482b9c35a5d0cace8ccfb8dee1143f33c55a 100644 (file)
@@ -456,7 +456,7 @@ ENTRY(compat_hypercall_table)
         .quad compat_update_va_mapping_otherdomain
         .quad compat_iret
         .quad compat_vcpu_op
-        .quad compat_ni_hypercall       /* 25 */
+        .quad do_set_segment_base       /* 25 */
         .quad compat_mmuext_op
         .quad compat_xsm_op
         .quad compat_nmi_op
index 7f858fb2fcfbb5017adba7b2145484ab7f1e3834..250d3e002567d317b5f097d2f51a298fe861f337 100644 (file)
@@ -1031,6 +1031,9 @@ long do_set_segment_base(unsigned int which, unsigned long base)
     struct vcpu *v = current;
     long ret = 0;
 
+    if ( is_pv_32bit_vcpu(v) )
+        return -ENOSYS; /* x86/64 only. */
+
     switch ( which )
     {
     case SEGBASE_FS: