Jordan Justen [mailto:jordan.l.jus...@intel.com] 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? OK, a revised patch with no inttypes.h fix is attached. ]I have a fix for this that doesn't involve StdLib. In fact, we don't ]want the StdLib dependency added. ] ]Do you want to work on a different fix (without StdLib), or should I ]send out the one I have? Send your patch please. ]Thanks for looking at these build issues, ] ]-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 > > > ---
ovmf-ia32-msft-002.patch
Description: Binary data
------------------------------------------------------------------------------ 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