Skip to content

Commit

Permalink
x86: slim down hypercall handling when !PV32
Browse files Browse the repository at this point in the history
In such a build various of the compat handlers aren't needed. Don't
reference them from the hypercall table, and compile out those which
aren't needed for HVM. Also compile out switch_compat(), which has no
purpose in such a build.

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Wei Liu <wl@xen.org>
  • Loading branch information
jbeulich committed Apr 15, 2021
1 parent 9cc6bd4 commit 5279220
Show file tree
Hide file tree
Showing 12 changed files with 66 additions and 23 deletions.
3 changes: 2 additions & 1 deletion xen/arch/x86/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@ obj-bin-y += bzimage.init.o
obj-bin-y += clear_page.o
obj-bin-y += copy_page.o
obj-y += cpuid.o
obj-$(CONFIG_PV) += compat.o x86_64/compat.o
obj-$(CONFIG_PV) += compat.o
obj-$(CONFIG_PV32) += x86_64/compat.o
obj-$(CONFIG_KEXEC) += crash.o
obj-$(CONFIG_GDBSX) += debug.o
obj-y += delay.o
Expand Down
4 changes: 3 additions & 1 deletion xen/arch/x86/hvm/hypercall.c
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,9 @@ static long hvm_physdev_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg)

#define do_arch_1 paging_domctl_continuation

