mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
x86/pv-shim: Don't modify the hypercall table
When running as pv-shim the hypercall is modified today in order to replace the functions for __HYPERVISOR_event_channel_op and __HYPERVISOR_grant_table_op hypercalls. Change this to call the related functions from the normal handlers instead when running as shim. The performance implications are not really relevant, as a normal production hypervisor will not be configured to support shim mode, so the related calls will be dropped due to optimisation of the compiler. Note that for the CONFIG_PV_SHIM_EXCLUSIVE case there is a dummy wrapper do_grant_table_op() needed, as in this case grant_table.c isn't being built. Signed-off-by: Juergen Gross <jgross@suse.com> Split out of series. To compile in isolation, the compat_platform_op() prototype needs correcting, and header files need rearranging to avoid the compat_platform_op_t/multicall_entry_compat_t guest handles being declared multiple times. Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com> Reviewed-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
1 parent
44d6b07584
commit
e7db635f44
8 files changed
+54
-32
No files matched your search
@@ -145,6 +145,7 @@ do_set_segment_base(
|
||||
|
||||
#include <compat/arch-x86/xen.h>
|
||||
#include <compat/physdev.h>
|
||||
#include <compat/platform.h>
|
||||
|
||||
extern int
|
||||
compat_physdev_op(
|
||||
@@ -161,8 +162,9 @@ extern int compat_mmuext_op(
|
||||
XEN_GUEST_HANDLE_PARAM(uint) pdone,
|
||||
unsigned int foreigndom);
|
||||
|
||||
DEFINE_XEN_GUEST_HANDLE(compat_platform_op_t);
|
||||
extern int compat_platform_op(
|
||||
XEN_GUEST_HANDLE_PARAM(void) u_xenpf_op);
|
||||
XEN_GUEST_HANDLE_PARAM(compat_platform_op_t) u_xenpf_op);
|
||||
|
||||
extern long compat_callback_op(
|
||||
int cmd, XEN_GUEST_HANDLE(void) arg);
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
#ifndef __X86_PV_SHIM_H__
|
||||
#define __X86_PV_SHIM_H__
|
||||
|
||||
#include <xen/hypercall.h>
|
||||
#include <xen/types.h>
|
||||
|
||||
#if defined(CONFIG_PV_SHIM_EXCLUSIVE)
|
||||
@@ -45,6 +46,8 @@ domid_t get_initial_domain_id(void);
|
||||
uint64_t pv_shim_mem(uint64_t avail);
|
||||
void pv_shim_fixup_e820(struct e820map *e820);
|
||||
const struct platform_bad_page *pv_shim_reserved_pages(unsigned int *size);
|
||||
typeof(do_event_channel_op) pv_shim_event_channel_op;
|
||||
typeof(do_grant_table_op) pv_shim_grant_table_op;
|
||||
|
||||
#else
|
||||
|
||||
|
||||
@@ -64,7 +64,7 @@ const pv_hypercall_table_t pv_hypercall_table[] = {
|
||||
COMPAT_CALL(xen_version),
|
||||
HYPERCALL(console_io),
|
||||
COMPAT_CALL(physdev_op_compat),
|
||||
#ifdef CONFIG_GRANT_TABLE
|
||||
#if defined(CONFIG_GRANT_TABLE) || defined(CONFIG_PV_SHIM)
|
||||
COMPAT_CALL(grant_table_op),
|
||||
#endif
|
||||
HYPERCALL(vm_assist),
|
||||
|
||||
+27
-27
@@ -56,11 +56,6 @@ static DEFINE_SPINLOCK(balloon_lock);
|
||||
|
||||
static struct platform_bad_page __initdata reserved_pages[2];
|
||||
|
||||
static long pv_shim_event_channel_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg);
|
||||
static long pv_shim_grant_table_op(unsigned int cmd,
|
||||
XEN_GUEST_HANDLE_PARAM(void) uop,
|
||||
unsigned int count);
|
||||
|
||||
/*
|
||||
* By default give the shim 1MB of free memory slack. Some users may wish to
|
||||
* tune this constants for better memory utilization. This can be achieved
|
||||
@@ -203,7 +198,6 @@ void __init pv_shim_setup_dom(struct domain *d, l4_pgentry_t *l4start,
|
||||
start_info_t *si)
|
||||
{
|
||||
bool compat = is_pv_32bit_domain(d);
|
||||
pv_hypercall_table_t *rw_pv_hypercall_table;
|
||||
uint64_t param = 0;
|
||||
long rc;
|
||||
|
||||
@@ -249,23 +243,6 @@ void __init pv_shim_setup_dom(struct domain *d, l4_pgentry_t *l4start,
|
||||
consoled_set_ring_addr(page);
|
||||
}
|
||||
|
||||
/*
|
||||
* Locate pv_hypercall_table[] (usually .rodata) in the directmap (which
|
||||
* is writeable) and insert some shim-specific hypercall handlers.
|
||||
*/
|
||||
rw_pv_hypercall_table = __va(__pa(pv_hypercall_table));
|
||||
rw_pv_hypercall_table[__HYPERVISOR_event_channel_op].native =
|
||||
(hypercall_fn_t *)pv_shim_event_channel_op;
|
||||
rw_pv_hypercall_table[__HYPERVISOR_grant_table_op].native =
|
||||
(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;
|
||||
|
||||
/*
|
||||
@@ -435,7 +412,7 @@ int pv_shim_shutdown(uint8_t reason)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static long pv_shim_event_channel_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
|
||||
long pv_shim_event_channel_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
|
||||
{
|
||||
struct domain *d = current->domain;
|
||||
struct evtchn_close close;
|
||||
@@ -683,9 +660,9 @@ void pv_shim_inject_evtchn(unsigned int port)
|
||||
# define compat_handle_okay guest_handle_okay
|
||||
#endif
|
||||
|
||||
static long pv_shim_grant_table_op(unsigned int cmd,
|
||||
XEN_GUEST_HANDLE_PARAM(void) uop,
|
||||
unsigned int count)
|
||||
long pv_shim_grant_table_op(unsigned int cmd,
|
||||
XEN_GUEST_HANDLE_PARAM(void) uop,
|
||||
unsigned int count)
|
||||
{
|
||||
struct domain *d = current->domain;
|
||||
long rc = 0;
|
||||
@@ -845,6 +822,29 @@ static long pv_shim_grant_table_op(unsigned int cmd,
|
||||
return rc;
|
||||
}
|
||||
|
||||
#ifndef CONFIG_GRANT_TABLE
|
||||
/* Thin wrapper(s) needed. */
|
||||
long do_grant_table_op(unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) uop,
|
||||
unsigned int count)
|
||||
{
|
||||
if ( !pv_shim )
|
||||
return -ENOSYS;
|
||||
|
||||
return pv_shim_grant_table_op(cmd, uop, count);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PV32
|
||||
int compat_grant_table_op(unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) uop,
|
||||
unsigned int count)
|
||||
{
|
||||
if ( !pv_shim )
|
||||
return -ENOSYS;
|
||||
|
||||
return pv_shim_grant_table_op(cmd, uop, count);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
long pv_shim_cpu_up(void *data)
|
||||
{
|
||||
struct vcpu *v = data;
|
||||
|
||||
@@ -6,8 +6,8 @@ EMIT_FILE;
|
||||
|
||||
#include <xen/lib.h>
|
||||
#include <compat/platform.h>
|
||||
#include <xen/hypercall.h>
|
||||
|
||||
DEFINE_XEN_GUEST_HANDLE(compat_platform_op_t);
|
||||
#define xen_platform_op compat_platform_op
|
||||
#define xen_platform_op_t compat_platform_op_t
|
||||
#define do_platform_op(x) compat_platform_op(_##x)
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
EMIT_FILE;
|
||||
|
||||
#include <xen/types.h>
|
||||
#include <xen/multicall.h>
|
||||
#include <xen/hypercall.h>
|
||||
#include <xen/trace.h>
|
||||
|
||||
#define COMPAT
|
||||
@@ -19,7 +19,6 @@ static inline void xlat_multicall_entry(struct mc_state *mcs)
|
||||
mcs->compat_call.args[i] = mcs->call.args[i];
|
||||
}
|
||||
|
||||
DEFINE_XEN_GUEST_HANDLE(multicall_entry_compat_t);
|
||||
#define multicall_entry compat_multicall_entry
|
||||
#define multicall_entry_t multicall_entry_compat_t
|
||||
#define do_multicall_call compat_multicall_call
|
||||
|
||||
@@ -31,6 +31,10 @@
|
||||
#include <public/event_channel.h>
|
||||
#include <xsm/xsm.h>
|
||||
|
||||
#ifdef CONFIG_PV_SHIM
|
||||
#include <asm/guest.h>
|
||||
#endif
|
||||
|
||||
#define ERROR_EXIT(_errno) \
|
||||
do { \
|
||||
gdprintk(XENLOG_WARNING, \
|
||||
@@ -1189,6 +1193,11 @@ long do_event_channel_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
|
||||
{
|
||||
int rc;
|
||||
|
||||
#ifdef CONFIG_PV_SHIM
|
||||
if ( unlikely(pv_shim) )
|
||||
return pv_shim_event_channel_op(cmd, arg);
|
||||
#endif
|
||||
|
||||
switch ( cmd )
|
||||
{
|
||||
case EVTCHNOP_alloc_unbound: {
|
||||
|
||||
@@ -44,6 +44,10 @@
|
||||
#include <asm/flushtlb.h>
|
||||
#include <asm/guest_atomics.h>
|
||||
|
||||
#ifdef CONFIG_PV_SHIM
|
||||
#include <asm/guest.h>
|
||||
#endif
|
||||
|
||||
/* Per-domain grant information. */
|
||||
struct grant_table {
|
||||
/*
|
||||
@@ -3561,6 +3565,11 @@ do_grant_table_op(
|
||||
long rc;
|
||||
unsigned int opaque_in = cmd & GNTTABOP_ARG_MASK, opaque_out = 0;
|
||||
|
||||
#ifdef CONFIG_PV_SHIM
|
||||
if ( unlikely(pv_shim) )
|
||||
return pv_shim_grant_table_op(cmd, uop, count);
|
||||
#endif
|
||||
|
||||
if ( (int)count < 0 )
|
||||
return -EINVAL;
|
||||
|
||||
|
||||