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.

Thanks,
Scott

--- 

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


---

Attachment: ovmf-ia32-msft.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

Reply via email to