return status;
}
+
+NTSTATUS
+HvmGetMemoryType(
+ IN PFN_NUMBER Pfn,
+ OUT ULONG *Type
+ )
+{
+ struct xen_hvm_get_mem_type op;
+ LONG_PTR rc;
+ NTSTATUS status;
+
+ RtlZeroMemory(&op, sizeof(struct xen_hvm_get_mem_type));
+
+ op.domid = DOMID_SELF;
+ op.pfn = Pfn;
+
+ rc = HvmOp(HVMOP_get_mem_type, &op);
+
+ if (rc < 0)
+ goto fail1;
+
+ *Type = op.mem_type;
+
+ return STATUS_SUCCESS;
+
+fail1:
+ ERRNO_TO_STATUS(-rc, status);
+ LogError("fail1 (%08x)\n", status);
+
+ return status;
+}
#include "pdoinquiry.h"
#include "austere.h"
+#include "hvm.h"
#include "store.h"
#include "gnttab.h"
#include "evtchn.h"
+#include <xen/hvm/hvm_op.h>
#include <xencdb.h>
#include "log.h"
#include "assert.h"
// free bounce buffer
if (Request->Segments[Index].BufferId) {
- if (Request->Operation == BLKIF_OP_READ && CopyOut) {
- BufferCopyOut(Request->Segments[Index].BufferId, (PUCHAR)Request->Segments[Index].Buffer, Request->Segments[Index].Length);
+ if (Request->Operation == BLKIF_OP_READ && CopyOut &&
+ Request->Segments[Index].Buffer) {
+ BufferCopyOut(Request->Segments[Index].BufferId,
+ (PUCHAR)Request->Segments[Index].Buffer,
+ Request->Segments[Index].Length);
}
BufferPut(Request->Segments[Index].BufferId);
Request->Segments[Index].BufferId = 0;
- MmUnmapLockedPages(Request->Segments[Index].Buffer, &Request->Segments[Index].Mdl);
+ if (Request->Segments[Index].Buffer)
+ MmUnmapLockedPages(Request->Segments[Index].Buffer,
+ &Request->Segments[Index].Mdl);
}
}
SGIndex.LastLength = 0;
__GetPhysAddr(SGList, &SGIndex, &PhysAddr, &PhysLen);
if (__PhysAddrIsAligned(PhysAddr, PhysLen, SectorSize - 1)) {
+ ULONG Type;
+
// get first sector, last sector and count
FirstSector = (__Offset(PhysAddr) + SectorSize - 1) / SectorSize;
SectorsNow = __Min(NumSectors - SectorsDone, SectorsPerPage - FirstSector);
// simples - grab Pfn of PhysAddr
Pfn = __Pfn(PhysAddr);
+
+ Status = HvmGetMemoryType(Pfn, &Type);
+ if (!NT_SUCCESS(Status))
+ LogWarning("Unable to get type for PFN %lx\n", Pfn);
+ else if (Type != HVMMEM_ram_rw) {
+ ULONG BufferId;
+
+ if (!BufferGet(&BufferId, &Pfn)) {
+ Pdo->NeedsWake = TRUE;
+ __CleanupSrb(Srb);
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+ Request->Segments[Index2].BufferId = BufferId;
+ }
} else {
PMDL Mdl;
ULONG BufferId;
)
{
FrontendEvtchnCallback(&Pdo->Frontend);
-}
\ No newline at end of file
+}