\r
PROCEDURE_EXIT(EbcAsmLLCALLEX)\r
\r
+//-----------------------------------------------------------------------------\r
+//++\r
+// EbcLLCALLEXNative\r
+//\r
+// This function is called to execute an EBC CALLEX instruction.\r
+// This instruction requires that we thunk out to external native\r
+// code. On return, we restore the stack pointer to its original location.\r
+// Destroys no working registers. For IPF, at least 8 register slots\r
+// must be allocated on the stack frame to support any number of \r
+// arguments beiung passed to the external native function. The\r
+// size of the stack frame is FramePtr - EbcSp. If this size is less\r
+// than 64-bytes, the amount of stack frame allocated is rounded up\r
+// to 64-bytes \r
+//\r
+// Arguments On Entry :\r
+// in0 = CallAddr The function address.\r
+// in1 = EbcSp The new EBC stack pointer.\r
+// in2 = FramePtr The frame pointer.\r
+//\r
+// Return Value:\r
+// None\r
+//\r
+// C Function Prototype:\r
+// VOID\r
+// EFIAPI\r
+// EbcLLCALLEXNative (\r
+// IN UINTN CallAddr,\r
+// IN UINTN EbcSp,\r
+// IN VOID *FramePtr\r
+// );\r
+//--\r
+//---------------------------------------------------------------------------\r
+\r
PROCEDURE_ENTRY(EbcLLCALLEXNative)\r
NESTED_SETUP (3,6,3,0)\r
\r
- mov loc2 = in2;;\r
- mov loc3 = in1;;\r
- sub loc2 = loc2, loc3\r
- mov loc4 = r12;;\r
- or loc5 = r1, r0\r
-\r
- sub r12 = r12, loc2\r
- mov out2 = loc2;;\r
-\r
- and r12 = -0x10, r12\r
- mov out1 = in1;;\r
- mov out0 = r12;;\r
- adds r12 = -0x8, r12\r
- (p0) br.call.dptk.many b0 = CopyMem;;\r
- adds r12 = 0x8, r12\r
-\r
- mov out0 = in0;;\r
- mov out1 = r12;;\r
- (p0) br.call.dptk.many b0 = EbcAsmLLCALLEX;;\r
- mov r12 = loc4;;\r
- or r1 = loc5, r0\r
+ mov loc2 = in2;; // loc2 = in2 = FramePtr\r
+ mov loc3 = in1;; // loc3 = in1 = EbcSp\r
+ sub loc2 = loc2, loc3;; // loc2 = loc2 - loc3 = FramePtr - EbcSp\r
+ mov out2 = loc2;; // out2 = loc2 = FramePtr - EbcSp\r
+ mov loc4 = 0x40;; // loc4 = 0x40\r
+ cmp.leu p6 = out2, loc4;; // IF out2 < loc4 THEN P6=1 ELSE P6=0; IF (FramePtr - EbcSp) < 0x40 THEN P6 = 1 ELSE P6=0\r
+ (p6) mov loc2 = loc4;; // IF P6==1 THEN loc2 = loc4 = 0x40\r
+ mov loc4 = r12;; // save sp\r
+ or loc5 = r1, r0 // save gp\r
+\r
+ sub r12 = r12, loc2;; // sp = sp - loc2 = sp - MAX (0x40, FramePtr - EbcSp)\r
+\r
+ and r12 = -0x10, r12 // Round sp down to the nearest 16-byte boundary\r
+ mov out1 = in1;; // out1 = EbcSp\r
+ mov out0 = r12;; // out0 = sp\r
+ adds r12 = -0x8, r12 \r
+ (p0) br.call.dptk.many b0 = CopyMem;; // CopyMem (sp, EbcSp, (FramePtr - EbcSp))\r
+ adds r12 = 0x8, r12 \r
+\r
+ mov out0 = in0;; // out0 = CallAddr\r
+ mov out1 = r12;; // out1 = sp\r
+ (p0) br.call.dptk.many b0 = EbcAsmLLCALLEX;; // EbcAsmLLCALLEX (CallAddr, sp)\r
+ mov r12 = loc4;; // restore sp\r
+ or r1 = loc5, r0 // restore gp\r
\r
NESTED_RETURN\r
PROCEDURE_EXIT(EbcLLCALLEXNative)\r