InOsEmuPkg: Unix emulator now compiles for IA-32.

Wrote IA-32 (align stack to 16-bytes) gaskets for emulator and got it to compile for IA-32. TempRam switch code is not ported to IA-32 in Sec. Code crashes in Sec. 

Signed-off-by: andrewfish



git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11849 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
andrewfish 2011-06-18 17:53:31 +00:00
parent 2a5c468026
commit 112a857f61
8 changed files with 1831 additions and 8 deletions

View File

@ -0,0 +1,103 @@
#------------------------------------------------------------------------------
#
# Copyright (c) 2007, Intel Corporation. All rights reserved.<BR>
# 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.
#
#------------------------------------------------------------------------------
.text
// 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
// )
//
ASM_GLOBAL ASM_PFX(SecTemporaryRamSupport)
ASM_PFX(SecTemporaryRamSupport):
//------------------------------------------------------------------------------
// VOID
// EFIAPI
// SecSwitchStack (
// UINT32 TemporaryMemoryBase,
// UINT32 PermenentMemoryBase
// )//
//------------------------------------------------------------------------------
//
// Save three register: eax, ebx, ecx
//
push %eax
push %ebx
push %ecx
push %edx
#if 0
// Port me to GAS syntax
//
// !!CAUTION!! this function addresss 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 functions 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 registers 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 functions 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 callees ebp point for PeiDispatch
//
mov eax, dword ptr [ebp]
sub eax, ebx
add eax, ecx
mov dword ptr [ebp], eax // From now, Temporarys PPI callers stack is in permenent memory
#endif
pop %edx
pop %ecx
pop %ebx
pop %eax
ret

View File

@ -28,6 +28,9 @@
[Sources.X64]
X64/SwitchRam.S
[Sources.IA32]
Ia32/SwitchRam.S
[Packages]
MdePkg/MdePkg.dec
InOsEmuPkg/InOsEmuPkg.dec

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,74 @@
/*++
Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
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.
--*/
#include "SecMain.h"
/**
Transfers control to a function starting with a new stack.
Transfers control to the function specified by EntryPoint using the new stack
specified by NewStack and passing in the parameters specified by Context1 and
Context2. Context1 and Context2 are optional and may be NULL. The function
EntryPoint must never return.
If EntryPoint is NULL, then ASSERT().
If NewStack is NULL, then ASSERT().
@param EntryPoint A pointer to function to call with the new stack.
@param Context1 A pointer to the context to pass into the EntryPoint
function.
@param Context2 A pointer to the context to pass into the EntryPoint
function.
@param NewStack A pointer to the new stack to use for the EntryPoint
function.
**/
VOID
EFIAPI
PeiSwitchStacks (
IN SWITCH_STACK_ENTRY_POINT EntryPoint,
IN VOID *Context1, OPTIONAL
IN VOID *Context2, OPTIONAL
IN VOID *NewStack
)
{
BASE_LIBRARY_JUMP_BUFFER JumpBuffer;
ASSERT (EntryPoint != NULL);
ASSERT (NewStack != NULL);
//
// Stack should be aligned with CPU_STACK_ALIGNMENT
//
ASSERT (((UINTN)NewStack & (CPU_STACK_ALIGNMENT - 1)) == 0);
JumpBuffer.Eip = (UINTN)EntryPoint;
JumpBuffer.Esp = (UINTN)NewStack - sizeof (VOID*);
JumpBuffer.Esp -= sizeof (Context1) + sizeof (Context2);
((VOID**)JumpBuffer.Esp)[1] = Context1;
((VOID**)JumpBuffer.Esp)[2] = Context2;
LongJump (&JumpBuffer, (UINTN)-1);
//
// PeiSwitchStacks () will never return
//
ASSERT (FALSE);
}

View File

