PERFORCE change 135689 for review
Kip Macy
kmacy at FreeBSD.org
Tue Feb 19 00:34:07 UTC 2008
http://perforce.freebsd.org/chv.cgi?CH=135689
Change 135689 by kmacy at pandemonium:kmacy:xen31 on 2008/02/19 00:33:47
add in more backward compatibility support
Affected files ...
.. //depot/projects/xen31/sys/i386/i386/machdep.c#16 edit
.. //depot/projects/xen31/sys/i386/include/xen/hypercall.h#9 edit
.. //depot/projects/xen31/sys/i386/include/xen/hypervisor.h#7 edit
Differences ...
==== //depot/projects/xen31/sys/i386/i386/machdep.c#16 (text+ko) ====
@@ -2166,10 +2166,17 @@
void
init386(int first)
{
-
int error, gsel_tss, metadata_missing, x;
unsigned long gdtmachpfn;
struct pcpu *pc;
+ struct callback_register event = {
+ .type = CALLBACKTYPE_event,
+ .address = {GSEL(GCODE_SEL, SEL_KPL), (unsigned long)Xhypervisor_callback },
+ };
+ struct callback_register failsafe = {
+ .type = CALLBACKTYPE_failsafe,
+ .address = {GSEL(GCODE_SEL, SEL_KPL), (unsigned long)failsafe_callback },
+ };
thread0.td_kstack = proc0kstack;
thread0.td_pcb = (struct pcb *)
@@ -2238,10 +2245,16 @@
if ((error = HYPERVISOR_set_trap_table(trap_table)) != 0) {
panic("set_trap_table failed - error %d\n", error);
}
- HYPERVISOR_set_callbacks(GSEL(GCODE_SEL, SEL_KPL),
- (unsigned long)Xhypervisor_callback,
- GSEL(GCODE_SEL, SEL_KPL), (unsigned long)failsafe_callback);
-
+
+ error = HYPERVISOR_callback_op(CALLBACKOP_register, &event);
+ if (error == 0)
+ error = HYPERVISOR_callback_op(CALLBACKOP_register, &failsafe);
+#if CONFIG_XEN_COMPAT <= 0x030002
+ if (error == -ENOXENSYS)
+ HYPERVISOR_set_callbacks(GSEL(GCODE_SEL, SEL_KPL),
+ (unsigned long)Xhypervisor_callback,
+ GSEL(GCODE_SEL, SEL_KPL), (unsigned long)failsafe_callback);
+#endif
pcpu_init(pc, 0, sizeof(struct pcpu));
PCPU_SET(prvspace, pc);
PCPU_SET(curthread, &thread0);
==== //depot/projects/xen31/sys/i386/include/xen/hypercall.h#9 (text+ko) ====
@@ -37,6 +37,7 @@
#define __STR(x) #x
#define STR(x) __STR(x)
#define ENOXENSYS 38
+#define CONFIG_XEN_COMPAT 0x030002
#if defined(XEN)
@@ -259,6 +260,7 @@
{
int rc = _hypercall2(int, event_channel_op, cmd, arg);
+#if CONFIG_XEN_COMPAT <= 0x030002
if (__predict_false(rc == -ENOXENSYS)) {
struct evtchn_op op;
op.cmd = cmd;
@@ -266,7 +268,7 @@
rc = _hypercall1(int, event_channel_op_compat, &op);
memcpy(arg, &op.u, sizeof(op.u));
}
-
+#endif
return (rc);
}
@@ -289,7 +291,7 @@
int cmd, void *arg)
{
int rc = _hypercall2(int, physdev_op, cmd, arg);
-
+#if CONFIG_XEN_COMPAT <= 0x030002
if (__predict_false(rc == -ENOXENSYS)) {
struct physdev_op op;
op.cmd = cmd;
@@ -297,7 +299,7 @@
rc = _hypercall1(int, physdev_op_compat, &op);
memcpy(arg, &op.u, sizeof(op.u));
}
-
+#endif
return (rc);
}
@@ -344,34 +346,40 @@
};
int rc = _hypercall3(int, sched_op, SCHEDOP_shutdown,
&sched_shutdown, srec);
+#if CONFIG_XEN_COMPAT <= 0x030002
if (rc == -ENOXENSYS)
rc = _hypercall3(int, sched_op_compat, SCHEDOP_shutdown,
SHUTDOWN_suspend, srec);
+#endif
return (rc);
}
+
+#if CONFIG_XEN_COMPAT <= 0x030002
static inline int
HYPERVISOR_nmi_op(
unsigned long op, void *arg)
{
return _hypercall2(int, nmi_op, op, arg);
}
+#endif
-#ifdef notyet
+static inline int
+HYPERVISOR_callback_op(
+ int cmd, void *arg)
+{
+ return _hypercall2(int, callback_op, cmd, arg);
+}
+
+#ifndef CONFIG_XEN
static inline unsigned long
HYPERVISOR_hvm_op(
int op, void *arg)
{
return _hypercall2(unsigned long, hvm_op, op, arg);
}
+#endif
static inline int
-HYPERVISOR_callback_op(
- int cmd, void *arg)
-{
- return _hypercall2(int, callback_op, cmd, arg);
-}
-
-static inline int
HYPERVISOR_xenoprof_op(
int op, void *arg)
{
@@ -384,7 +392,6 @@
{
return _hypercall2(int, kexec_op, op, args);
}
-#endif
#endif /* __HYPERCALL_H__ */
/*
==== //depot/projects/xen31/sys/i386/include/xen/hypervisor.h#7 (text+ko) ====
@@ -12,8 +12,10 @@
#define is_running_on_xen() 1
#ifdef PAE
+#ifndef CONFIG_X86_PAE
#define CONFIG_X86_PAE
#endif
+#endif
#include <sys/cdefs.h>
#include <sys/systm.h>
@@ -22,6 +24,7 @@
#include <xen/interface/event_channel.h>
#include <xen/interface/physdev.h>
#include <xen/interface/sched.h>
+#include <xen/interface/callback.h>
#include <machine/xen/hypercall.h>
#if defined(__amd64__)
@@ -55,7 +58,11 @@
{
int rc = HYPERVISOR_sched_op(SCHEDOP_yield, NULL);
- return rc;
+#if CONFIG_XEN_COMPAT <= 0x030002
+ if (rc == -ENOXENSYS)
+ rc = HYPERVISOR_sched_op_compat(SCHEDOP_yield, 0);
+#endif
+ return (rc);
}
static inline int
@@ -64,18 +71,25 @@
{
int rc = HYPERVISOR_sched_op(SCHEDOP_block, NULL);
- return rc;
+#if CONFIG_XEN_COMPAT <= 0x030002
+ if (rc == -ENOXENSYS)
+ rc = HYPERVISOR_sched_op_compat(SCHEDOP_block, 0);
+#endif
+ return (rc);
}
-static inline int
+static inline void
HYPERVISOR_shutdown(unsigned int reason)
{
struct sched_shutdown sched_shutdown = {
.reason = reason
};
- return HYPERVISOR_sched_op(SCHEDOP_shutdown, &sched_shutdown);
+ HYPERVISOR_sched_op(SCHEDOP_shutdown, &sched_shutdown);
+#if CONFIG_XEN_COMPAT <= 0x030002
+ HYPERVISOR_sched_op_compat(SCHEDOP_shutdown, reason);
+#endif
}
static inline void
@@ -92,13 +106,19 @@
HYPERVISOR_poll(
evtchn_port_t *ports, unsigned int nr_ports, int ticks)
{
+ int rc;
struct sched_poll sched_poll = {
.nr_ports = nr_ports,
.timeout = get_system_time(ticks)
};
set_xen_guest_handle(sched_poll.ports, ports);
- return HYPERVISOR_sched_op(SCHEDOP_poll, &sched_poll);
+ rc = HYPERVISOR_sched_op(SCHEDOP_poll, &sched_poll);
+#if CONFIG_XEN_COMPAT <= 0x030002
+ if (rc == -ENOXENSYS)
+ rc = HYPERVISOR_sched_op_compat(SCHEDOP_yield, 0);
+#endif
+ return (rc);
}
static inline void
More information about the p4-projects
mailing list