Add doxygen style comments for functions in EBC module.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@5194 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
qhuang8
2008-05-13 08:46:12 +00:00
parent 335b890e40
commit 8e3bc754c5
8 changed files with 2211 additions and 477 deletions

View File

@@ -17,6 +17,23 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#include "EbcExecute.h"
#include "EbcSupport.h"
/**
Given raw bytes of Itanium based code, format them into a bundle and
write them out.
@param MemPtr pointer to memory location to write the bundles
to.
@param Template 5-bit template.
@param Slot0 Instruction slot 0 data for the bundle.
@param Slot1 Instruction slot 1 data for the bundle.
@param Slot2 Instruction slot 2 data for the bundle.
@retval EFI_INVALID_PARAMETER Pointer is not aligned
@retval EFI_INVALID_PARAMETER No more than 5 bits in template
@retval EFI_INVALID_PARAMETER More than 41 bits used in code
@retval EFI_SUCCESS All data is written.
**/
STATIC
EFI_STATUS
WriteBundle (
@@ -27,11 +44,18 @@ WriteBundle (
IN UINT64 Slot2
);
/**
Pushes a 64 bit unsigned value to the VM stack.
@param VmPtr The pointer to current VM context.
@param Arg The value to be pushed.
**/
STATIC
VOID
PushU64 (
VM_CONTEXT *VmPtr,
UINT64 Arg
IN VM_CONTEXT *VmPtr,
IN UINT64 Arg
)
{
//
@@ -42,6 +66,21 @@ PushU64 (
*(UINT64 *) VmPtr->R[0] = Arg;
}
/**
Begin executing an EBC image. The address of the entry point is passed
in via a processor register, so we'll need to make a call to get the
value.
This is a thunk function. Microsoft x64 compiler only provide fast_call
calling convention, so the first four arguments are passed by rcx, rdx,
r8, and r9, while other arguments are passed in stack.
@param Arg1 The 1st argument.
@param ... The variable arguments list.
@return The value returned by the EBC application we're going to run.
**/
STATIC
UINT64
EbcInterpret (
@@ -189,15 +228,13 @@ EbcInterpret (
/**
IPF implementation.
Begin executing an EBC image. The address of the entry point is passed
in via a processor register, so we'll need to make a call to get the
value.
@param ImageHandle image handle for the EBC application we're
executing
@param SystemTable standard system table passed into an driver's
entry point
@param ImageHandle image handle for the EBC application we're executing
@param SystemTable standard system table passed into an driver's entry
point
@return The value returned by the EBC application we're going to run.
@@ -312,13 +349,18 @@ ExecuteEbcImageEntryPoint (
/**
Create thunks for an EBC image entry point, or an EBC protocol service.
@param ImageHandle Image handle for the EBC image. If not null, then
we're creating a thunk for an image entry point.
@param EbcEntryPoint Address of the EBC code that the thunk is to call
@param Thunk Returned thunk we create here
@param Flags Flags indicating options for creating the thunk
@param ImageHandle Image handle for the EBC image. If not null, then
we're creating a thunk for an image entry point.
@param EbcEntryPoint Address of the EBC code that the thunk is to call
@param Thunk Returned thunk we create here
@param Flags Flags indicating options for creating the thunk
@return Standard EFI status.
@retval EFI_SUCCESS The thunk was created successfully.
@retval EFI_INVALID_PARAMETER The parameter of EbcEntryPoint is not 16-bit
aligned.
@retval EFI_OUT_OF_RESOURCES There is not enough memory to created the EBC
Thunk.
@retval EFI_BUFFER_TOO_SMALL EBC_THUNK_SIZE is not larger enough.
**/
EFI_STATUS
@@ -334,11 +376,11 @@ EbcCreateThunks (
UINT64 Addr;
UINT64 Code[3]; // Code in a bundle
UINT64 RegNum; // register number for MOVL
UINT64 I; // bits of MOVL immediate data
UINT64 Ic; // bits of MOVL immediate data
UINT64 Imm5c; // bits of MOVL immediate data
UINT64 Imm9d; // bits of MOVL immediate data
UINT64 Imm7b; // bits of MOVL immediate data
UINT64 BitI; // bits of MOVL immediate data
UINT64 BitIc; // bits of MOVL immediate data
UINT64 BitImm5c; // bits of MOVL immediate data
UINT64 BitImm9d; // bits of MOVL immediate data
UINT64 BitImm7b; // bits of MOVL immediate data
UINT64 Br; // branch register for loading and jumping
UINT64 *Data64Ptr;
UINT32 ThunkSize;
@@ -436,23 +478,23 @@ EbcCreateThunks (
// Extract bits from the address for insertion into the instruction
// i = Addr[63:63]
//
I = RShiftU64 (Addr, 63) & 0x01;
BitI = RShiftU64 (Addr, 63) & 0x01;
//
// ic = Addr[21:21]
//
Ic = RShiftU64 (Addr, 21) & 0x01;
BitIc = RShiftU64 (Addr, 21) & 0x01;
//
// imm5c = Addr[20:16] for 5 bits
//
Imm5c = RShiftU64 (Addr, 16) & 0x1F;
BitImm5c = RShiftU64 (Addr, 16) & 0x1F;
//
// imm9d = Addr[15:7] for 9 bits
//
Imm9d = RShiftU64 (Addr, 7) & 0x1FF;
BitImm9d = RShiftU64 (Addr, 7) & 0x1FF;
//
// imm7b = Addr[6:0] for 7 bits
//
Imm7b = Addr & 0x7F;
BitImm7b = Addr & 0x7F;
//
// The EBC entry point will be put into r8, so r8 can be used here
@@ -463,12 +505,12 @@ EbcCreateThunks (
//
// Next is jumbled data, including opcode and rest of address
//
Code[2] = LShiftU64 (Imm7b, 13);
Code[2] = LShiftU64 (BitImm7b, 13);
Code[2] = Code[2] | LShiftU64 (0x00, 20); // vc
Code[2] = Code[2] | LShiftU64 (Ic, 21);
Code[2] = Code[2] | LShiftU64 (Imm5c, 22);
Code[2] = Code[2] | LShiftU64 (Imm9d, 27);
Code[2] = Code[2] | LShiftU64 (I, 36);
Code[2] = Code[2] | LShiftU64 (BitIc, 21);
Code[2] = Code[2] | LShiftU64 (BitImm5c, 22);
Code[2] = Code[2] | LShiftU64 (BitImm9d, 27);
Code[2] = Code[2] | LShiftU64 (BitI, 36);
Code[2] = Code[2] | LShiftU64 ((UINT64)MOVL_OPCODE, 37);
Code[2] = Code[2] | LShiftU64 ((RegNum & 0x7F), 6);
@@ -501,23 +543,23 @@ EbcCreateThunks (
// Extract bits from the address for insertion into the instruction
// i = Addr[63:63]
//
I = RShiftU64 (Addr, 63) & 0x01;
BitI = RShiftU64 (Addr, 63) & 0x01;
//
// ic = Addr[21:21]
//
Ic = RShiftU64 (Addr, 21) & 0x01;
BitIc = RShiftU64 (Addr, 21) & 0x01;
//
// imm5c = Addr[20:16] for 5 bits
//
Imm5c = RShiftU64 (Addr, 16) & 0x1F;
BitImm5c = RShiftU64 (Addr, 16) & 0x1F;
//
// imm9d = Addr[15:7] for 9 bits
//
Imm9d = RShiftU64 (Addr, 7) & 0x1FF;
BitImm9d = RShiftU64 (Addr, 7) & 0x1FF;
//
// imm7b = Addr[6:0] for 7 bits
//
Imm7b = Addr & 0x7F;
BitImm7b = Addr & 0x7F;
//
// Put the EBC entry point in r8, which is the location of the return value
@@ -528,12 +570,12 @@ EbcCreateThunks (
//
// Next is jumbled data, including opcode and rest of address
//
Code[2] = LShiftU64 (Imm7b, 13);
Code[2] = LShiftU64 (BitImm7b, 13);
Code[2] = Code[2] | LShiftU64 (0x00, 20); // vc
Code[2] = Code[2] | LShiftU64 (Ic, 21);
Code[2] = Code[2] | LShiftU64 (Imm5c, 22);
Code[2] = Code[2] | LShiftU64 (Imm9d, 27);
Code[2] = Code[2] | LShiftU64 (I, 36);
Code[2] = Code[2] | LShiftU64 (BitIc, 21);
Code[2] = Code[2] | LShiftU64 (BitImm5c, 22);
Code[2] = Code[2] | LShiftU64 (BitImm9d, 27);
Code[2] = Code[2] | LShiftU64 (BitI, 36);
Code[2] = Code[2] | LShiftU64 ((UINT64)MOVL_OPCODE, 37);
Code[2] = Code[2] | LShiftU64 ((RegNum & 0x7F), 6);
@@ -573,23 +615,23 @@ EbcCreateThunks (
// Extract bits from the address for insertion into the instruction
// i = Addr[63:63]
//
I = RShiftU64 (Addr, 63) & 0x01;
BitI = RShiftU64 (Addr, 63) & 0x01;
//
// ic = Addr[21:21]
//
Ic = RShiftU64 (Addr, 21) & 0x01;
BitIc = RShiftU64 (Addr, 21) & 0x01;
//
// imm5c = Addr[20:16] for 5 bits
//
Imm5c = RShiftU64 (Addr, 16) & 0x1F;
BitImm5c = RShiftU64 (Addr, 16) & 0x1F;
//
// imm9d = Addr[15:7] for 9 bits
//
Imm9d = RShiftU64 (Addr, 7) & 0x1FF;
BitImm9d = RShiftU64 (Addr, 7) & 0x1FF;
//
// imm7b = Addr[6:0] for 7 bits
//
Imm7b = Addr & 0x7F;
BitImm7b = Addr & 0x7F;
//
// Put it in r31, a scratch register
@@ -599,12 +641,12 @@ EbcCreateThunks (
//
// Next is jumbled data, including opcode and rest of address
//
Code[2] = LShiftU64(Imm7b, 13);
Code[2] = LShiftU64(BitImm7b, 13);
Code[2] = Code[2] | LShiftU64 (0x00, 20); // vc
Code[2] = Code[2] | LShiftU64 (Ic, 21);
Code[2] = Code[2] | LShiftU64 (Imm5c, 22);
Code[2] = Code[2] | LShiftU64 (Imm9d, 27);
Code[2] = Code[2] | LShiftU64 (I, 36);
Code[2] = Code[2] | LShiftU64 (BitIc, 21);
Code[2] = Code[2] | LShiftU64 (BitImm5c, 22);
Code[2] = Code[2] | LShiftU64 (BitImm9d, 27);
Code[2] = Code[2] | LShiftU64 (BitI, 36);
Code[2] = Code[2] | LShiftU64 ((UINT64)MOVL_OPCODE, 37);
Code[2] = Code[2] | LShiftU64 ((RegNum & 0x7F), 6);
@@ -667,13 +709,16 @@ EbcCreateThunks (
Given raw bytes of Itanium based code, format them into a bundle and
write them out.
@param MemPtr pointer to memory location to write the bundles to
@param Template 5-bit template
@param Slot0-2 instruction slot data for the bundle
@param MemPtr pointer to memory location to write the bundles
to.
@param Template 5-bit template.
@param Slot0 Instruction slot 0 data for the bundle.
@param Slot1 Instruction slot 1 data for the bundle.
@param Slot2 Instruction slot 2 data for the bundle.
@retval EFI_INVALID_PARAMETER Pointer is not aligned
@retval No more than 5 bits in template
@retval More than 41 bits used in code
@retval EFI_INVALID_PARAMETER No more than 5 bits in template
@retval EFI_INVALID_PARAMETER More than 41 bits used in code
@retval EFI_SUCCESS All data is written.
**/
@@ -745,13 +790,11 @@ WriteBundle (
otherwise, set the VM->IP to target EBC code directly to avoid another VM
be startup which cost time and stack space.
@param VmPtr Pointer to a VM context.
@param FuncAddr Callee's address
@param NewStackPointer New stack pointer after the call
@param FramePtr New frame pointer after the call
@param Size The size of call instruction
@return None.
@param VmPtr Pointer to a VM context.
@param FuncAddr Callee's address
@param NewStackPointer New stack pointer after the call
@param FramePtr New frame pointer after the call
@param Size The size of call instruction
**/
VOID