]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Update transition from EBC function to native IPF function to guarantee that at least...
authormdkinney <mdkinney@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 27 Oct 2009 22:58:55 +0000 (22:58 +0000)
committermdkinney <mdkinney@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 27 Oct 2009 22:58:55 +0000 (22:58 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9377 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Universal/EbcDxe/Ipf/EbcLowLevel.s

index 4c0f80fb02f06748afe010e769ccfbd653e8488d..26b3c48616d3098c52c66ede1de3562e69d0276b 100644 (file)
@@ -121,30 +121,66 @@ PROCEDURE_ENTRY(EbcAsmLLCALLEX)
 \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