- Add support for Xen 2.0
- Rearrange some code
Modified: branches/xen/reactos/boot/freeldr/freeldr/Makefile
Modified: branches/xen/reactos/boot/freeldr/freeldr/arch/i386/machxen.c
Modified: branches/xen/reactos/boot/freeldr/freeldr/arch/i386/machxen.h
Modified: branches/xen/reactos/boot/freeldr/freeldr/arch/i386/xencons.c
Added: branches/xen/reactos/boot/freeldr/freeldr/arch/i386/xenctrlif.c
Added: branches/xen/reactos/include/xen2/
Added: branches/xen/reactos/include/xen2/private/
Added: branches/xen/reactos/include/xen2/private/ctrl_if.h
Added: branches/xen/reactos/include/xen2/private/evtchn.h
Added: branches/xen/reactos/include/xen2/private/hypervisor.h
Added: branches/xen/reactos/include/xen2/public/
Added: branches/xen/reactos/include/xen2/public/COPYING
Added: branches/xen/reactos/include/xen2/public/arch-x86_32.h
Added: branches/xen/reactos/include/xen2/public/arch-x86_64.h
Added: branches/xen/reactos/include/xen2/public/dom0_ops.h
Added: branches/xen/reactos/include/xen2/public/event_channel.h
Added: branches/xen/reactos/include/xen2/public/grant_table.h
Added: branches/xen/reactos/include/xen2/public/io/
Added: branches/xen/reactos/include/xen2/public/io/blkif.h
Added: branches/xen/reactos/include/xen2/public/io/domain_controller.h
Added: branches/xen/reactos/include/xen2/public/io/netif.h
Added: branches/xen/reactos/include/xen2/public/physdev.h
Added: branches/xen/reactos/include/xen2/public/sched_ctl.h
Added: branches/xen/reactos/include/xen2/public/trace.h
Added: branches/xen/reactos/include/xen2/public/xen.h
Added: branches/xen/reactos/include/xen2/rosxen.h
_____
Modified: branches/xen/reactos/boot/freeldr/freeldr/Makefile
--- branches/xen/reactos/boot/freeldr/freeldr/Makefile 2005-04-01
21:44:22 UTC (rev 14426)
+++ branches/xen/reactos/boot/freeldr/freeldr/Makefile 2005-04-01
22:39:20 UTC (rev 14427)
@@ -21,6 +21,8 @@
include ../rules.mak
+include $(PATH_TO_TOP)/config
+
CC = gcc
LD = ld
@@ -99,17 +101,27 @@
COMPILER_DEFINES = -D__$(TARGET)__ $(COMPILER_DEBUG_DEFINES)
+ifeq ($(XEN),2)
+XEN_CFLAGS = -I$(PATH_TO_TOP)/include/xen2 \
+ -I$(PATH_TO_TOP)/include/xen2/public \
+ -I$(PATH_TO_TOP)/include/xen2/private \
+ -DXEN_VER=2
+else
+XEN_CFLAGS = -I$(PATH_TO_TOP)/include/xen3 \
+ -I$(PATH_TO_TOP)/include/xen3/public \
+ -I$(PATH_TO_TOP)/include/xen3/private \
+ -DXEN_VER=3
+endif
+
COMPILER_INCLUDES = -I$(SRCDIR)/include \
-I$(PATH_TO_TOP)/w32api/include \
-I$(PATH_TO_TOP)/include \
- -I$(PATH_TO_TOP)/ntoskrnl/include \
- -I$(PATH_TO_TOP)/include/xen3 \
- -I$(PATH_TO_TOP)/include/xen3/public \
- -I$(PATH_TO_TOP)/include/xen3/private
+ -I$(PATH_TO_TOP)/ntoskrnl/include
CFLAGS = $(COMPILER_OPTIONS) \
$(COMPILER_DEFINES) \
- $(COMPILER_INCLUDES)
+ $(COMPILER_INCLUDES) \
+ $(XEN_CFLAGS)
LINKER_OPTIONS = -N -Ttext=0x8000
@@ -160,6 +172,7 @@
xboxrtc.o \
xboxvideo.o \
xencons.o \
+ xenctrlif.o \
xenmem.o \
_alloca.o # For Mingw32 builds
_____
Modified: branches/xen/reactos/boot/freeldr/freeldr/arch/i386/machxen.c
--- branches/xen/reactos/boot/freeldr/freeldr/arch/i386/machxen.c
2005-04-01 21:44:22 UTC (rev 14426)
+++ branches/xen/reactos/boot/freeldr/freeldr/arch/i386/machxen.c
2005-04-01 22:39:20 UTC (rev 14427)
@@ -1,5 +1,4 @@
-/* $Id: machpc.c 12672 2005-01-01 00:42:18Z chorns $
- *
+/*
* FreeLoader
*
* This program is free software; you can redistribute it and/or
modify
@@ -28,8 +27,6 @@
#include <hypervisor.h>
BOOL XenActive = FALSE;
-ctrl_front_ring_t XenCtrlIfTxRing;
-ctrl_back_ring_t XenCtrlIfRxRing;
int XenCtrlIfEvtchn;
VOID
@@ -65,12 +62,10 @@
/* _start is the default name ld will use as the entry point. When xen
* loads the domain, it will start execution at the elf entry point.
*/
-void *dummy;
void _start()
{
extern void *start; /* Where is freeldr loaded? */
start_info_t *StartInfo;
- control_if_t *CtrlIf;
void *OldStackPtr, *NewStackPtr;
void *OldStackPage, *NewStackPage;
@@ -87,16 +82,8 @@
*/
XenMemInit(StartInfo);
- /*
- * Setup control interface
- */
- XenCtrlIfEvtchn = XenStartInfo->domain_controller_evtchn;
- CtrlIf = ((control_if_t *)((char *)XenSharedInfo + 2048));
+ XenCtrlIfInit();
- /* Sync up with shared indexes. */
- FRONT_RING_ATTACH(&XenCtrlIfTxRing, &CtrlIf->tx_ring);
- BACK_RING_ATTACH(&XenCtrlIfRxRing, &CtrlIf->rx_ring);
-
/* Now move the stack to low mem */
/* Copy the stack page */
__asm__ __volatile__("mov %%esp,%%eax\n" : "=a" (OldStackPtr));
@@ -110,6 +97,7 @@
/* Start freeldr */
XenActive = TRUE;
+ BootDrive = 0x80;
BootMain(XenStartInfo->cmd_line);
/* Shouldn't get here */
@@ -258,8 +246,15 @@
XEN_UNIMPLEMENTED("XenHwDetect");
}
-/* emit the elf segment Xen builder expects in kernel image */
asm(".section __xen_guest;"
- ".ascii
\"GUEST_OS=linux,GUEST_VER=2.6,XEN_VER=3.0,VIRT_BASE=0x00008000\";"
+/* emit the elf segment Xen builder expects in kernel image */
+asm(".section __xen_guest;"
+ ".ascii \"GUEST_OS=linux,GUEST_VER=2.6\";"
+#if XEN_VER == 2
+ ".ascii \",XEN_VER=2.0\";"
+#else
+ ".ascii \",XEN_VER=3.0\";"
+#endif
+ ".ascii \",VIRT_BASE=0x00008000\";"
".ascii \",LOADER=generic\";"
".ascii \",PT_MODE_WRITABLE\";"
".byte 0;"
_____
Modified: branches/xen/reactos/boot/freeldr/freeldr/arch/i386/machxen.h
--- branches/xen/reactos/boot/freeldr/freeldr/arch/i386/machxen.h
2005-04-01 21:44:22 UTC (rev 14426)
+++ branches/xen/reactos/boot/freeldr/freeldr/arch/i386/machxen.h
2005-04-01 22:39:20 UTC (rev 14427)
@@ -27,18 +27,21 @@
#include <rosxen.h>
#include <xen.h>
+#include <ctrl_if.h>
#include <io/domain_controller.h>
extern BOOL XenActive;
-extern ctrl_front_ring_t XenCtrlIfTxRing;
-extern ctrl_back_ring_t XenCtrlIfRxRing;
-extern int XenCtrlIfEvtchn;
extern start_info_t *XenStartInfo;
extern shared_info_t *XenSharedInfo;
VOID XenMachInit(VOID);
VOID XenMemInit(start_info_t *StartInfo);
+VOID XenCtrlIfInit();
+BOOL XenCtrlIfSendMessageNoblock(ctrl_msg_t *Msg);
+VOID XenCtrlIfDiscardResponses();
+BOOL XenCtrlIfTransmitterEmpty();
+
VOID XenConsPutChar(int Ch);
BOOL XenConsKbHit();
int XenConsGetCh();
@@ -68,6 +71,6 @@
VOID XenHwDetect(VOID);
-#endif /* __I386_MACHPC_H_ */
+#endif /* __I386_MACHXEN_H_ */
/* EOF */
_____
Modified: branches/xen/reactos/boot/freeldr/freeldr/arch/i386/xencons.c
--- branches/xen/reactos/boot/freeldr/freeldr/arch/i386/xencons.c
2005-04-01 21:44:22 UTC (rev 14426)
+++ branches/xen/reactos/boot/freeldr/freeldr/arch/i386/xencons.c
2005-04-01 22:39:20 UTC (rev 14427)
@@ -1,5 +1,4 @@
-/* $Id: machpc.c 12672 2005-01-01 00:42:18Z chorns $
- *
+/*
* FreeLoader
*
* This program is free software; you can redistribute it and/or
modify
@@ -34,37 +33,32 @@
(_r)->rsp_cons = (_r)->sring->rsp_prod;
\
} while (0)
-#define OUTPUT_BUFFER_SIZE 128
+#define OUTPUT_BUFFER_SIZE sizeof(((ctrl_msg_t *) NULL)->msg)
static char OutputBuffer[OUTPUT_BUFFER_SIZE];
static unsigned OutputPtr = 0;
static void
FlushOutput()
{
- ctrl_msg_t *msg;
+ ctrl_msg_t Msg;
- while (0 != OutputPtr)
+ while (0 != OutputPtr || ! XenCtrlIfTransmitterEmpty())
{
- RING_DROP_PENDING_RESPONSES(&XenCtrlIfTxRing);
+ XenCtrlIfDiscardResponses();
- if (! RING_FULL(&XenCtrlIfTxRing))
+ if (0 == OutputPtr)
{
- /*
- * Put message on the control interface ring and trigger
virtual
- * console writer.
- */
- msg = RING_GET_REQUEST(&XenCtrlIfTxRing,
- XenCtrlIfTxRing.req_prod_pvt);
+ continue;
+ }
- msg->type = CMSG_CONSOLE;
- msg->subtype = CMSG_CONSOLE_DATA;
- msg->length = OutputPtr;
- memcpy(msg->msg, OutputBuffer, OutputPtr);
- msg->id = 0xff;
- XenCtrlIfTxRing.req_prod_pvt++;
- RING_PUSH_REQUESTS(&XenCtrlIfTxRing);
- notify_via_evtchn(XenCtrlIfEvtchn);
+ Msg.type = CMSG_CONSOLE;
+ Msg.subtype = CMSG_CONSOLE_DATA;
+ Msg.length = OutputPtr;
+ memcpy(Msg.msg, OutputBuffer, OutputPtr);
+ Msg.id = 0xff;
+ if (XenCtrlIfSendMessageNoblock(&Msg))
+ {
OutputPtr = 0;
}
}
_____
Added: branches/xen/reactos/boot/freeldr/freeldr/arch/i386/xenctrlif.c
--- branches/xen/reactos/boot/freeldr/freeldr/arch/i386/xenctrlif.c
2005-04-01 21:44:22 UTC (rev 14426)
+++ branches/xen/reactos/boot/freeldr/freeldr/arch/i386/xenctrlif.c
2005-04-01 22:39:20 UTC (rev 14427)
@@ -0,0 +1,127 @@
+/*
+ * FreeLoader
+ *
+ * This program is free software; you can redistribute it and/or
modify
+ * it under the terms of the GNU General Public License as published
by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include "freeldr.h"
+#include "machxen.h"
+
+#include <rosxen.h>
+#include <xen.h>
+#include <ctrl_if.h>
+#include <evtchn.h>
+
+#if XEN_VER == 2
+#define TX_FULL(_c) \
+ (((_c)->tx_req_prod - XenCtrlIfTxRespCons) == CONTROL_RING_SIZE)
+static control_if_t *XenCtrlIf;
+static CONTROL_RING_IDX XenCtrlIfTxRespCons;
+static CONTROL_RING_IDX XenCtrlIfRxReqCons;
+#else /* XEN_VER */
+/*
+ * Extra ring macros to sync a consumer index up to the public producer
index.
+ * Generally UNSAFE, but we use it for recovery and shutdown in some
cases.
+ */
+#define RING_DROP_PENDING_RESPONSES(_r)
\
+ do {
\
+ (_r)->rsp_cons = (_r)->sring->rsp_prod;
\
+ } while (0)
+
+static ctrl_front_ring_t XenCtrlIfTxRing;
+static ctrl_back_ring_t XenCtrlIfRxRing;
+#endif /* XEN_VER */
+static int XenCtrlIfEvtchn;
+
+void
+XenCtrlIfInit()
+{
+#if XEN_VER != 2
+ control_if_t *CtrlIf;
+#endif /* XEN_VER */
+
+ /*
+ * Setup control interface
+ */
+ XenCtrlIfEvtchn = XenStartInfo->domain_controller_evtchn;
+
+#if XEN_VER == 2
+ XenCtrlIf = ((control_if_t *)((char *)XenSharedInfo + 2048));
+
+ /* Sync up with shared indexes. */
+ XenCtrlIfTxRespCons = XenCtrlIf->tx_resp_prod;
+ XenCtrlIfRxReqCons = XenCtrlIf->rx_resp_prod;
+#else /* XEN_VER */
+ CtrlIf = ((control_if_t *)((char *)XenSharedInfo + 2048));
+
+ /* Sync up with shared indexes. */
+ FRONT_RING_ATTACH(&XenCtrlIfTxRing, &CtrlIf->tx_ring);
+ BACK_RING_ATTACH(&XenCtrlIfRxRing, &CtrlIf->rx_ring);
+#endif /* XEN_VER */
+}
+
+BOOL
+XenCtrlIfSendMessageNoblock(ctrl_msg_t *Msg)
+{
+ ctrl_msg_t *Dest;
+
+#if XEN_VER == 2
+ if (TX_FULL(XenCtrlIf))
+#else /* XEN_VER */
+ if (RING_FULL(&XenCtrlIfTxRing))
+#endif /* XEN_VER */
+ {
+ return FALSE;
+ }
+
+#if XEN_VER == 2
+ Dest = XenCtrlIf->tx_ring + MASK_CONTROL_IDX(XenCtrlIf->tx_req_prod);
+#else /* XEN_VER */
+ Dest = RING_GET_REQUEST(&XenCtrlIfTxRing,
+ XenCtrlIfTxRing.req_prod_pvt);
+#endif /* XEN_VER */
+ memcpy(Dest, Msg, sizeof(ctrl_msg_t));
+#if XEN_VER == 2
+ XenCtrlIf->tx_req_prod++;
+#else /* XEN_VER */
+ XenCtrlIfTxRing.req_prod_pvt++;
+ RING_PUSH_REQUESTS(&XenCtrlIfTxRing);
+#endif /* XEN_VER */
+ notify_via_evtchn(XenCtrlIfEvtchn);
+
+ return TRUE;
+}
+
+VOID
+XenCtrlIfDiscardResponses()
+{
+#if XEN_VER == 2
+ XenCtrlIfTxRespCons = XenCtrlIf->tx_resp_prod;
+#else /* XEN_VER */
+ RING_DROP_PENDING_RESPONSES(&XenCtrlIfTxRing);
+#endif /* XEN_VER */
+}
+
+BOOL
+XenCtrlIfTransmitterEmpty()
+{
+#if XEN_VER == 2
+ return (XenCtrlIf->tx_req_prod == XenCtrlIfTxRespCons);
+#else /* XEN_VER */
+ return XenCtrlIfTxRing.sring->req_prod == XenCtrlIfTxRing.rsp_cons;
+#endif /* XEN_VER */
+}
+
+/* EOF */
Property changes on:
branches/xen/reactos/boot/freeldr/freeldr/arch/i386/xenctrlif.c
___________________________________________________________________
Name: svn:keywords
+ Author Date Id Revision
Name: svn:eol-style
+ native
_____
Added: branches/xen/reactos/include/xen2/private/ctrl_if.h
--- branches/xen/reactos/include/xen2/private/ctrl_if.h 2005-04-01
21:44:22 UTC (rev 14426)
+++ branches/xen/reactos/include/xen2/private/ctrl_if.h 2005-04-01
22:39:20 UTC (rev 14427)
@@ -0,0 +1,161 @@
+/**********************************************************************
********
+ * ctrl_if.h
+ *
+ * Management functions for special interface to the domain controller.
+ *
+ * Copyright (c) 2004, K A Fraser
+ *
+ * This file may be distributed separately from the Linux kernel, or
+ * incorporated into other software packages, subject to the following
license:
+ *
+ * Permission is hereby granted, free of charge, to any person
obtaining a copy
+ * of this source file (the "Software"), to deal in the Software
without
+ * restriction, including without limitation the rights to use, copy,
modify,
+ * merge, publish, distribute, sublicense, and/or sell copies of the
Software,
+ * and to permit persons to whom the Software is furnished to do so,
subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS
+ * IN THE SOFTWARE.
+ */
+
+#ifndef __ASM_XEN__CTRL_IF_H__
+#define __ASM_XEN__CTRL_IF_H__
+
+#include <hypervisor.h>
+
+typedef control_msg_t ctrl_msg_t;
+
+/*
+ * Callback function type. Called for asynchronous processing of
received
+ * request messages, and responses to previously-transmitted request
messages.
+ * The parameters are (@msg, @id).
+ * @msg: Original request/response message (not a copy). The message
can be
+ * modified in-place by the handler (e.g., a response callback
can
+ * turn a request message into a response message in place). The
message
+ * is no longer accessible after the callback handler returns --
if the
+ * message is required to persist for longer then it must be
copied.
+ * @id: (Response callbacks only) The 'id' that was specified when
the
+ * original request message was queued for transmission.
+ */
+typedef void (*ctrl_msg_handler_t)(ctrl_msg_t *, unsigned long);
+
+/*
+ * Send @msg to the domain controller. Execute @hnd when a response is
+ * received, passing the response message and the specified @id. This
+ * operation will not block: it will return -EAGAIN if there is no
space.
+ * Notes:
+ * 1. The @msg is copied if it is transmitted and so can be freed
after this
+ * function returns.
+ * 2. If @hnd is NULL then no callback is executed.
+ */
+int
+ctrl_if_send_message_noblock(
+ ctrl_msg_t *msg,
+ ctrl_msg_handler_t hnd,
+ unsigned long id);
+
+/*
+ * Send @msg to the domain controller. Execute @hnd when a response is
+ * received, passing the response message and the specified @id. This
+ * operation will block until the message is sent, or a signal is
received
+ * for the calling process (unless @wait_state is
TASK_UNINTERRUPTIBLE).
+ * Notes:
+ * 1. The @msg is copied if it is transmitted and so can be freed
after this
+ * function returns.
+ * 2. If @hnd is NULL then no callback is executed.
+ */
+int
+ctrl_if_send_message_block(
+ ctrl_msg_t *msg,
+ ctrl_msg_handler_t hnd,
+ unsigned long id,
+ long wait_state);
+
+/*
+ * Send @msg to the domain controller. Block until the response is
received,
+ * and then copy it into the provided buffer, @rmsg.
+ */
+int
+ctrl_if_send_message_and_get_response(
+ ctrl_msg_t *msg,
+ ctrl_msg_t *rmsg,
+ long wait_state);
+
+/*
+ * Request a callback when there is /possibly/ space to immediately
send a
+ * message to the domain controller. This function returns 0 if there
is
+ * already space to trasnmit a message --- in this case the callback
task /may/
+ * still be executed. If this function returns 1 then the callback
/will/ be
+ * executed when space becomes available.
+ */
+#ifdef TODO
+int
+ctrl_if_enqueue_space_callback(
+ struct tq_struct *task);
+#endif
+
+/*
+ * Send a response (@msg) to a message from the domain controller. This
will
+ * never block.
+ * Notes:
+ * 1. The @msg is copied and so can be freed after this function
returns.
+ * 2. The @msg may be the original request message, modified in-place.
+ */
+void
+ctrl_if_send_response(
+ ctrl_msg_t *msg);
+
+/*
+ * Register a receiver for typed messages from the domain controller.
The
+ * handler (@hnd) is called for every received message of specified
@type.
+ * Returns TRUE (non-zero) if the handler was successfully registered.
+ * If CALLBACK_IN_BLOCKING CONTEXT is specified in @flags then
callbacks will
+ * occur in a context in which it is safe to yield (i.e., process
context).
+ */
+#define CALLBACK_IN_BLOCKING_CONTEXT 1
+int ctrl_if_register_receiver(
+ u8 type,
+ ctrl_msg_handler_t hnd,
+ unsigned int flags);
+
+/*
+ * Unregister a receiver for typed messages from the domain controller.
The
+ * handler (@hnd) will not be executed after this function returns.
+ */
+void
+ctrl_if_unregister_receiver(
+ u8 type, ctrl_msg_handler_t hnd);
+
+/* Suspend/resume notifications. */
+void ctrl_if_suspend(void);
+void ctrl_if_resume(void);
+
+/* Start-of-day setup. */
+void ctrl_if_init(void);
+
+/*
+ * Returns TRUE if there are no outstanding message requests at the
domain
+ * controller. This can be used to ensure that messages have really
flushed
+ * through when it is not possible to use the response-callback
interface.
+ * WARNING: If other subsystems are using the control interface then
this
+ * function might never return TRUE!
+ */
+int ctrl_if_transmitter_empty(void); /* !! DANGEROUS FUNCTION !! */
+
+/*
+ * Manually discard response messages from the domain controller.
+ * WARNING: This is usually done automatically -- this function should
only
+ * be called when normal interrupt mechanisms are disabled!
+ */
+void ctrl_if_discard_responses(void); /* !! DANGEROUS FUNCTION !! */
+
+#endif /* __ASM_XEN__CONTROL_IF_H__ */
Property changes on: branches/xen/reactos/include/xen2/private/ctrl_if.h
___________________________________________________________________
Name: svn:keywords
+ Author Date Id Revision
Name: svn:eol-style
+ native
_____
Added: branches/xen/reactos/include/xen2/private/evtchn.h
--- branches/xen/reactos/include/xen2/private/evtchn.h 2005-04-01
21:44:22 UTC (rev 14426)
+++ branches/xen/reactos/include/xen2/private/evtchn.h 2005-04-01
22:39:20 UTC (rev 14427)
@@ -0,0 +1,64 @@
+/**********************************************************************
********
+ * evtchn.h
+ *
+ * Communication via Xen event channels.
+ * Also definitions for the device that demuxes notifications to
userspace.
+ *
+ * Copyright (c) 2004, K A Fraser
+ *
+ * This file may be distributed separately from the Linux kernel, or
+ * incorporated into other software packages, subject to the following
license:
+ *
+ * Permission is hereby granted, free of charge, to any person
obtaining a copy
+ * of this source file (the "Software"), to deal in the Software
without
+ * restriction, including without limitation the rights to use, copy,
modify,
+ * merge, publish, distribute, sublicense, and/or sell copies of the
Software,
+ * and to permit persons to whom the Software is furnished to do so,
subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS
+ * IN THE SOFTWARE.
+ */
+
+#ifndef __ASM_EVTCHN_H__
+#define __ASM_EVTCHN_H__
+
+#include <hypervisor.h>
+#include <event_channel.h>
+
+/*
+ * LOW-LEVEL DEFINITIONS
+ */
+
+static inline void notify_via_evtchn(int port)
+{
+ evtchn_op_t op;
+ op.cmd = EVTCHNOP_send;
+ op.u.send.local_port = port;
+ (void)HYPERVISOR_event_channel_op(&op);
+}
+
+/*
+ * CHARACTER-DEVICE DEFINITIONS
+ */
+
+/* /dev/xen/evtchn resides at device number major=10, minor=201 */
+#define EVTCHN_MINOR 201
+
+/* /dev/xen/evtchn ioctls: */
+/* EVTCHN_RESET: Clear and reinit the event buffer. Clear error
condition. */
+#define EVTCHN_RESET _IO('E', 1)
+/* EVTCHN_BIND: Bind to teh specified event-channel port. */
+#define EVTCHN_BIND _IO('E', 2)
+/* EVTCHN_UNBIND: Unbind from the specified event-channel port. */
+#define EVTCHN_UNBIND _IO('E', 3)
+
+#endif /* __ASM_EVTCHN_H__ */
Property changes on: branches/xen/reactos/include/xen2/private/evtchn.h
___________________________________________________________________
Name: svn:keywords
+ Author Date Id Revision
Name: svn:eol-style
+ native
_____
Added: branches/xen/reactos/include/xen2/private/hypervisor.h
--- branches/xen/reactos/include/xen2/private/hypervisor.h
2005-04-01 21:44:22 UTC (rev 14426)
+++ branches/xen/reactos/include/xen2/private/hypervisor.h
2005-04-01 22:39:20 UTC (rev 14427)
@@ -0,0 +1,492 @@
+/**********************************************************************
********
+ * hypervisor.h
+ *
+ * Linux-specific hypervisor handling.
+ *
+ * Copyright (c) 2002-2004, K A Fraser
+ *
+ * This file may be distributed separately from the Linux kernel, or
+ * incorporated into other software packages, subject to the following
license:
+ *
+ * Permission is hereby granted, free of charge, to any person
obtaining a copy
+ * of this source file (the "Software"), to deal in the Software
without
+ * restriction, including without limitation the rights to use, copy,
modify,
+ * merge, publish, distribute, sublicense, and/or sell copies of the
Software,
+ * and to permit persons to whom the Software is furnished to do so,
subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS
+ * IN THE SOFTWARE.
+ */
+
+#ifndef __HYPERVISOR_H__
+#define __HYPERVISOR_H__
+
+#include <xen.h>
+#include <dom0_ops.h>
+#include <io/domain_controller.h>
+
+/*
+ * Assembler stubs for hyper-calls.
+ */
+
+static inline int
+HYPERVISOR_set_trap_table(
+ trap_info_t *table)
+{
+ int ret;
+ unsigned long ignore;
+
+ __asm__ __volatile__ (
+ TRAP_INSTR
+ : "=a" (ret), "=b" (ignore)
+ : "0" (__HYPERVISOR_set_trap_table), "1" (table)
+ : "memory" );
+
+ return ret;
+}
+
+static inline int
+HYPERVISOR_mmu_update(
+ mmu_update_t *req, int count, int *success_count)
+{
+ int ret;
+ unsigned long ign1, ign2, ign3;
+
+ __asm__ __volatile__ (
+ TRAP_INSTR
+ : "=a" (ret), "=b" (ign1), "=c" (ign2),
"=d" (ign3)
+ : "0" (__HYPERVISOR_mmu_update), "1" (req), "2" (count),
+ "3" (success_count)
+ : "memory" );
+
+ return ret;
+}
+
+static inline int
+HYPERVISOR_set_gdt(
+ unsigned long *frame_list, int entries)
+{
+ int ret;
+ unsigned long ign1, ign2;
+
+ __asm__ __volatile__ (
+ TRAP_INSTR
+ : "=a" (ret), "=b" (ign1), "=c" (ign2)
+ : "0" (__HYPERVISOR_set_gdt), "1" (frame_list), "2"
(entries)
+ : "memory" );
+
+
+ return ret;
+}
+
+static inline int
+HYPERVISOR_stack_switch(
+ unsigned long ss, unsigned long esp)
+{
+ int ret;
+ unsigned long ign1, ign2;
+
+ __asm__ __volatile__ (
+ TRAP_INSTR
+ : "=a" (ret), "=b" (ign1), "=c" (ign2)
+ : "0" (__HYPERVISOR_stack_switch), "1" (ss), "2" (esp)
+ : "memory" );
+
+ return ret;
+}
+
+static inline int
+HYPERVISOR_set_callbacks(
+ unsigned long event_selector, unsigned long event_address,
+ unsigned long failsafe_selector, unsigned long failsafe_address)
+{
+ int ret;
+ unsigned long ign1, ign2, ign3, ign4;
+
+ __asm__ __volatile__ (
+ TRAP_INSTR
+ : "=a" (ret), "=b" (ign1), "=c" (ign2),
"=d" (ign3), "=S"
(ign4)
+ : "0" (__HYPERVISOR_set_callbacks), "1" (event_selector),
+ "2" (event_address), "3" (failsafe_selector), "4"
(failsafe_address)
+ : "memory" );
+
+ return ret;
+}
+
+static inline int
+HYPERVISOR_fpu_taskswitch(
+ int set)
+{
+ int ret;
+ unsigned long ign;
+
+ __asm__ __volatile__ (
+ TRAP_INSTR
+ : "=a" (ret), "=b" (ign)
+ : "0" (__HYPERVISOR_fpu_taskswitch), "1" (set)
+ : "memory" );
+
+ return ret;
+}
+
+static inline int
+HYPERVISOR_yield(
+ void)
+{
+ int ret;
+ unsigned long ign;
+
+ __asm__ __volatile__ (
+ TRAP_INSTR
+ : "=a" (ret), "=b" (ign)
+ : "0" (__HYPERVISOR_sched_op), "1" (SCHEDOP_yield)
+ : "memory" );
+
+ return ret;
+}
+
+static inline int
+HYPERVISOR_block(
+ void)
+{
+ int ret;
+ unsigned long ign1;
+ __asm__ __volatile__ (
+ TRAP_INSTR
+ : "=a" (ret), "=b" (ign1)
+ : "0" (__HYPERVISOR_sched_op), "1" (SCHEDOP_block)
+ : "memory" );
+
+ return ret;
+}
+
+static inline int
+HYPERVISOR_shutdown(
+ void)
+{
+ int ret;
+ unsigned long ign1;
+ __asm__ __volatile__ (
+ TRAP_INSTR
+ : "=a" (ret), "=b" (ign1)
+ : "0" (__HYPERVISOR_sched_op),
+ "1" (SCHEDOP_shutdown | (SHUTDOWN_poweroff <<
SCHEDOP_reasonshift))
+ : "memory" );
+
+ return ret;
+}
+
+static inline int
+HYPERVISOR_reboot(
+ void)
+{
+ int ret;
+ unsigned long ign1;
+ __asm__ __volatile__ (
+ TRAP_INSTR
+ : "=a" (ret), "=b" (ign1)
+ : "0" (__HYPERVISOR_sched_op),
+ "1" (SCHEDOP_shutdown | (SHUTDOWN_reboot <<
SCHEDOP_reasonshift))
+ : "memory" );
+
+ return ret;
+}
+
+static inline int
+HYPERVISOR_suspend(
+ unsigned long srec)
+{
+ int ret;
+ unsigned long ign1, ign2;
+
+ /* NB. On suspend, control software expects a suspend record in
%esi. */
+ __asm__ __volatile__ (
+ TRAP_INSTR
+ : "=a" (ret), "=b" (ign1), "=S" (ign2)
+ : "0" (__HYPERVISOR_sched_op),
+ "b" (SCHEDOP_shutdown | (SHUTDOWN_suspend <<
SCHEDOP_reasonshift)),
+ "S" (srec) : "memory");
+
+ return ret;
+}
+
+static inline long
+HYPERVISOR_set_timer_op(
+ u64 timeout)
+{
+ int ret;
+ unsigned long timeout_hi = (unsigned long)(timeout>>32);
+ unsigned long timeout_lo = (unsigned long)timeout;
+ unsigned long ign1, ign2;
+
+ __asm__ __volatile__ (
+ TRAP_INSTR
+ : "=a" (ret), "=b" (ign1), "=c" (ign2)
+ : "0" (__HYPERVISOR_set_timer_op), "b" (timeout_hi), "c"
(timeout_lo)
+ : "memory");
+
+ return ret;
+}
+
+static inline int
+HYPERVISOR_dom0_op(
+ dom0_op_t *dom0_op)
+{
+ int ret;
+ unsigned long ign1;
+
+ dom0_op->interface_version = DOM0_INTERFACE_VERSION;
+ __asm__ __volatile__ (
+ TRAP_INSTR
+ : "=a" (ret), "=b" (ign1)
+ : "0" (__HYPERVISOR_dom0_op), "1" (dom0_op)
+ : "memory");
+
+ return ret;
+}
+
+static inline int
+HYPERVISOR_set_debugreg(
+ int reg, unsigned long value)
+{
+ int ret;
+ unsigned long ign1, ign2;
+ __asm__ __volatile__ (
+ TRAP_INSTR
+ : "=a" (ret), "=b" (ign1), "=c" (ign2)
+ : "0" (__HYPERVISOR_set_debugreg), "1" (reg), "2" (value)
+ : "memory" );
+
+ return ret;
+}
+
+static inline unsigned long
+HYPERVISOR_get_debugreg(
+ int reg)
+{
+ unsigned long ret;
+ unsigned long ign;
+ __asm__ __volatile__ (
+ TRAP_INSTR
+ : "=a" (ret), "=b" (ign)
+ : "0" (__HYPERVISOR_get_debugreg), "1" (reg)
+ : "memory" );
+
+ return ret;
+}
+
+static inline int
+HYPERVISOR_update_descriptor(
+ unsigned long ma, unsigned long word1, unsigned long word2)
+{
+ int ret;
+ unsigned long ign1, ign2, ign3;
+
+ __asm__ __volatile__ (
+ TRAP_INSTR
+ : "=a" (ret), "=b" (ign1), "=c" (ign2),
"=d" (ign3)
+ : "0" (__HYPERVISOR_update_descriptor), "1" (ma), "2"
(word1),
+ "3" (word2)
+ : "memory" );
+
+ return ret;
+}
+
+static inline int
+HYPERVISOR_set_fast_trap(
+ int idx)
+{
+ int ret;
+ unsigned long ign;
+
+ __asm__ __volatile__ (
+ TRAP_INSTR
+ : "=a" (ret), "=b" (ign)
+ : "0" (__HYPERVISOR_set_fast_trap), "1" (idx)
+ : "memory" );
+
+ return ret;
+}
+
+static inline int
+HYPERVISOR_dom_mem_op(
+ unsigned int op, unsigned long *extent_list,
+ unsigned long nr_extents, unsigned int extent_order)
+{
+ int ret;
+ unsigned long ign1, ign2, ign3, ign4, ign5;
+
+ __asm__ __volatile__ (
+ TRAP_INSTR
+ : "=a" (ret), "=b" (ign1), "=c" (ign2),
"=d" (ign3), "=S"
(ign4),
+ "=D" (ign5)
+ : "0" (__HYPERVISOR_dom_mem_op), "1" (op), "2"
(extent_list),
+ "3" (nr_extents), "4" (extent_order), "5" (DOMID_SELF)
+ : "memory" );
+
+ return ret;
+}
+
+static inline int
+HYPERVISOR_multicall(
+ void *call_list, int nr_calls)
+{
+ int ret;
+ unsigned long ign1, ign2;
+
+ __asm__ __volatile__ (
+ TRAP_INSTR
+ : "=a" (ret), "=b" (ign1), "=c" (ign2)
+ : "0" (__HYPERVISOR_multicall), "1" (call_list), "2"
(nr_calls)
+ : "memory" );
+
+ return ret;
+}
+
+static inline int
+HYPERVISOR_update_va_mapping(
+ unsigned long va, pte_t new_val, unsigned long flags)
+{
+ int ret;
+ unsigned long ign1, ign2, ign3;
+
+ __asm__ __volatile__ (
+ TRAP_INSTR
+ : "=a" (ret), "=b" (ign1), "=c" (ign2),
"=d" (ign3)
+ : "0" (__HYPERVISOR_update_va_mapping),
+ "1" (va), "2" ((new_val).pte_low), "3" (flags)
+ : "memory" );
+
+#ifdef TODO
+ if ( unlikely(ret < 0) )
+ {
+ printk(KERN_ALERT "Failed update VA mapping: %08lx, %08lx,
%08lx\n",
+ va, (new_val).pte_low, flags);
+ BUG();
+ }
+#endif
+
+ return ret;
+}
[truncated at 1000 lines; 2890 more skipped]