Apparently I wasn't quick enough to answer (which is not a surprise these days), but I do have some points to raise...
On 11/11/14 00:41, Jordan Justen wrote: > On 2014-11-10 15:05:07, Scott Duplichan wrote: >> OvmfPkg: fix VS2010 build failures >> >> Contributed-under: TianoCore Contribution Agreement 1.0 >> Signed-off-by: Scott Duplichan <sc...@notabs.org> >> --- >> >> Here is one way to get OvmfPkg building with Visual Studio again. >> Several of the changes are needed to make OvmfPkg work with the >> proposed NOOPT build, in combination with IA32 target. The >> combination of 32-bit, Microsoft compiler, and optimization >> disabled causes generation of helper function calls for multiply, >> divide, shift, etc when operating on 64-bit integers. Rather than >> make significant code changes to add explicit function calls, this >> patch type casts some UINT64 integers to UINTN. That way, the 64-bit >> build is unaffected. An argument that this safe is based on the >> fact that the 64-bit values are addresses in most cases, and >> 32-bit code cannot ordinarily access memory above 4GB. In one >> case the 64-bit is the size of flash memory. If a 64MB flash >> memory is used, it would have to be located above 4GB where 32-bit >> code cannot access it. >> >> Other changes are due to Microsoft's warning about integer truncation. >> EDK2 enables this warning for Microsoft tool chains, but not for >> gcc tool chains. At least one integer truncation warning is not >> handled well by the Microsoft compiler, even with version 2010. >> Variable SegmentC holds the value 0xC0000, yet the compiler warns >> it is left shifted by 12 bits. On the other hand, I don't understand >> why the value is left shifted by 12. In any case, the final address >> fits in 32 bits. >> >> For both Microsoft and gcc compilers, the #include "inttypes.h" fails >> for me. The change to XenPvBlkDxe.inf is how I got it to work. > > Can you separate out the 'inttypes.h' Xen fix? The patch has the following diffstat: QemuFlashFvbServicesRuntimeDxe/FwBlockService.c | 6 +-- QemuFlashFvbServicesRuntimeDxe/QemuFlash.c | 2 - QemuVideoDxe/VbeShim.c | 12 +++--- VirtioScsiDxe/VirtioScsi.c | 2 - XenBusDxe/EventChannel.c | 6 +-- XenBusDxe/GrantTable.c | 8 ++-- XenBusDxe/XenBus.c | 6 +-- XenBusDxe/XenHypercall.c | 8 ++-- XenBusDxe/XenStore.c | 28 ++++++++-------- XenPvBlkDxe/BlockFront.c | 18 +++++----- XenPvBlkDxe/BlockIo.c | 2 - XenPvBlkDxe/XenPvBlkDxe.inf | 1 12 files changed, 50 insertions(+), 49 deletions(-) Here's some changes I'd like to see -- these are not "hard requirements" by any means, just how I'd prefer to work with this patch. (1) Please post two independent patches (not even in one series): one for Xen, the other for non-Xen. I'd like to review the non-Xen one, and I think we can ask Anthony Perard to review the Xen one. (2) Please convince SVN somehow to include the function names in the hunks (usually the "-p" option for "diff"). Otherwise it's hard to jump to the containing function with any tags-capable editor. And, such patches cannot be validated without seeing the context. (3) In this case I have the opposite opinion about casts vs. the verbose 64-bit functions, like LShiftU64(), DivU64x32(), etc. Please consider using that family wherever possible, instead of the casts. For example, VirtioBlkDxe already uses ModU64x32() and DivU64x32(). (4) The initial value of SegmentC is a (64-bit) linear address. It is left-shifted by three nibbles for the UINT32 fields in question because those are prepared for 16-bit real mode, and their representation is segment:offset, packed in a UINT32. In other words, the 0x000C_xxxx linear addresses are transformed into C000:xxxx, represented as 0xC000_xxxx. This is required by the VBE (VGA BIOS Extension) docs. > I have a fix for this that doesn't involve StdLib. In fact, we don't > want the StdLib dependency added. Agreed. > Do you want to work on a different fix (without StdLib), or should I > send out the one I have? > > Thanks for looking at these build issues, (We do realize though that the solution would be a build farm, right? I would have absolutely no objections against using the DivU64x32() family and the somewhat retarded casts that VS requires *if* I would see those errors immediately.) Scott, feel free to do whatever you like with my requests -- I'm not NACKing this patch in any way (that would require me to review it), I just don't feel like reviewing it in this form. Thanks! Laszlo > -Jordan > >> --- >> >> Index: OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockService.c >> =================================================================== >> --- OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockService.c (revision >> 16323) >> +++ OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockService.c (working >> copy) >> @@ -919,7 +919,7 @@ >> Status = gBS->AllocatePages ( >> AllocateAddress, >> EfiRuntimeServicesData, >> - (UINTN) EFI_SIZE_TO_PAGES (Length), >> + (UINTN) EFI_SIZE_TO_PAGES ((UINTN)Length), >> &BaseAddress >> ); >> ASSERT_EFI_ERROR (Status); >> @@ -979,7 +979,7 @@ >> // Erase all the blocks >> // >> for (Offset = Start; Offset < Start + Length; Offset += BlockSize) { >> - Status = QemuFlashEraseBlock ((EFI_LBA) Offset / BlockSize); >> + Status = QemuFlashEraseBlock ((EFI_LBA) (Offset / BlockSize)); >> ASSERT_EFI_ERROR (Status); >> } >> >> @@ -988,7 +988,7 @@ >> // >> WriteLength = GoodFwVolHeader->HeaderLength; >> Status = QemuFlashWrite ( >> - (EFI_LBA) Start / BlockSize, >> + (EFI_LBA) (Start / BlockSize), >> 0, >> &WriteLength, >> (UINT8 *) GoodFwVolHeader); >> Index: OvmfPkg/QemuFlashFvbServicesRuntimeDxe/QemuFlash.c >> =================================================================== >> --- OvmfPkg/QemuFlashFvbServicesRuntimeDxe/QemuFlash.c (revision 16323) >> +++ OvmfPkg/QemuFlashFvbServicesRuntimeDxe/QemuFlash.c (working copy) >> @@ -54,7 +54,7 @@ >> IN UINTN Offset >> ) >> { >> - return mFlashBase + (Lba * mFdBlockSize) + Offset; >> + return mFlashBase + ((UINTN)Lba * mFdBlockSize) + Offset; >> } >> >> >> Index: OvmfPkg/QemuVideoDxe/VbeShim.c >> =================================================================== >> --- OvmfPkg/QemuVideoDxe/VbeShim.c (revision 16323) >> +++ OvmfPkg/QemuVideoDxe/VbeShim.c (working copy) >> @@ -153,13 +153,13 @@ >> CopyMem (VbeInfo->Signature, "VESA", 4); >> VbeInfo->VesaVersion = 0x0300; >> >> - VbeInfo->OemNameAddress = (UINT32)(SegmentC << 12 | (UINT16)(UINTN)Ptr); >> + VbeInfo->OemNameAddress = ((UINT32)SegmentC << 12 | (UINT16)(UINTN)Ptr); >> CopyMem (Ptr, "QEMU", 5); >> Ptr += 5; >> >> VbeInfo->Capabilities = BIT0; // DAC can be switched into 8-bit mode >> >> - VbeInfo->ModeListAddress = (UINT32)(SegmentC << 12 | (UINT16)(UINTN)Ptr); >> + VbeInfo->ModeListAddress = ((UINT32)SegmentC << 12 | (UINT16)(UINTN)Ptr); >> *(UINT16*)Ptr = 0x00f1; // mode number >> Ptr += 2; >> *(UINT16*)Ptr = 0xFFFF; // mode list terminator >> @@ -168,17 +168,17 @@ >> VbeInfo->VideoMem64K = (UINT16)((1024 * 768 * 4 + 65535) / 65536); >> VbeInfo->OemSoftwareVersion = 0x0000; >> >> - VbeInfo->VendorNameAddress = (UINT32)(SegmentC << 12 | >> (UINT16)(UINTN)Ptr); >> + VbeInfo->VendorNameAddress = ((UINT32)SegmentC << 12 | >> (UINT16)(UINTN)Ptr); >> CopyMem (Ptr, "OVMF", 5); >> Ptr += 5; >> >> - VbeInfo->ProductNameAddress = (UINT32)(SegmentC << 12 | >> (UINT16)(UINTN)Ptr); >> + VbeInfo->ProductNameAddress = ((UINT32)SegmentC << 12 | >> (UINT16)(UINTN)Ptr); >> Printed = AsciiSPrint ((CHAR8 *)Ptr, >> sizeof VbeInfoFull->Buffer - (Ptr - VbeInfoFull->Buffer), >> "%s", >> CardName); >> Ptr += Printed + 1; >> >> - VbeInfo->ProductRevAddress = (UINT32)(SegmentC << 12 | >> (UINT16)(UINTN)Ptr); >> + VbeInfo->ProductRevAddress = ((UINT32)SegmentC << 12 | >> (UINT16)(UINTN)Ptr); >> CopyMem (Ptr, mProductRevision, sizeof mProductRevision); >> Ptr += sizeof mProductRevision; >> >> @@ -268,7 +268,7 @@ >> // >> // Second, point the Int10h vector at the shim. >> // >> - Int0x10->Segment = (UINT16) (SegmentC >> 4); >> + Int0x10->Segment = (UINT16) ((UINT32)SegmentC >> 4); >> Int0x10->Offset = (UINT16) ((UINTN) (VbeModeInfo + 1) - SegmentC); >> >> DEBUG ((EFI_D_INFO, "%a: VBE shim installed\n", __FUNCTION__)); >> Index: OvmfPkg/VirtioScsiDxe/VirtioScsi.c >> =================================================================== >> --- OvmfPkg/VirtioScsiDxe/VirtioScsi.c (revision 16323) >> +++ OvmfPkg/VirtioScsiDxe/VirtioScsi.c (working copy) >> @@ -253,7 +253,7 @@ >> // >> Request->Lun[0] = 1; >> Request->Lun[1] = (UINT8) Target; >> - Request->Lun[2] = (UINT8) ((Lun >> 8) | 0x40); >> + Request->Lun[2] = (UINT8) (((UINT32)Lun >> 8) | 0x40); >> Request->Lun[3] = (UINT8) Lun; >> >> // >> Index: OvmfPkg/XenBusDxe/EventChannel.c >> =================================================================== >> --- OvmfPkg/XenBusDxe/EventChannel.c (revision 16323) >> +++ OvmfPkg/XenBusDxe/EventChannel.c (working copy) >> @@ -29,7 +29,7 @@ >> >> Send.port = Port; >> ReturnCode = XenHypercallEventChannelOp (Dev, EVTCHNOP_send, &Send); >> - return ReturnCode; >> + return (UINT32)ReturnCode; >> } >> >> UINT32 >> @@ -48,7 +48,7 @@ >> >> Parameter.dom = DOMID_SELF; >> Parameter.remote_dom = DomainId; >> - ReturnCode = XenHypercallEventChannelOp (Private->Dev, >> + ReturnCode = (UINT32)XenHypercallEventChannelOp (Private->Dev, >> EVTCHNOP_alloc_unbound, >> &Parameter); >> if (ReturnCode != 0) { >> @@ -84,5 +84,5 @@ >> >> Private = XENBUS_PRIVATE_DATA_FROM_THIS (This); >> Close.port = Port; >> - return XenHypercallEventChannelOp (Private->Dev, EVTCHNOP_close, &Close); >> + return (UINT32)XenHypercallEventChannelOp (Private->Dev, EVTCHNOP_close, >> &Close); >> } >> Index: OvmfPkg/XenBusDxe/GrantTable.c >> =================================================================== >> --- OvmfPkg/XenBusDxe/GrantTable.c (revision 16323) >> +++ OvmfPkg/XenBusDxe/GrantTable.c (working copy) >> @@ -85,7 +85,7 @@ >> GrantInUseList[Ref] = TRUE; >> #endif >> EfiReleaseLock (&mGrantListLock); >> - return Ref; >> + return (grant_ref_t)Ref; >> } >> >> STATIC >> @@ -101,7 +101,7 @@ >> >> ASSERT (GrantTable != NULL); >> Ref = XenGrantTableGetFreeEntry (); >> - GrantTable[Ref].frame = Frame; >> + GrantTable[Ref].frame = (UINT32)Frame; >> GrantTable[Ref].domid = DomainId; >> MemoryFence (); >> Flags = GTF_permit_access; >> @@ -108,7 +108,7 @@ >> if (ReadOnly) { >> Flags |= GTF_readonly; >> } >> - GrantTable[Ref].flags = Flags; >> + GrantTable[Ref].flags = (UINT16)Flags; >> >> return Ref; >> } >> @@ -152,7 +152,7 @@ >> #endif >> EfiInitializeLock (&mGrantListLock, TPL_NOTIFY); >> for (Index = NR_RESERVED_ENTRIES; Index < NR_GRANT_ENTRIES; Index++) { >> - XenGrantTablePutFreeEntry (Index); >> + XenGrantTablePutFreeEntry ((grant_ref_t)Index); >> } >> >> GrantTable = (VOID*)(UINTN) MmioAddr; >> Index: OvmfPkg/XenBusDxe/XenBus.c >> =================================================================== >> --- OvmfPkg/XenBusDxe/XenBus.c (revision 16323) >> +++ OvmfPkg/XenBusDxe/XenBus.c (working copy) >> @@ -182,7 +182,7 @@ >> Private->XenBusIo.Type = AsciiStrDup (Type); >> Private->XenBusIo.Node = AsciiStrDup (DevicePath); >> Private->XenBusIo.Backend = BackendPath; >> - Private->XenBusIo.DeviceId = AsciiStrDecimalToUintn (Id); >> + Private->XenBusIo.DeviceId = (UINT16)AsciiStrDecimalToUintn (Id); >> Private->Dev = Dev; >> >> TempXenBusPath = AllocateCopyPool (sizeof (XENBUS_DEVICE_PATH), >> @@ -274,7 +274,7 @@ >> XenBusAddDevice (Dev, Type, Directory[Index]); >> } >> >> - FreePool (Directory); >> + FreePool ((VOID*)Directory); >> } >> >> >> @@ -310,7 +310,7 @@ >> XenBusEnumerateDeviceType (Dev, Types[Index]); >> } >> >> - FreePool (Types); >> + FreePool ((VOID*)Types); >> >> return XENSTORE_STATUS_SUCCESS; >> } >> Index: OvmfPkg/XenBusDxe/XenHypercall.c >> =================================================================== >> --- OvmfPkg/XenBusDxe/XenHypercall.c (revision 16323) >> +++ OvmfPkg/XenBusDxe/XenHypercall.c (working copy) >> @@ -52,8 +52,8 @@ >> ASSERT (Dev->Hyperpage != NULL); >> >> Parameter.domid = DOMID_SELF; >> - Parameter.index = Index; >> - Error = XenHypercall2 (Dev->Hyperpage + __HYPERVISOR_hvm_op * 32, >> + Parameter.index = (UINT32)Index; >> + Error = XenHypercall2 ((UINT8*)Dev->Hyperpage + __HYPERVISOR_hvm_op * 32, >> HVMOP_get_param, (INTN) &Parameter); >> if (Error != 0) { >> DEBUG ((EFI_D_ERROR, >> @@ -72,7 +72,7 @@ >> ) >> { >> ASSERT (Dev->Hyperpage != NULL); >> - return XenHypercall2 (Dev->Hyperpage + __HYPERVISOR_memory_op * 32, >> + return XenHypercall2 ((UINT8*)Dev->Hyperpage + __HYPERVISOR_memory_op * >> 32, >> Operation, (INTN) Arguments); >> } >> >> @@ -84,7 +84,7 @@ >> ) >> { >> ASSERT (Dev->Hyperpage != NULL); >> - return XenHypercall2 (Dev->Hyperpage + __HYPERVISOR_event_channel_op * 32, >> + return XenHypercall2 ((UINT8*)Dev->Hyperpage + >> __HYPERVISOR_event_channel_op * 32, >> Operation, (INTN) Arguments); >> } >> >> Index: OvmfPkg/XenBusDxe/XenStore.c >> =================================================================== >> --- OvmfPkg/XenBusDxe/XenStore.c (revision 16323) >> +++ OvmfPkg/XenBusDxe/XenStore.c (working copy) >> @@ -248,7 +248,7 @@ >> >> /* Transfer to one big alloc for easy freeing by the caller. */ >> Dst = AllocatePool (*NumPtr * sizeof (CHAR8 *) + Len); >> - CopyMem (&Dst[*NumPtr], Strings, Len); >> + CopyMem ((VOID*)&Dst[*NumPtr], Strings, Len); >> FreePool (Strings); >> >> /* Extract pointers to newly allocated array. */ >> @@ -493,7 +493,7 @@ >> >> Dest = XenStoreGetOutputChunk (Cons, Prod, xs.XenStore->req, >> &Available); >> if (Available > Len) { >> - Available = Len; >> + Available = (UINT32)Len; >> } >> >> CopyMem (Dest, Data, Available); >> @@ -572,7 +572,7 @@ >> >> Src = XenStoreGetInputChunk (Cons, Prod, xs.XenStore->rsp, &Available); >> if (Available > Len) { >> - Available = Len; >> + Available = (UINT32)Len; >> } >> >> /* >> @@ -660,7 +660,7 @@ >> } else { >> DEBUG ((EFI_D_WARN, "XenStore: Watch handle %a not found\n", >> Message->u.Watch.Vector[XS_WATCH_TOKEN])); >> - FreePool(Message->u.Watch.Vector); >> + FreePool((VOID*)Message->u.Watch.Vector); >> FreePool(Message); >> } >> EfiReleaseLock (&xs.RegisteredWatchesLock); >> @@ -812,7 +812,7 @@ >> Message.type = RequestType; >> Message.len = 0; >> for (Index = 0; Index < NumRequests; Index++) { >> - Message.len += WriteRequest[Index].Len; >> + Message.len += (UINT32)WriteRequest[Index].Len; >> } >> >> Status = XenStoreWriteStore (&Message, sizeof (Message)); >> @@ -829,7 +829,7 @@ >> } >> } >> >> - Status = XenStoreReadReply (&Message.type, LenPtr, &Return); >> + Status = XenStoreReadReply ((enum xsd_sockmsg_type *)&Message.type, >> LenPtr, &Return); >> >> Error: >> if (Status != XENSTORE_STATUS_SUCCESS) { >> @@ -843,7 +843,7 @@ >> } >> >> /* Reply is either error or an echo of our request message type. */ >> - ASSERT (Message.type == RequestType); >> + ASSERT ((enum xsd_sockmsg_type)Message.type == RequestType); >> >> if (ResultPtr) { >> *ResultPtr = Return; >> @@ -975,7 +975,7 @@ >> if (Message->u.Watch.Handle == Token) { >> RemoveEntryList (Entry); >> EfiReleaseLock (&xs.WatchEventsLock); >> - FreePool(Message->u.Watch.Vector); >> + FreePool((VOID*)Message->u.Watch.Vector); >> FreePool(Message); >> return XENSTORE_STATUS_SUCCESS; >> } >> @@ -1057,8 +1057,8 @@ >> >> xs.Dev = Dev; >> >> - xs.EventChannel = XenHypercallHvmGetParam (Dev, HVM_PARAM_STORE_EVTCHN); >> - XenStoreGpfn = XenHypercallHvmGetParam (Dev, HVM_PARAM_STORE_PFN); >> + xs.EventChannel = (evtchn_port_t)XenHypercallHvmGetParam (Dev, >> HVM_PARAM_STORE_EVTCHN); >> + XenStoreGpfn = (UINTN)XenHypercallHvmGetParam (Dev, HVM_PARAM_STORE_PFN); >> xs.XenStore = (VOID *) (XenStoreGpfn << EFI_PAGE_SHIFT); >> DEBUG ((EFI_D_INFO, "XenBusInit: XenBus rings @%p, event channel %x\n", >> xs.XenStore, xs.EventChannel)); >> @@ -1115,7 +1115,7 @@ >> XENSTORE_MESSAGE *Message = XENSTORE_MESSAGE_FROM_LINK (Entry); >> Entry = GetNextNode (&xs.WatchEvents, Entry); >> RemoveEntryList (&Message->Link); >> - FreePool (Message->u.Watch.Vector); >> + FreePool ((VOID*)Message->u.Watch.Vector); >> FreePool (Message); >> } >> } >> @@ -1202,7 +1202,7 @@ >> if (Status != XENSTORE_STATUS_SUCCESS) { >> return FALSE; >> } >> - FreePool (TempStr); >> + FreePool ((VOID*)TempStr); >> return TRUE; >> } >> >> @@ -1283,7 +1283,7 @@ >> Status = XenStoreSingle (XST_NIL, XS_TRANSACTION_START, "", NULL, >> (VOID **) &IdStr); >> if (Status == XENSTORE_STATUS_SUCCESS) { >> - Transaction->Id = AsciiStrDecimalToUintn (IdStr); >> + Transaction->Id = (UINT32)AsciiStrDecimalToUintn (IdStr); >> FreePool (IdStr); >> } >> >> @@ -1419,7 +1419,7 @@ >> Entry = GetNextNode (&xs.WatchEvents, Entry); >> if (Message->u.Watch.Handle == Watch) { >> RemoveEntryList (&Message->Link); >> - FreePool (Message->u.Watch.Vector); >> + FreePool ((VOID*)Message->u.Watch.Vector); >> FreePool (Message); >> } >> } >> Index: OvmfPkg/XenPvBlkDxe/BlockFront.c >> =================================================================== >> --- OvmfPkg/XenPvBlkDxe/BlockFront.c (revision 16323) >> +++ OvmfPkg/XenPvBlkDxe/BlockFront.c (working copy) >> @@ -196,7 +196,7 @@ >> Status)); >> goto Error; >> } >> - Dev->DomainId = Value; >> + Dev->DomainId = (domid_t)Value; >> XenBusIo->EventChannelAllocate (XenBusIo, Dev->DomainId, >> &Dev->EventChannel); >> >> SharedRing = (blkif_sring_t*) AllocatePages (1); >> @@ -262,7 +262,7 @@ >> if (Status != XENSTORE_STATUS_SUCCESS || Value > UINT32_MAX) { >> goto Error2; >> } >> - Dev->MediaInfo.VDiskInfo = Value; >> + Dev->MediaInfo.VDiskInfo = (UINT32)Value; >> if (Dev->MediaInfo.VDiskInfo & VDISK_READONLY) { >> Dev->MediaInfo.ReadWrite = FALSE; >> } else { >> @@ -278,7 +278,7 @@ >> if (Status != XENSTORE_STATUS_SUCCESS || Value > UINT32_MAX) { >> goto Error2; >> } >> - if (Value % 512 != 0) { >> + if ((UINT32)Value % 512 != 0) { >> // >> // This is not supported by the driver. >> // >> @@ -286,7 +286,7 @@ >> "it must be a multiple of 512\n", Value)); >> goto Error2; >> } >> - Dev->MediaInfo.SectorSize = Value; >> + Dev->MediaInfo.SectorSize = (UINT32)Value; >> >> // Default value >> Value = 0; >> @@ -443,7 +443,7 @@ >> >> Start = (UINTN) IoData->Buffer & ~EFI_PAGE_MASK; >> End = ((UINTN) IoData->Buffer + IoData->Size + EFI_PAGE_SIZE - 1) & >> ~EFI_PAGE_MASK; >> - IoData->NumRef = NumSegments = (End - Start) / EFI_PAGE_SIZE; >> + IoData->NumRef = NumSegments = (INT32)((End - Start) / EFI_PAGE_SIZE); >> >> ASSERT (NumSegments <= BLKIF_MAX_SEGMENTS_PER_REQUEST); >> >> @@ -452,7 +452,7 @@ >> Request = RING_GET_REQUEST (&Dev->Ring, RingIndex); >> >> Request->operation = IsWrite ? BLKIF_OP_WRITE : BLKIF_OP_READ; >> - Request->nr_segments = NumSegments; >> + Request->nr_segments = (UINT8)NumSegments; >> Request->handle = Dev->DeviceId; >> Request->id = (UINTN) IoData; >> Request->sector_number = IoData->Sector; >> @@ -461,9 +461,9 @@ >> Request->seg[Index].first_sect = 0; >> Request->seg[Index].last_sect = EFI_PAGE_SIZE / 512 - 1; >> } >> - Request->seg[0].first_sect = ((UINTN) IoData->Buffer & EFI_PAGE_MASK) / >> 512; >> - Request->seg[NumSegments - 1].last_sect = >> - (((UINTN) IoData->Buffer + IoData->Size - 1) & EFI_PAGE_MASK) / 512; >> + Request->seg[0].first_sect = (UINT8)(((UINTN) IoData->Buffer & >> EFI_PAGE_MASK) / 512); >> + Request->seg[NumSegments - 1].last_sect = (UINT8) >> + ((((UINTN) IoData->Buffer + IoData->Size - 1) & EFI_PAGE_MASK) / 512); >> for (Index = 0; Index < NumSegments; Index++) { >> UINTN Data = Start + Index * EFI_PAGE_SIZE; >> XenBusIo->GrantAccess (XenBusIo, Dev->DomainId, >> Index: OvmfPkg/XenPvBlkDxe/BlockIo.c >> =================================================================== >> --- OvmfPkg/XenPvBlkDxe/BlockIo.c (revision 16323) >> +++ OvmfPkg/XenPvBlkDxe/BlockIo.c (working copy) >> @@ -136,7 +136,7 @@ >> } >> >> IoData.Dev = XEN_BLOCK_FRONT_FROM_BLOCK_IO (This); >> - Sector = Lba * (Media->BlockSize / 512); >> + Sector = (UINTN)MultU64x32 (Lba, Media->BlockSize / 512); >> >> while (BufferSize > 0) { >> if (((UINTN)Buffer & EFI_PAGE_MASK) == 0) { >> Index: OvmfPkg/XenPvBlkDxe/XenPvBlkDxe.inf >> =================================================================== >> --- OvmfPkg/XenPvBlkDxe/XenPvBlkDxe.inf (revision 16323) >> +++ OvmfPkg/XenPvBlkDxe/XenPvBlkDxe.inf (working copy) >> @@ -27,6 +27,7 @@ >> [Packages] >> MdePkg/MdePkg.dec >> OvmfPkg/OvmfPkg.dec >> + StdLib/StdLib.dec >> >> [Sources] >> XenPvBlkDxe.h >> >> >> --- >> ------------------------------------------------------------------------------ Comprehensive Server Monitoring with Site24x7. Monitor 10 servers for $9/Month. Get alerted through email, SMS, voice calls or mobile push notifications. Take corrective actions from your mobile device. http://pubads.g.doubleclick.net/gampad/clk?id=154624111&iu=/4140/ostg.clktrk _______________________________________________ edk2-devel mailing list edk2-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/edk2-devel