static const hypercall_table_t hvm_hypercall_table[] = {
static const struct {
hypercall_fn_t *native, *compat;
} hvm_hypercall_table[] = {
HVM_CALL(memory_op),
#ifdef CONFIG_GRANT_TABLE
HVM_CALL(grant_table_op),
Expand Down
4 changes: 3 additions & 1 deletion xen/arch/x86/mm.c
Original file line number Diff line number Diff line change
Expand Up @@ -4512,7 +4512,9 @@ long do_update_va_mapping_otherdomain(unsigned long va, u64 val64,

return rc;
}
#endif /* CONFIG_PV */

#ifdef CONFIG_PV32
int compat_update_va_mapping(unsigned int va, uint32_t lo, uint32_t hi,
unsigned int flags)
{
Expand Down Expand Up @@ -4547,7 +4549,7 @@ int compat_update_va_mapping_otherdomain(unsigned int va,

return rc;
}
#endif /* CONFIG_PV */
#endif /* CONFIG_PV32 */

typedef struct e820entry e820entry_t;
DEFINE_XEN_GUEST_HANDLE(e820entry_t);
Expand Down
14 changes: 12 additions & 2 deletions xen/arch/x86/pv/callback.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,11 @@
#include <xen/event.h>
#include <xen/hypercall.h>
#include <xen/guest_access.h>
#include <compat/callback.h>
#include <compat/nmi.h>

#include <asm/shared.h>

#include <public/callback.h>
#include <public/nmi.h>

static int register_guest_nmi_callback(unsigned long address)
{
Expand Down Expand Up @@ -203,6 +202,11 @@ long do_set_callbacks(unsigned long event_address,
return 0;
}

#ifdef CONFIG_PV32

#include <compat/callback.h>
#include <compat/nmi.h>

static long compat_register_guest_callback(struct compat_callback_register *reg)
{
long ret = 0;
Expand Down Expand Up @@ -343,6 +347,8 @@ long compat_set_callbacks(unsigned long event_selector,
return 0;
}

#endif /* CONFIG_PV32 */

long do_set_trap_table(XEN_GUEST_HANDLE_PARAM(const_trap_info_t) traps)
{
struct trap_info cur;
Expand Down Expand Up @@ -388,6 +394,7 @@ long do_set_trap_table(XEN_GUEST_HANDLE_PARAM(const_trap_info_t) traps)
return rc;
}

#ifdef CONFIG_PV32
int compat_set_trap_table(XEN_GUEST_HANDLE(trap_info_compat_t) traps)
{
struct vcpu *curr = current;
Expand Down Expand Up @@ -429,6 +436,7 @@ int compat_set_trap_table(XEN_GUEST_HANDLE(trap_info_compat_t) traps)

return rc;
}
#endif

long do_nmi_op(unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
{
Expand All @@ -455,6 +463,7 @@ long do_nmi_op(unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
return rc;
}

#ifdef CONFIG_PV32
int compat_nmi_op(unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
{
struct compat_nmi_callback cb;
Expand All @@ -479,6 +488,7 @@ int compat_nmi_op(unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) arg)

return rc;
}
#endif

/*
* Local variables:
Expand Down
24 changes: 14 additions & 10 deletions xen/arch/x86/pv/descriptor-tables.c
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,8 @@ long do_set_gdt(XEN_GUEST_HANDLE_PARAM(xen_ulong_t) frame_list,
return ret;
}

#ifdef CONFIG_PV32

int compat_set_gdt(XEN_GUEST_HANDLE_PARAM(uint) frame_list,
unsigned int entries)
{
Expand Down Expand Up @@ -185,6 +187,18 @@ int compat_set_gdt(XEN_GUEST_HANDLE_PARAM(uint) frame_list,
return ret;
}

int compat_update_descriptor(uint32_t pa_lo, uint32_t pa_hi,
uint32_t desc_lo, uint32_t desc_hi)
{
seg_desc_t d;

d.raw = ((uint64_t)desc_hi << 32) | desc_lo;

return do_update_descriptor(pa_lo | ((uint64_t)pa_hi << 32), d);
}

#endif /* CONFIG_PV32 */

static bool check_descriptor(const struct domain *dom, seg_desc_t *d)
{
unsigned int a = d->a, b = d->b, cs, dpl;
Expand Down Expand Up @@ -334,16 +348,6 @@ long do_update_descriptor(uint64_t gaddr, seg_desc_t d)
return ret;
}

int compat_update_descriptor(uint32_t pa_lo, uint32_t pa_hi,
uint32_t desc_lo, uint32_t desc_hi)
{
seg_desc_t d;

d.raw = ((uint64_t)desc_hi << 32) | desc_lo;

return do_update_descriptor(pa_lo | ((uint64_t)pa_hi << 32), d);
}

/*
* Local variables:
* mode: C
Expand Down
2 changes: 2 additions & 0 deletions xen/arch/x86/pv/domain.c
Original file line number Diff line number Diff line change
Expand Up @@ -212,6 +212,7 @@ unsigned long pv_make_cr4(const struct vcpu *v)
return cr4;
}

#ifdef CONFIG_PV32
int switch_compat(struct domain *d)
{
struct vcpu *v;
Expand Down Expand Up @@ -256,6 +257,7 @@ int switch_compat(struct domain *d)

return rc;
}
#endif

static int pv_create_gdt_ldt_l1tab(struct vcpu *v)
{
Expand Down
10 changes: 9 additions & 1 deletion xen/arch/x86/pv/hypercall.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,18 @@
#include <xen/trace.h>
#include <irq_vectors.h>

#ifdef CONFIG_PV32
#define HYPERCALL(x) \
[ __HYPERVISOR_ ## x ] = { (hypercall_fn_t *) do_ ## x, \
(hypercall_fn_t *) do_ ## x }
#define COMPAT_CALL(x) \
[ __HYPERVISOR_ ## x ] = { (hypercall_fn_t *) do_ ## x, \
(hypercall_fn_t *) compat_ ## x }
#else
#define HYPERCALL(x) \
[ __HYPERVISOR_ ## x ] = { (hypercall_fn_t *) do_ ## x }
#define COMPAT_CALL(x) HYPERCALL(x)
#endif

#define do_arch_1 paging_domctl_continuation

Expand Down Expand Up @@ -176,6 +182,7 @@ void pv_hypercall(struct cpu_user_regs *regs)
}
#endif
}
#ifdef CONFIG_PV32
else
{
unsigned int ebx = regs->ebx;
Expand Down Expand Up @@ -225,6 +232,7 @@ void pv_hypercall(struct cpu_user_regs *regs)
}
#endif
}
#endif /* CONFIG_PV32 */

/*
* PV guests use SYSCALL or INT $0x82 to make a hypercall, both of which
Expand Down Expand Up @@ -255,7 +263,7 @@ enum mc_disposition arch_do_multicall_call(struct mc_state *state)
else
call->result = -ENOSYS;
}
#ifdef CONFIG_COMPAT
#ifdef CONFIG_PV32
else
{
struct compat_multicall_entry *call = &state->compat_call;
Expand Down
2 changes: 2 additions & 0 deletions xen/arch/x86/pv/iret.c
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,7 @@ unsigned long do_iret(void)
return 0;
}

#ifdef CONFIG_PV32
unsigned int compat_iret(void)
{
struct cpu_user_regs *regs = guest_cpu_user_regs();
Expand Down Expand Up @@ -223,6 +224,7 @@ unsigned int compat_iret(void)
*/
return regs->eax;
}
#endif

/*
* Local variables:
Expand Down
10 changes: 7 additions & 3 deletions xen/arch/x86/pv/shim.c
Original file line number Diff line number Diff line change
Expand Up @@ -255,13 +255,17 @@ void __init pv_shim_setup_dom(struct domain *d, l4_pgentry_t *l4start,
*/
rw_pv_hypercall_table = __va(__pa(pv_hypercall_table));
rw_pv_hypercall_table[__HYPERVISOR_event_channel_op].native =
rw_pv_hypercall_table[__HYPERVISOR_event_channel_op].compat =
(hypercall_fn_t *)pv_shim_event_channel_op;

rw_pv_hypercall_table[__HYPERVISOR_grant_table_op].native =
rw_pv_hypercall_table[__HYPERVISOR_grant_table_op].compat =
(hypercall_fn_t *)pv_shim_grant_table_op;

#ifdef CONFIG_PV32
rw_pv_hypercall_table[__HYPERVISOR_event_channel_op].compat =
(hypercall_fn_t *)pv_shim_event_channel_op;
rw_pv_hypercall_table[__HYPERVISOR_grant_table_op].compat =
(hypercall_fn_t *)pv_shim_grant_table_op;
#endif

guest = d;

/*
Expand Down
8 changes: 8 additions & 0 deletions xen/include/asm-x86/compat.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,11 @@

typedef uint32_t compat_ptr_t;
typedef unsigned long full_ptr_t;

struct domain;
#ifdef CONFIG_PV32
int switch_compat(struct domain *);
#else
#include <xen/errno.h>
static inline int switch_compat(struct domain *d) { return -EOPNOTSUPP; }
#endif
5 changes: 4 additions & 1 deletion xen/include/asm-x86/hypercall.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,10 @@ typedef unsigned long hypercall_fn_t(
unsigned long, unsigned long, unsigned long);

typedef struct {
hypercall_fn_t *native, *compat;
hypercall_fn_t *native;
#ifdef CONFIG_PV32
hypercall_fn_t *compat;
#endif
} hypercall_table_t;

typedef struct {
Expand Down
3 changes: 0 additions & 3 deletions xen/include/xen/compat.h
Original file line number Diff line number Diff line change
Expand Up @@ -227,9 +227,6 @@ void xlat_start_info(struct start_info *, enum XLAT_start_info_console);
struct vcpu_runstate_info;
void xlat_vcpu_runstate_info(struct vcpu_runstate_info *);

struct domain;
int switch_compat(struct domain *);

#else

#define compat_handle_is_null(hnd) 0
Expand Down

0 comments on commit 5279220

Please sign in to comment.