Read from disk
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
Added: branches/xen/reactos/boot/freeldr/freeldr/arch/i386/xendisk.c
Modified:
branches/xen/reactos/boot/freeldr/freeldr/arch/i386/xenevtchn.c
Modified: branches/xen/reactos/boot/freeldr/freeldr/arch/i386/xenmem.c
_____
Modified: branches/xen/reactos/boot/freeldr/freeldr/Makefile
--- branches/xen/reactos/boot/freeldr/freeldr/Makefile 2005-04-14
21:46:14 UTC (rev 14621)
+++ branches/xen/reactos/boot/freeldr/freeldr/Makefile 2005-04-14
21:47:57 UTC (rev 14622)
@@ -173,6 +173,7 @@
xboxvideo.o \
xencons.o \
xenctrlif.o \
+ xendisk.o \
xenentry.o \
xenevtchn.o \
xenmem.o \
_____
Modified: branches/xen/reactos/boot/freeldr/freeldr/arch/i386/machxen.c
--- branches/xen/reactos/boot/freeldr/freeldr/arch/i386/machxen.c
2005-04-14 21:46:14 UTC (rev 14621)
+++ branches/xen/reactos/boot/freeldr/freeldr/arch/i386/machxen.c
2005-04-14 21:47:57 UTC (rev 14622)
@@ -274,14 +274,6 @@
}
BOOL
-XenDiskReadLogicalSectors(ULONG DriveNumber, ULONGLONG SectorNumber,
- ULONG SectorCount, PVOID Buffer)
- {
- XEN_UNIMPLEMENTED("XenDiskReadLogicalSectors");
- return FALSE;
- }
-
-BOOL
XenDiskGetPartitionEntry(ULONG DriveNumber, ULONG PartitionNumber,
PPARTITION_TABLE_ENTRY PartitionTableEntry)
{
_____
Modified: branches/xen/reactos/boot/freeldr/freeldr/arch/i386/machxen.h
--- branches/xen/reactos/boot/freeldr/freeldr/arch/i386/machxen.h
2005-04-14 21:46:14 UTC (rev 14621)
+++ branches/xen/reactos/boot/freeldr/freeldr/arch/i386/machxen.h
2005-04-14 21:47:57 UTC (rev 14622)
@@ -35,7 +35,6 @@
extern shared_info_t *XenSharedInfo;
VOID XenMachInit(VOID);
-VOID XenMemInit(start_info_t *StartInfo);
VOID XenCtrlIfInit();
BOOL XenCtrlIfSendMessageNoblock(ctrl_msg_t *Msg);
@@ -46,6 +45,7 @@
VOID XenCtrlIfHandleEvent();
VOID XenCtrlIfSendResponse(ctrl_msg_t *Msg);
+VOID XenEvtchnRegisterDisk(unsigned DiskEvtchn);
VOID XenEvtchnRegisterCtrlIf(unsigned CtrlIfEvtchn);
VOID XenEvtchnDisableEvents();
VOID XenEvtchnEnableEvents();
@@ -71,11 +71,14 @@
VOID XenVideoPrepareForReactOS(VOID);
ULONG XenMemGetMemoryMap(PBIOS_MEMORY_MAP BiosMemoryMap, ULONG
MaxMemoryMapSize);
+VOID XenMemInit(start_info_t *StartInfo);
+u32 XenMemVirtualToMachine(void *VirtualAddress);
BOOL XenDiskReadLogicalSectors(ULONG DriveNumber, ULONGLONG
SectorNumber, ULONG SectorCount, PVOID Buffer);
BOOL XenDiskGetPartitionEntry(ULONG DriveNumber, ULONG PartitionNumber,
PPARTITION_TABLE_ENTRY PartitionTableEntry);
BOOL XenDiskGetDriveGeometry(ULONG DriveNumber, PGEOMETRY
DriveGeometry);
ULONG XenDiskGetCacheableBlockCount(ULONG DriveNumber);
+VOID XenDiskHandleEvent();
VOID XenRTCGetCurrentDateTime(PULONG Year, PULONG Month, PULONG Day,
PULONG Hour, PULONG Minute, PULONG Second);
_____
Added: branches/xen/reactos/boot/freeldr/freeldr/arch/i386/xendisk.c
--- branches/xen/reactos/boot/freeldr/freeldr/arch/i386/xendisk.c
2005-04-14 21:46:14 UTC (rev 14621)
+++ branches/xen/reactos/boot/freeldr/freeldr/arch/i386/xendisk.c
2005-04-14 21:47:57 UTC (rev 14622)
@@ -0,0 +1,523 @@
+/*
+ * 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.
+ *
+ * Based on XenoLinux drivers/xen/blkfront/blkfront.c
+ * Copyright (c) 2003-2004, Keir Fraser & Steve Hand
+ * Modifications by Mark A. Williamson are (c) Intel Research Cambridge
+ * Copyright (c) 2004, Christian Limpach
+ * Copyright (c) 2004, Andrew Warfield
+ * Copyright (c) 2005, Christopher Clark
+ *
+ * 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.
+ */
+
+#include "freeldr.h"
+#include "machxen.h"
+#include "evtchn.h"
+#include "io/blkif.h"
+#if 2 != XEN_VER
+#include "io/ring.h"
+#endif /* XEN_VER */
+
+#define DISK_STATE_CLOSED 0
+#define DISK_STATE_DISCONNECTED 1
+#define DISK_STATE_CONNECTED 2
+
+typedef struct _XENDISKINFO
+{
+ ULONGLONG SectorCount;
+ ULONG DriveNumber;
+ blkif_vdev_t XenDevice;
+ u16 XenInfo;
+} XENDISKINFO, *PXENDISKINFO;
+
+static BOOL XenDiskInitialized = FALSE;
+static unsigned XenDiskState = DISK_STATE_CLOSED;
+static unsigned XenDiskEvtchn;
+#if 2 == XEN_VER
+static blkif_ring_t *XenDiskRing = NULL;
+static BLKIF_RING_IDX XenDiskRespCons; /* Response consumer for comms
ring. */
+static BLKIF_RING_IDX XenDiskReqProd; /* Private request producer.
*/
+#else
+static blkif_front_ring_t XenDiskRing;
+#endif /* XEN_VER */
+static BOOL XenDiskRspReceived;
+static unsigned XenDiskCount;
+static PXENDISKINFO XenDiskInfo;
+
+static void *XenDiskScratchPage;
+static u32 XenDiskScratchMachine;
+
+static void *
+XenDiskAllocatePageAlignedMemory(unsigned Size)
+{
+ void *Area;
+
+ Area = MmAllocateMemory(Size);
+ if (0 != ((ULONG_PTR) Area & (PAGE_SIZE - 1)))
+ {
+ printf("Got an unaligned page\n");
+ XenDie();
+ }
+
+ return Area;
+}
+
+/* Tell the controller to bring up the interface. */
+static void
+XenDiskSendInterfaceConnect(void)
+{
+ ctrl_msg_t CMsg;
+ blkif_fe_interface_connect_t *Msg;
+
+ CMsg.type = CMSG_BLKIF_FE,
+ CMsg.subtype = CMSG_BLKIF_FE_INTERFACE_CONNECT,
+ CMsg.length = sizeof(blkif_fe_interface_connect_t),
+ Msg = (void*)CMsg.msg;
+
+ Msg->handle = 0;
+#if 2 == XEN_VER
+ Msg->shmem_frame = (XenMemVirtualToMachine(XenDiskRing) >>
PAGE_SHIFT);
+#else /* XEN_VER */
+ Msg->shmem_frame = (XenMemVirtualToMachine(XenDiskRing.sring) >>
PAGE_SHIFT);
+#endif /* XEN_VER */
+
+ XenCtrlIfSendMessageBlock(&CMsg);
+}
+
+/* Move from CLOSED to DISCONNECTED state. */
+static void
+XenDiskDisconnect(void)
+{
+#if 2 == XEN_VER
+ if (NULL != XenDiskRing)
+ {
+ MmFreeMemory(XenDiskRing);
+ }
+
+ XenDiskRing = (blkif_ring_t
*)XenDiskAllocatePageAlignedMemory(PAGE_SIZE);
+ XenDiskRing->req_prod = 0;
+ XenDiskRing->resp_prod = 0;
+ XenDiskRespCons = 0;
+ XenDiskReqProd = 0;
+#else /* XEN_VER */
+ blkif_sring_t *SRing;
+
+ if (NULL != XenDiskRing.sring)
+ {
+ MmFreeMemory(XenDiskRing.sring);
+ }
+
+ SRing = (blkif_sring_t *)XenDiskAllocatePageAlignedMemory(PAGE_SIZE);
+ SHARED_RING_INIT(SRing);
+ FRONT_RING_INIT(&XenDiskRing, SRing, PAGE_SIZE);
+#endif /* XEN_VER */
+
+ XenDiskState = DISK_STATE_DISCONNECTED;
+ XenDiskSendInterfaceConnect();
+}
+
+VOID
+XenDiskHandleEvent()
+{
+ XenDiskRspReceived = TRUE;
+}
+
+static void
+XenDiskConnect(blkif_fe_interface_status_t *Status)
+{
+ XenDiskEvtchn = Status->evtchn;
+ XenEvtchnRegisterDisk(XenDiskEvtchn);
+
+#ifdef CONFIG_XEN_BLKDEV_GRANT
+ rdomid = status->domid;
+#endif
+
+ XenDiskState = DISK_STATE_CONNECTED;
+}
+
+static void
+XenDiskFree(void)
+{
+ XenDiskState = DISK_STATE_DISCONNECTED;
+
+ /* Free resources associated with old device channel. */
+#if 2 == XEN_VER
+ if (NULL != XenDiskRing)
+ {
+ MmFreeMemory(XenDiskRing);
+ XenDiskRing = NULL;
+ }
+#else /* XEN_VER */
+ if (NULL != XenDiskRing.sring)
+ {
+ MmFreeMemory(XenDiskRing.sring);
+ XenDiskRing.sring = NULL;
+ }
+#endif /* XEN_VER */
+
+ XenDiskEvtchn = 0;
+}
+
+static void
+XenDiskReset()
+{
+ XenDiskFree();
+ XenDiskDisconnect();
+}
+
+static void
+XenDiskStatus(blkif_fe_interface_status_t *Status)
+{
+ switch (Status->status)
+ {
+ case BLKIF_INTERFACE_STATUS_DISCONNECTED:
+ switch (XenDiskState)
+ {
+ case DISK_STATE_CLOSED:
+ XenDiskDisconnect();
+ break;
+ case DISK_STATE_DISCONNECTED:
+ case DISK_STATE_CONNECTED:
+ /* unexpected(status); */ /* occurs during suspend/resume */
+ XenDiskReset();
+ break;
+ }
+ break;
+
+ case BLKIF_INTERFACE_STATUS_CONNECTED:
+ switch (XenDiskState)
+ {
+ case DISK_STATE_CLOSED:
+ XenDiskDisconnect();
+ XenDiskConnect(Status);
+ break;
+ case DISK_STATE_DISCONNECTED:
+ XenDiskConnect(Status);
+ break;
+ case DISK_STATE_CONNECTED:
+ XenDiskConnect(Status);
+ break;
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+static void
+XenDiskMsgHandler(ctrl_msg_t *Msg, unsigned long Id)
+{
+ switch (Msg->subtype)
+ {
+ case CMSG_BLKIF_FE_INTERFACE_STATUS:
+ XenDiskStatus((blkif_fe_interface_status_t *)
+ &Msg->msg[0]);
+ break;
+ default:
+ Msg->length = 0;
+ break;
+ }
+
+ XenCtrlIfSendResponse(Msg);
+}
+
+static void
+XenDiskSendDriverStatus(BOOL Up)
+{
+ ctrl_msg_t CMsg;
+ blkif_fe_driver_status_t *Msg = (void*) CMsg.msg;
+
+ CMsg.type = CMSG_BLKIF_FE;
+ CMsg.subtype = CMSG_BLKIF_FE_DRIVER_STATUS;
+ CMsg.length = sizeof(blkif_fe_driver_status_t);
+
+ Msg->status = (Up ? BLKIF_DRIVER_STATUS_UP :
BLKIF_DRIVER_STATUS_DOWN);
+
+ XenCtrlIfSendMessageBlock(&CMsg);
+}
+
+static void
+XenDiskWaitForState(unsigned State)
+{
+ /* FIXME maybe introduce a timeout here? */
+ while (TRUE)
+ {
+ XenEvtchnDisableEvents();
+ if (XenDiskState == State)
+ {
+ XenEvtchnEnableEvents();
+ return;
+ }
+ HYPERVISOR_block();
+ }
+}
+
+static BOOL
+XenDiskControlSend(blkif_request_t *Req, blkif_response_t *Rsp)
+{
+#if 2 != XEN_VER
+ blkif_request_t *DReq;
+#endif /* XEN_VER */
+ blkif_response_t *SRsp;
+
+ while (TRUE)
+ {
+ XenEvtchnDisableEvents();
+#if 2 == XEN_VER
+ if (BLKIF_RING_SIZE != (XenDiskReqProd - XenDiskRespCons))
+#else /* XEN_VER */
+ if (! RING_FULL(&XenDiskRing))
+#endif
+ {
+ break;
+ }
+ HYPERVISOR_block();
+ }
+
+ if (DISK_STATE_CONNECTED != XenDiskState)
+ {
+ XenEvtchnEnableEvents();
+ return FALSE;
+ }
+
+#if 2 == XEN_VER
+ XenDiskRing->ring[MASK_BLKIF_IDX(XenDiskReqProd)].req = *Req;
+ XenDiskReqProd++;
+ XenDiskRing->req_prod = XenDiskReqProd;
+#else /* XEN_VER */
+ DReq = RING_GET_REQUEST(&XenDiskRing, XenDiskRing.req_prod_pvt);
+ *DReq = *Req;
+
+ XenDiskRing.req_prod_pvt++;
+ RING_PUSH_REQUESTS(&XenDiskRing);
+#endif /* XEN_VER */
+ XenDiskRspReceived = FALSE;
+
+ XenEvtchnEnableEvents();
+
+ notify_via_evtchn(XenDiskEvtchn);
+
+ while (TRUE)
+ {
+ XenEvtchnDisableEvents();
+ if (XenDiskRspReceived)
+ {
+ break;
+ }
+ HYPERVISOR_block();
+ }
+
+ if (DISK_STATE_CONNECTED != XenDiskState)
+ {
+ XenEvtchnEnableEvents();
+ return FALSE;
+ }
+
+#if 2 == XEN_VER
+ SRsp = &XenDiskRing->ring[MASK_BLKIF_IDX(XenDiskRespCons)].resp;
+ *Rsp = *SRsp;
+ XenDiskRespCons++;
+#else /* XEN_VER */
+ SRsp = RING_GET_RESPONSE(&XenDiskRing, XenDiskRing.rsp_cons);
+ *Rsp = *SRsp;
+ XenDiskRing.rsp_cons++;
+#endif /* XEN_VER */
+
+ XenDiskRspReceived = FALSE;
+ XenEvtchnEnableEvents();
+
+ return TRUE;
+}
+
+static void
+XenDiskProbe()
+{
+ blkif_response_t Rsp;
+ blkif_request_t Req;
+ unsigned Disk;
+ vdisk_t *Probe;
+ ULONG FloppyNumber, CDRomNumber, HarddiskNumber;
+
+ memset(&Req, 0, sizeof(blkif_request_t));
+ Req.operation = BLKIF_OP_PROBE;
+ Req.nr_segments = 1;
+#ifdef CONFIG_XEN_BLKDEV_GRANT
+ blkif_control_probe_send(&req, &rsp,
+ (unsigned long)(virt_to_machine(buf)));
+#else
+ Req.frame_and_sects[0] = XenDiskScratchMachine | 7;
+
+ if (! XenDiskControlSend(&Req, &Rsp))
+ {
+ printf("Unexpected disk disconnect\n");
+ XenDie();
+ }
+#endif
+
+ if (Rsp.status <= 0)
+ {
+ printf("Could not probe disks (%d)\n", Rsp.status);
+ XenDie();
+ }
+
+ XenDiskCount = Rsp.status;
+ XenDiskInfo = MmAllocateMemory(XenDiskCount * sizeof(XENDISKINFO));
+ if (NULL == XenDiskInfo)
+ {
+ XenDie();
+ }
+ Probe = (vdisk_t *) XenDiskScratchPage;
+ FloppyNumber = 0x00;
+ HarddiskNumber = 0x80;
+ CDRomNumber = 0x9f;
+ for (Disk = 0; Disk < XenDiskCount; Disk++)
+ {
+ XenDiskInfo[Disk].SectorCount = Probe[Disk].capacity;
+ switch (VDISK_TYPE(Probe[Disk].info))
+ {
+ case VDISK_TYPE_FLOPPY:
+ XenDiskInfo[Disk].DriveNumber = FloppyNumber++;
+ break;
+ case VDISK_TYPE_CDROM:
+ XenDiskInfo[Disk].DriveNumber = CDRomNumber--;
+ break;
+ case VDISK_TYPE_DISK:
+ XenDiskInfo[Disk].DriveNumber = HarddiskNumber++;
+ break;
+ case VDISK_TYPE_TAPE:
+ case VDISK_TYPE_OPTICAL:
+ default:
+ XenDiskInfo[Disk].DriveNumber = 0xff;
+ break;
+ }
+ XenDiskInfo[Disk].XenDevice = Probe[Disk].device;
+ XenDiskInfo[Disk].XenInfo = Probe[Disk].info;
+ }
+}
+
+static void
+XenDiskInit()
+{
+ XenDiskState = DISK_STATE_CLOSED;
+
+ if (NULL == XenDiskScratchPage)
+ {
+ XenDiskScratchPage = XenDiskAllocatePageAlignedMemory(PAGE_SIZE);
+ XenDiskScratchMachine =
XenMemVirtualToMachine(XenDiskScratchPage);
+ }
+
+ XenCtrlIfRegisterReceiver(CMSG_BLKIF_FE, XenDiskMsgHandler);
+
+ XenDiskSendDriverStatus(TRUE);
+ XenDiskWaitForState(DISK_STATE_CONNECTED);
+
+ XenDiskProbe();
+}
+
+BOOL
+XenDiskReadLogicalSectors(ULONG DriveNumber, ULONGLONG SectorNumber,
+ ULONG SectorCount, PVOID Buffer)
+{
+ blkif_response_t Rsp;
+ blkif_request_t Req;
+ ULONG SectorSize;
+ ULONG Count;
+ BOOL Found;
+ unsigned Disk;
+ blkif_vdev_t Device;
+
+ if (! XenDiskInitialized)
+ {
+ XenDiskInitialized = TRUE;
+ XenDiskInit();
+ }
+
+ Found = FALSE;
+ Device = 0;
+ for (Disk = 0; Disk < XenDiskCount && ! Found; Disk++)
+ {
+ if (DriveNumber == XenDiskInfo[Disk].DriveNumber)
+ {
+ Device = XenDiskInfo[Disk].XenDevice;
+ Found = TRUE;
+ }
+ }
+ if (! Found)
+ {
+ return FALSE;
+ }
+
+ SectorSize = 512;
+ while (0 < SectorCount)
+ {
+ Count = SectorCount;
+ if (PAGE_SIZE / SectorSize < Count)
+ {
+ Count = PAGE_SIZE / SectorSize;
+ }
+ memset(&Req, 0, sizeof(blkif_request_t));
+ Req.operation = BLKIF_OP_READ;
+ Req.nr_segments = 1;
+ Req.device = Device;
+ Req.id = 0;
+ Req.sector_number = SectorNumber;
+#ifdef CONFIG_XEN_BLKDEV_GRANT
+ blkif_control_probe_send(&req, &rsp,
+ (unsigned long)(virt_to_machine(buf)));
+#else
+ Req.frame_and_sects[0] = XenDiskScratchMachine | (Count - 1);
+
+ if (! XenDiskControlSend(&Req, &Rsp))
+ {
+ return FALSE;
+ }
+#endif
+ if (BLKIF_RSP_OKAY != Rsp.status)
+ {
+ return FALSE;
+ }
+ memcpy(Buffer, XenDiskScratchPage, Count * SectorSize);
+ SectorCount -= Count;
+ SectorNumber += Count;
+ Buffer = (void *)((char *) Buffer + Count * SectorSize);
+ }
+
+ return TRUE;
+}
+
+/* EOF */
Property changes on:
branches/xen/reactos/boot/freeldr/freeldr/arch/i386/xendisk.c
___________________________________________________________________
Name: svn:keywords
+ Author Date Id Revision
Name: svn:eol-style
+ native
_____
Modified:
branches/xen/reactos/boot/freeldr/freeldr/arch/i386/xenevtchn.c
--- branches/xen/reactos/boot/freeldr/freeldr/arch/i386/xenevtchn.c
2005-04-14 21:46:14 UTC (rev 14621)
+++ branches/xen/reactos/boot/freeldr/freeldr/arch/i386/xenevtchn.c
2005-04-14 21:47:57 UTC (rev 14622)
@@ -46,17 +46,16 @@
#define asmlinkage __attribute__((regparm(0)))
-static unsigned XenCtrlIfIndex;
+static int XenCtrlIfIndex = -1;
static u32 XenCtrlIfBit;
+static int XenDiskIndex = -1;
+static u32 XenDiskBit;
-VOID
-XenEvtchnRegisterCtrlIf(unsigned CtrlIfEvtchn)
+static void
+XenEvtchnSetMask()
{
unsigned i;
- XenCtrlIfIndex = CtrlIfEvtchn >> 5;
- XenCtrlIfBit = 1 << (CtrlIfEvtchn & 0x1f);
-
/* Mask all event channels except the one we're interested in */
for (i = 0;
i < sizeof(XenSharedInfo->evtchn_mask)
@@ -65,8 +64,19 @@
{
if (i == XenCtrlIfIndex)
{
- XenSharedInfo->evtchn_mask[i] = ~ XenCtrlIfBit;
+ if (i == XenDiskIndex)
+ {
+ XenSharedInfo->evtchn_mask[i] = ~ (XenCtrlIfBit |
XenDiskBit);
+ }
+ else
+ {
+ XenSharedInfo->evtchn_mask[i] = ~ XenCtrlIfBit;
+ }
}
+ else if (i == XenDiskIndex)
+ {
+ XenSharedInfo->evtchn_mask[i] = ~ XenDiskBit;
+ }
else
{
XenSharedInfo->evtchn_mask[i] = ~ 0;
@@ -74,6 +84,24 @@
}
}
+VOID
+XenEvtchnRegisterCtrlIf(unsigned CtrlIfEvtchn)
+{
+ XenCtrlIfIndex = CtrlIfEvtchn >> 5;
+ XenCtrlIfBit = 1 << (CtrlIfEvtchn & 0x1f);
+
+ XenEvtchnSetMask();
+}
+
+VOID
+XenEvtchnRegisterDisk(unsigned DiskEvtchn)
+{
+ XenDiskIndex = DiskEvtchn >> 5;
+ XenDiskBit = 1 << (DiskEvtchn & 0x1f);
+
+ XenEvtchnSetMask();
+}
+
/* NB. Event delivery is disabled on entry. */
asmlinkage void
XenEvtchnDoUpcall(struct pt_regs *Regs)
@@ -85,12 +113,31 @@
XenSharedInfo->vcpu_data[0].evtchn_pending_sel = 0;
#endif /* XEN_VER */
- while (0 != (XenSharedInfo->evtchn_pending[XenCtrlIfIndex]
- & ~ XenSharedInfo->evtchn_mask[XenCtrlIfIndex]
- & XenCtrlIfBit))
+ while ((0 <= XenDiskIndex
+ && 0 != (XenSharedInfo->evtchn_pending[XenDiskIndex]
+ & ~ XenSharedInfo->evtchn_mask[XenDiskIndex]
+ & XenDiskBit)) ||
+ (0 <= XenCtrlIfIndex
+ && 0 != (XenSharedInfo->evtchn_pending[XenCtrlIfIndex]
+ & ~ XenSharedInfo->evtchn_mask[XenCtrlIfIndex]
+ & XenCtrlIfBit)))
{
- XenSharedInfo->evtchn_pending[XenCtrlIfIndex] &= ~ XenCtrlIfBit;
- XenCtrlIfHandleEvent();
+ if (0 <= XenDiskIndex
+ && 0 != (XenSharedInfo->evtchn_pending[XenDiskIndex]
+ & ~ XenSharedInfo->evtchn_mask[XenDiskIndex]
+ & XenDiskBit))
+ {
+ XenSharedInfo->evtchn_pending[XenDiskIndex] &= ~ XenDiskBit;
+ XenDiskHandleEvent();
+ }
+ if (0 <= XenCtrlIfIndex
+ && 0 != (XenSharedInfo->evtchn_pending[XenCtrlIfIndex]
+ & ~ XenSharedInfo->evtchn_mask[XenCtrlIfIndex]
+ & XenCtrlIfBit))
+ {
+ XenSharedInfo->evtchn_pending[XenCtrlIfIndex] &= ~
XenCtrlIfBit;
+ XenCtrlIfHandleEvent();
+ }
}
}
_____
Modified: branches/xen/reactos/boot/freeldr/freeldr/arch/i386/xenmem.c
--- branches/xen/reactos/boot/freeldr/freeldr/arch/i386/xenmem.c
2005-04-14 21:46:14 UTC (rev 14621)
+++ branches/xen/reactos/boot/freeldr/freeldr/arch/i386/xenmem.c
2005-04-14 21:47:57 UTC (rev 14622)
@@ -26,13 +26,13 @@
/* Page Directory Entry */
typedef struct _PDE
{
- unsigned long Pde;
+ u32 Pde;
} PDE, *PPDE;
/* Page Table Entry */
typedef struct _PTE
{
- unsigned long Pte;
+ u32 Pte;
} PTE, *PPTE;
#define PGDIR_SHIFT 22
@@ -308,4 +308,15 @@
}
}
+u32
+XenMemVirtualToMachine(void *VirtualAddress)
+{
+ PPTE PageTable;
+
+ PageTable = (PPTE)((char *) XenPageDir +
+ (PD_IDX((ULONG_PTR) VirtualAddress) + 1) *
PAGE_SIZE);
+ return PageTable[PT_IDX((ULONG_PTR) VirtualAddress)].Pte
+ & PAGE_MASK;
+}
+
/* EOF */