@ -439,7 +439,7 @@ MapFd0 (
// Map the rest of the FD as read/write
res2 = mmap (
(void *)(FixedPcdGet64 (PcdEmuFlashFvRecoveryBase) + FvSize),
(void *)(UINTN)(FixedPcdGet64 (PcdEmuFlashFvRecoveryBase) + FvSize),
FileSize - FvSize,
PROT_READ | PROT_WRITE | PROT_EXEC,
MAP_SHARED,

View File

@ -20,7 +20,6 @@
BASE_NAME = SecMain
FILE_GUID = 8863C0AD-7724-C84B-88E5-A33B116D1485
MODULE_TYPE = USER_DEFINED
# MODULE_TYPE = BASE
VERSION_STRING = 1.0
#
@ -43,6 +42,10 @@
X64/Gasket.S # convert between Emu x86_64 ABI and EFI X64 ABI
X64/SwitchStack.S
[Sources.IA32]
Ia32/Gasket.S # enforce 16-byte stack alignment for Mac OS X
Ia32/SwitchStack.c
[Packages]
MdePkg/MdePkg.dec

View File

@ -28,7 +28,7 @@
PLATFORM_VERSION = 0.3
DSC_ SPECIFICATION = 0x00010005
OUTPUT_DIRECTORY = Build/EmuUnixX64
SUPPORTED_ARCHITECTURES = X64
SUPPORTED_ARCHITECTURES = X64|IA32
BUILD_TARGETS = DEBUG|RELEASE
SKUID_IDENTIFIER = DEFAULT
FLASH_DEFINITION = InOsEmuPkg/Unix/UnixX64.fdf
@ -264,6 +264,17 @@
# generated for it, but the binary will not be put into any firmware volume.
#
###################################################################################################
[Components.X64]
MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf {
<LibraryClasses>
# turn off CR3 write so that DXE IPL will not crash emulator
BaseLib|UnixPkg/Library/UnixBaseLib/UnixBaseLib.inf
}
[Components.IA32]
MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
[Components]
!if $(SEC_ONLY)
##
@ -294,11 +305,6 @@
InOsEmuPkg/FirmwareVolumePei/FirmwareVolumePei.inf
InOsEmuPkg/FlashMapPei/FlashMapPei.inf
InOsEmuPkg/ThunkPpiToProtocolPei/ThunkPpiToProtocolPei.inf
MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf {
<LibraryClasses>
# turn off CR3 write so that DXE IPL will not crash emulator
BaseLib|UnixPkg/Library/UnixBaseLib/UnixBaseLib.inf
}
##
# DXE Phase modules

129
InOsEmuPkg/Unix/build.sh Executable file
View File

@ -0,0 +1,129 @@
#!/bin/bash
#
# Copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>
# Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>
#
# 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.
#
set -e
shopt -s nocasematch
#
# Setup workspace if it is not set
#
if [ -z "$WORKSPACE" ]
then
echo Initializing workspace
if [ ! -e `pwd`/edksetup.sh ]
then
cd ../..
fi
# This version is for the tools in the BaseTools project.
# this assumes svn pulls have the same root dir
# export EDK_TOOLS_PATH=`pwd`/../BaseTools
# This version is for the tools source in edk2
export EDK_TOOLS_PATH=`pwd`/BaseTools
echo $EDK_TOOLS_PATH
source edksetup.sh BaseTools
else
echo Building from: $WORKSPACE
fi
#
# Pick a default tool type for a given OS
#
TARGET_TOOLS=MYTOOLS
UNIXPKG_TOOLS=GCC44
NETWORK_SUPPORT=
BUILD_NEW_SHELL=
BUILD_FAT=
case `uname` in
CYGWIN*) echo Cygwin not fully supported yet. ;;
Darwin*)
Major=$(uname -r | cut -f 1 -d '.')
if [[ $Major == 9 ]]
then
echo UnixPkg requires Snow Leopard or later OS
exit 1
else
TARGET_TOOLS=XCODE32
UNIXPKG_TOOLS=XCLANG
fi
# NETWORK_SUPPORT="-D NETWORK_SUPPORT"
BUILD_NEW_SHELL="-D BUILD_NEW_SHELL"
BUILD_FAT="-D BUILD_FAT"
;;
Linux*) TARGET_TOOLS=ELFGCC ;;
esac
BUILD_ROOT_ARCH=$WORKSPACE/Build/EmuUnixX64/DEBUG_"$UNIXPKG_TOOLS"/IA32
if [[ ! -f `which build` || ! -f `which GenFv` ]];
then
# build the tools if they don't yet exist. Bin scheme
echo Building tools as they are not in the path
make -C $WORKSPACE/BaseTools
elif [[ ( -f `which build` || -f `which GenFv` ) && ! -d $EDK_TOOLS_PATH/Source/C/bin ]];
then
# build the tools if they don't yet exist. BinWrapper scheme
echo Building tools no $EDK_TOOLS_PATH/Source/C/bin directory
make -C $WORKSPACE/BaseTools
else
echo using prebuilt tools
fi
for arg in "$@"
do
if [[ $arg == run ]]; then
case `uname` in
Darwin*)
#
# On Darwin we can't use dlopen, so we have to load the real PE/COFF images.
# This .gdbinit script sets a breakpoint that loads symbols for the PE/COFFEE
# images that get loaded in SecMain
#
cp $WORKSPACE/InOsEmuPkg/Unix/.gdbinit $WORKSPACE/Build/EmuUnixX64/DEBUG_"$UNIXPKG_TOOLS"/IA32
;;
esac
/usr/bin/gdb $BUILD_ROOT_ARCH/SecMain -q -cd=$BUILD_ROOT_ARCH
exit
fi
if [[ $arg == cleanall ]]; then
make -C $WORKSPACE/BaseTools clean
build -p $WORKSPACE/InOsEmuPkg/Unix/UnixX64.dsc -a IA32 -t $TARGET_TOOLS -D SEC_ONLY -n 3 clean
build -p $WORKSPACE/InOsEmuPkg/Unix/UnixX64.dsc -a IA32 -t $UNIXPKG_TOOLS -n 3 clean
build -p $WORKSPACE/ShellPkg/ShellPkg.dsc -a IA32 -t $UNIXPKG_TOOLS -n 3 clean
exit $?
fi
if [[ $arg == clean ]]; then
build -p $WORKSPACE/InOsEmuPkg/Unix/UnixX64.dsc -a IA32 -t $TARGET_TOOLS -D SEC_ONLY -n 3 clean
build -p $WORKSPACE/InOsEmuPkg/Unix/UnixX64.dsc -a IA32 -t $UNIXPKG_TOOLS -n 3 clean
exit $?
fi
done
#
# Build the edk2 UnixPkg
#
echo $PATH
echo `which build`
build -p $WORKSPACE/InOsEmuPkg/Unix/UnixX64.dsc -a IA32 -t $TARGET_TOOLS -D SEC_ONLY -n 3 $1 $2 $3 $4 $5 $6 $7 $8 modules
build -p $WORKSPACE/InOsEmuPkg/Unix/UnixX64.dsc -a IA32 -t $UNIXPKG_TOOLS $NETWORK_SUPPORT $BUILD_NEW_SHELL $BUILD_FAT -n 3 $1 $2 $3 $4 $5 $6 $7 $8
cp $WORKSPACE/Build/EmuUnixX64/DEBUG_"$TARGET_TOOLS"/IA32/SecMain $WORKSPACE/Build/EmuUnixX64/DEBUG_"$UNIXPKG_TOOLS"/IA32
exit $?