From e148512e5132e38accf2fe8188a9bdf9d1de02d8 Mon Sep 17 00:00:00 2001 From: jljusten Date: Wed, 15 Aug 2012 00:03:25 +0000 Subject: [PATCH] EmulatorPkg: Fix Visual Studio build for IA32 & X64 This code is untested since there is currently no 'host' component for Win32/Win64. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Jordan Justen git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13633 6f19259b-4bc3-4df7-8a09-765794883524 --- EmulatorPkg/CpuRuntimeDxe/Cpu.c | 8 +- EmulatorPkg/CpuRuntimeDxe/CpuIo.c | 4 +- EmulatorPkg/CpuRuntimeDxe/MpService.c | 6 +- .../PeiEmuPeCoffGetEntryPointLib.c | 4 +- EmulatorPkg/Library/SmbiosLib/SmbiosLib.c | 6 +- EmulatorPkg/Sec/Ia32/SwitchRam.asm | 94 +++++++++++++++++++ EmulatorPkg/Sec/Sec.inf | 3 + EmulatorPkg/Sec/X64/SwitchRam.asm | 76 +++++++++++++++ EmulatorPkg/TimerDxe/Timer.c | 6 +- 9 files changed, 191 insertions(+), 16 deletions(-) create mode 100644 EmulatorPkg/Sec/Ia32/SwitchRam.asm create mode 100644 EmulatorPkg/Sec/X64/SwitchRam.asm diff --git a/EmulatorPkg/CpuRuntimeDxe/Cpu.c b/EmulatorPkg/CpuRuntimeDxe/Cpu.c index fc8d325ffc..b25ed45da4 100644 --- a/EmulatorPkg/CpuRuntimeDxe/Cpu.c +++ b/EmulatorPkg/CpuRuntimeDxe/Cpu.c @@ -1,7 +1,7 @@ /*++ @file Emu driver to produce CPU Architectural Protocol. -Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.
+Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.
Portions copyright (c) 2011 - 2012, Apple Inc. All rights reserved. This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License @@ -241,9 +241,9 @@ CpuUpdateSmbios ( IN UINTN MaxCpus ) { - mCpuSmbiosType4.CoreCount = MaxCpus; - mCpuSmbiosType4.EnabledCoreCount = MaxCpus; - mCpuSmbiosType4.ThreadCount = MaxCpus; + mCpuSmbiosType4.CoreCount = (UINT8) MaxCpus; + mCpuSmbiosType4.EnabledCoreCount = (UINT8) MaxCpus; + mCpuSmbiosType4.ThreadCount = (UINT8) MaxCpus; LogSmbiosData ((EFI_SMBIOS_TABLE_HEADER *)&mCpuSmbiosType4, mCpuSmbiosType4Strings); } diff --git a/EmulatorPkg/CpuRuntimeDxe/CpuIo.c b/EmulatorPkg/CpuRuntimeDxe/CpuIo.c index 3d4309d422..37905f892a 100644 --- a/EmulatorPkg/CpuRuntimeDxe/CpuIo.c +++ b/EmulatorPkg/CpuRuntimeDxe/CpuIo.c @@ -6,7 +6,7 @@ Bridge I/O Protocol. -Copyright (c) 2006, Intel Corporation. All rights reserved.
+Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.
Portions copyright (c) 2011, Apple Inc. All rights reserved. This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License @@ -315,7 +315,7 @@ CpuIoCheckAddressRange ( } Width = Width & 0x03; - if (Address - 1 + (1 << Width) * Count > Limit) { + if ((Address - 1 + LShiftU64 (Count, Width)) > Limit) { return EFI_UNSUPPORTED; } diff --git a/EmulatorPkg/CpuRuntimeDxe/MpService.c b/EmulatorPkg/CpuRuntimeDxe/MpService.c index 6eecbbc9bd..bffc82b047 100644 --- a/EmulatorPkg/CpuRuntimeDxe/MpService.c +++ b/EmulatorPkg/CpuRuntimeDxe/MpService.c @@ -28,7 +28,7 @@ APs to help test system memory in parallel with other device initialization. Diagnostics applications may also use this protocol for multi-processor. -Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.
+Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.
Portitions Copyright (c) 2011, Apple Inc. All rights reserved. This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License that accompanies this distribution. @@ -1158,7 +1158,7 @@ FillInProcessorInformation ( gMPSystem.ProcessorData[ProcessorNumber].Info.StatusFlag |= PROCESSOR_AS_BSP_BIT; } - gMPSystem.ProcessorData[ProcessorNumber].Info.Location.Package = ProcessorNumber; + gMPSystem.ProcessorData[ProcessorNumber].Info.Location.Package = (UINT32) ProcessorNumber; gMPSystem.ProcessorData[ProcessorNumber].Info.Location.Core = 0; gMPSystem.ProcessorData[ProcessorNumber].Info.Location.Thread = 0; gMPSystem.ProcessorData[ProcessorNumber].State = BSP ? CPU_STATE_BUSY : CPU_STATE_IDLE; @@ -1332,7 +1332,7 @@ CpuMpServicesInit ( return EFI_SUCCESS; } - gPollInterval = PcdGet64 (PcdEmuMpServicesPollingInterval); + gPollInterval = (UINTN) PcdGet64 (PcdEmuMpServicesPollingInterval); Status = InitializeMpSystemData (*MaxCpus); if (EFI_ERROR (Status)) { diff --git a/EmulatorPkg/Library/PeiEmuPeCoffGetEntryPointLib/PeiEmuPeCoffGetEntryPointLib.c b/EmulatorPkg/Library/PeiEmuPeCoffGetEntryPointLib/PeiEmuPeCoffGetEntryPointLib.c index 2c47a4f006..46560f8117 100644 --- a/EmulatorPkg/Library/PeiEmuPeCoffGetEntryPointLib/PeiEmuPeCoffGetEntryPointLib.c +++ b/EmulatorPkg/Library/PeiEmuPeCoffGetEntryPointLib/PeiEmuPeCoffGetEntryPointLib.c @@ -1,6 +1,6 @@ /*++ @file -Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.
+Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.
Portions copyright (c) 2008 - 2011, Apple Inc. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License @@ -292,6 +292,6 @@ PeCoffGetSizeOfHeaders ( SizeOfHeaders = 0; } - return SizeOfHeaders; + return (UINT32) SizeOfHeaders; } diff --git a/EmulatorPkg/Library/SmbiosLib/SmbiosLib.c b/EmulatorPkg/Library/SmbiosLib/SmbiosLib.c index 604aa39d0c..3382d7d2a6 100644 --- a/EmulatorPkg/Library/SmbiosLib/SmbiosLib.c +++ b/EmulatorPkg/Library/SmbiosLib/SmbiosLib.c @@ -4,7 +4,7 @@ Copyright (c) 2012, Apple Inc. All rights reserved. -Portitions Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.
+Portitions Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License that accompanies this distribution. The full text of the license may be found at @@ -50,10 +50,12 @@ SmbiosLibInitializeFromTemplate ( return EFI_INVALID_PARAMETER; } + Status = EFI_SUCCESS; + for (Index = 0; Template[Index].Entry != NULL; Index++) { Status = SmbiosLibCreateEntry (Template[Index].Entry, Template[Index].StringArray); } - + return Status; } diff --git a/EmulatorPkg/Sec/Ia32/SwitchRam.asm b/EmulatorPkg/Sec/Ia32/SwitchRam.asm new file mode 100644 index 0000000000..a2e1f3e910 --- /dev/null +++ b/EmulatorPkg/Sec/Ia32/SwitchRam.asm @@ -0,0 +1,94 @@ +;------------------------------------------------------------------------------ +; +; Copyright (c) 2007 - 2012, Intel Corporation. All rights reserved.
+; This program and the accompanying materials +; are licensed and made available under the terms and conditions of the BSD License +; which accompanies this distribution. The full text of the license may be found at +; http://opensource.org/licenses/bsd-license.php +; +; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +; +; Module Name: +; +; Stack.asm +; +; Abstract: +; +; Switch the stack from temporary memory to permenent memory. +; +;------------------------------------------------------------------------------ + + .586p + .model flat,C + .code + +;------------------------------------------------------------------------------ +; VOID +; EFIAPI +; SecSwitchStack ( +; UINT32 TemporaryMemoryBase, +; UINT32 PermenentMemoryBase +; ); +;------------------------------------------------------------------------------ +SecSwitchStack PROC + ; + ; Save three register: eax, ebx, ecx + ; + push eax + push ebx + push ecx + push edx + + ; + ; !!CAUTION!! this function address's is pushed into stack after + ; migration of whole temporary memory, so need save it to permenent + ; memory at first! + ; + + mov ebx, [esp + 20] ; Save the first parameter + mov ecx, [esp + 24] ; Save the second parameter + + ; + ; Save this function's return address into permenent memory at first. + ; Then, Fixup the esp point to permenent memory + ; + mov eax, esp + sub eax, ebx + add eax, ecx + mov edx, dword ptr [esp] ; copy pushed register's value to permenent memory + mov dword ptr [eax], edx + mov edx, dword ptr [esp + 4] + mov dword ptr [eax + 4], edx + mov edx, dword ptr [esp + 8] + mov dword ptr [eax + 8], edx + mov edx, dword ptr [esp + 12] + mov dword ptr [eax + 12], edx + mov edx, dword ptr [esp + 16] ; Update this function's return address into permenent memory + mov dword ptr [eax + 16], edx + mov esp, eax ; From now, esp is pointed to permenent memory + + ; + ; Fixup the ebp point to permenent memory + ; + mov eax, ebp + sub eax, ebx + add eax, ecx + mov ebp, eax ; From now, ebp is pointed to permenent memory + + ; + ; Fixup callee's ebp point for PeiDispatch + ; + mov eax, dword ptr [ebp] + sub eax, ebx + add eax, ecx + mov dword ptr [ebp], eax ; From now, Temporary's PPI caller's stack is in permenent memory + + pop edx + pop ecx + pop ebx + pop eax + ret +SecSwitchStack ENDP + + END diff --git a/EmulatorPkg/Sec/Sec.inf b/EmulatorPkg/Sec/Sec.inf index 484e7a0a93..d253fd724e 100644 --- a/EmulatorPkg/Sec/Sec.inf +++ b/EmulatorPkg/Sec/Sec.inf @@ -3,6 +3,7 @@ # # Main executable file of Unix Emulator that loads PEI core after initialization finished. # Portions copyright (c) 2011, Apple Inc. All rights reserved.
+# Copyright (c) 2012, Intel Corporation. All rights reserved.
# # This program and the accompanying materials # are licensed and made available under the terms and conditions of the BSD License @@ -26,10 +27,12 @@ Sec.c [Sources.X64] + X64/SwitchRam.asm X64/SwitchRam.S [Sources.IA32] Ia32/TempRam.c + Ia32/SwitchRam.asm Ia32/SwitchRam.S [Packages] diff --git a/EmulatorPkg/Sec/X64/SwitchRam.asm b/EmulatorPkg/Sec/X64/SwitchRam.asm new file mode 100644 index 0000000000..d1a7b943fd --- /dev/null +++ b/EmulatorPkg/Sec/X64/SwitchRam.asm @@ -0,0 +1,76 @@ +;------------------------------------------------------------------------------ +; +; Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.
+; Portitions copyright (c) 2011, Apple Inc. All rights reserved. +; This program and the accompanying materials +; are licensed and made available under the terms and conditions of the BSD License +; which accompanies this distribution. The full text of the license may be found at +; http://opensource.org/licenses/bsd-license.php. +; +; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +; +;------------------------------------------------------------------------------ + +EXTERN CopyMem:PROC +EXTERN ZeroMem:PROC + + .code + +;------------------------------------------------------------------------------ +; EFI_STATUS +; EFIAPI +; SecTemporaryRamSupport ( +; IN CONST EFI_PEI_SERVICES **PeiServices, // %rcx +; IN EFI_PHYSICAL_ADDRESS TemporaryMemoryBase, // %rdx +; IN EFI_PHYSICAL_ADDRESS PermanentMemoryBase, // %r8 +; IN UINTN CopySize // %r9 +; ) +;------------------------------------------------------------------------------ +SecTemporaryRamSupport PROC + ; Adjust callers %rbp to account for stack move + sub rbp, rdx ; Calc offset of %rbp in Temp Memory + add rbp, r8 ; add in permanent base to offset + + push rbp ; stack frame is for the debugger + mov rbp, rsp + + push rdx ; Save TemporaryMemoryBase + push r8 ; Save PermanentMemoryBase + push r9 ; Save CopySize + + ; + ; Copy all of temp RAM to permanent memory, including stack + ; + ; CopyMem (PermanentMemoryBase, TemporaryMemoryBase, CopySize); + ; %rcx, %rdx, %r8 + mov rcx, r8 ; Shift arguments + mov r8, r9 + sub rsp, 028h ; Allocate register spill area & 16-byte align stack + call CopyMem + ; Temp mem stack now copied to permanent location. %esp still in temp memory + add rsp, 028h + + pop r9 ; CopySize (old stack) + pop r8 ; PermanentMemoryBase (old stack) + pop rdx ; TemporaryMemoryBase (old stack) + + mov rcx, rsp ; Move to new stack + sub rcx, rdx ; Calc offset of stack in Temp Memory + add rcx, r8 ; Calc PermanentMemoryBase address + mov rsp, rcx ; Update stack + ; Stack now points to permanent memory + + ; ZeroMem (TemporaryMemoryBase /* rcx */, CopySize /* rdx */); + mov rcx, rdx + mov rdx, r9 + sub rsp, 028h ; Allocate register spill area & 16-byte align stack + call ZeroMem + add rsp, 028h + + ; This data comes off the NEW stack + pop rbp + ret +SecTemporaryRamSupport ENDP + + END diff --git a/EmulatorPkg/TimerDxe/Timer.c b/EmulatorPkg/TimerDxe/Timer.c index d19ced7dd9..5230a9625e 100644 --- a/EmulatorPkg/TimerDxe/Timer.c +++ b/EmulatorPkg/TimerDxe/Timer.c @@ -5,7 +5,7 @@ timer service. In the future, the Thread creation should possibly be abstracted by the CPU architectural protocol -Copyright (c) 2004, Intel Corporation. All rights reserved.
+Copyright (c) 2004 - 2012, Intel Corporation. All rights reserved.
Portions copyright (c) 2010 - 2011, Apple Inc. All rights reserved. This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License @@ -74,7 +74,7 @@ TimerCallback (UINT64 DeltaMs) // registered. Assume all other handlers are legal. // if (CallbackFunction != NULL) { - CallbackFunction ((UINT64) (DeltaMs * 10000)); + CallbackFunction (MultU64x32 (DeltaMs, 10000)); } } @@ -246,7 +246,7 @@ Returns: return EFI_INVALID_PARAMETER; } - *TimerPeriod = mTimerPeriodMs * 10000; + *TimerPeriod = MultU64x32 (mTimerPeriodMs, 10000); return EFI_SUCCESS; } -- 2.39.2