• Jan Beulich's avatar
    xen/x86: fix PV trap handling on secondary processors · 0594c581
    Jan Beulich authored
    The initial observation was that in PV mode under Xen 32-bit user space
    didn't work anymore. Attempts of system calls ended in #GP(0x402). All
    of the sudden the vector 0x80 handler was not in place anymore. As it
    turns out up to 5.13 redundant initialization did occur: Once from
    cpu_initialize_context() (through its VCPUOP_initialise hypercall) and a
    2nd time while each CPU was brought fully up. This 2nd initialization is
    now gone, uncovering that the 1st one was flawed: Unlike for the
    set_trap_table hypercall, a full virtual IDT needs to be specified here;
    the "vector" fields of the individual entries are of no interest. With
    many (kernel) IDT entries still(?) (i.e. at that point at least) empty,
    the syscall vector 0x80 ended up in slot 0x20 of the virtual IDT, thus
    becoming the domain's handler for vector 0x20.
    
    Make xen_convert_trap_info() fit for either purpose, leveraging the fact
    that on the xen_copy_trap_info() path the table starts out zero-filled.
    This includes moving out the writing of the sentinel, which would also
    have lead to a buffer overrun in the xen_copy_trap_info() case if all
    (kernel) IDT entries were populated. Convert the writing of the sentinel
    to clearing of the entire table entry rather than just the address
    field.
    
    (I didn't bother trying to identify the commit which uncovered the issue
    in 5.14; the commit named below is the one which actually introduced the
    bad code.)
    
    Fixes: f87e4cac ("xen: SMP guest support")
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarJan Beulich <jbeulich@suse.com>
    Reviewed-by: default avatarBoris Ostrovsky <boris.ostrovsky@oracle.com>
    Link: https://lore.kernel.org/r/7a266932-092e-b68f-f2bb-1473b61adc6e@suse.comSigned-off-by: default avatarJuergen Gross <jgross@suse.com>
    0594c581
enlighten_pv.c 35.5 KB