diff options
author | Mike Pall <mike> | 2013-08-28 13:06:19 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2013-08-30 23:38:17 +0200 |
commit | 517500ba48a290699d5a2ec7465bf76a5109c49f (patch) | |
tree | b780b0919bd2b79db462d0f392158d4b1ee6339c /src/vm_ppc.dasc | |
parent | 5120240b77e4544b9b7405b4849a6cc63cdbbe1e (diff) | |
download | luajit-517500ba48a290699d5a2ec7465bf76a5109c49f.tar.gz luajit-517500ba48a290699d5a2ec7465bf76a5109c49f.tar.bz2 luajit-517500ba48a290699d5a2ec7465bf76a5109c49f.zip |
Save currently executing lua_State in g->cur_L.
This is only a good approximation due to deficiencies in the design of
the Lua/C API. It indicates _some_ valid state that is/was executing.
Also reorder L->cframe stores to achieve a synchronously consistent state.
Diffstat (limited to 'src/vm_ppc.dasc')
-rw-r--r-- | src/vm_ppc.dasc | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/src/vm_ppc.dasc b/src/vm_ppc.dasc index d009d005..d9186c44 100644 --- a/src/vm_ppc.dasc +++ b/src/vm_ppc.dasc | |||
@@ -662,12 +662,13 @@ static void build_subroutines(BuildCtx *ctx) | |||
662 | | stw CARG3, SAVE_NRES | 662 | | stw CARG3, SAVE_NRES |
663 | | cmplwi TMP1, 0 | 663 | | cmplwi TMP1, 0 |
664 | | stw CARG3, SAVE_ERRF | 664 | | stw CARG3, SAVE_ERRF |
665 | | stp TMP0, L->cframe | ||
666 | | stp CARG3, SAVE_CFRAME | 665 | | stp CARG3, SAVE_CFRAME |
667 | | stw CARG1, SAVE_PC // Any value outside of bytecode is ok. | 666 | | stw CARG1, SAVE_PC // Any value outside of bytecode is ok. |
667 | | stp TMP0, L->cframe | ||
668 | | beq >3 | 668 | | beq >3 |
669 | | | 669 | | |
670 | | // Resume after yield (like a return). | 670 | | // Resume after yield (like a return). |
671 | | stw L, DISPATCH_GL(cur_L)(DISPATCH) | ||
671 | | mr RA, BASE | 672 | | mr RA, BASE |
672 | | lp BASE, L->base | 673 | | lp BASE, L->base |
673 | | li TISNUM, LJ_TISNUM // Setup type comparison constants. | 674 | | li TISNUM, LJ_TISNUM // Setup type comparison constants. |
@@ -707,17 +708,18 @@ static void build_subroutines(BuildCtx *ctx) | |||
707 | | | 708 | | |
708 | |1: // Entry point for vm_pcall above (PC = ftype). | 709 | |1: // Entry point for vm_pcall above (PC = ftype). |
709 | | lp TMP1, L:CARG1->cframe | 710 | | lp TMP1, L:CARG1->cframe |
710 | | stw CARG3, SAVE_NRES | ||
711 | | mr L, CARG1 | 711 | | mr L, CARG1 |
712 | | stw CARG1, SAVE_L | 712 | | stw CARG3, SAVE_NRES |
713 | | mr BASE, CARG2 | ||
714 | | stp sp, L->cframe // Add our C frame to cframe chain. | ||
715 | | lwz DISPATCH, L->glref // Setup pointer to dispatch table. | 713 | | lwz DISPATCH, L->glref // Setup pointer to dispatch table. |
714 | | stw CARG1, SAVE_L | ||
715 | | mr BASE, CARG2 | ||
716 | | addi DISPATCH, DISPATCH, GG_G2DISP | ||
716 | | stw CARG1, SAVE_PC // Any value outside of bytecode is ok. | 717 | | stw CARG1, SAVE_PC // Any value outside of bytecode is ok. |
717 | | stp TMP1, SAVE_CFRAME | 718 | | stp TMP1, SAVE_CFRAME |
718 | | addi DISPATCH, DISPATCH, GG_G2DISP | 719 | | stp sp, L->cframe // Add our C frame to cframe chain. |
719 | | | 720 | | |
720 | |3: // Entry point for vm_cpcall/vm_resume (BASE = base, PC = ftype). | 721 | |3: // Entry point for vm_cpcall/vm_resume (BASE = base, PC = ftype). |
722 | | stw L, DISPATCH_GL(cur_L)(DISPATCH) | ||
721 | | lp TMP2, L->base // TMP2 = old base (used in vmeta_call). | 723 | | lp TMP2, L->base // TMP2 = old base (used in vmeta_call). |
722 | | li TISNUM, LJ_TISNUM // Setup type comparison constants. | 724 | | li TISNUM, LJ_TISNUM // Setup type comparison constants. |
723 | | lp TMP1, L->top | 725 | | lp TMP1, L->top |
@@ -754,15 +756,18 @@ static void build_subroutines(BuildCtx *ctx) | |||
754 | | lwz TMP0, L:CARG1->stack | 756 | | lwz TMP0, L:CARG1->stack |
755 | | stw CARG1, SAVE_L | 757 | | stw CARG1, SAVE_L |
756 | | lp TMP1, L->top | 758 | | lp TMP1, L->top |
759 | | lwz DISPATCH, L->glref // Setup pointer to dispatch table. | ||
757 | | stw CARG1, SAVE_PC // Any value outside of bytecode is ok. | 760 | | stw CARG1, SAVE_PC // Any value outside of bytecode is ok. |
758 | | sub TMP0, TMP0, TMP1 // Compute -savestack(L, L->top). | 761 | | sub TMP0, TMP0, TMP1 // Compute -savestack(L, L->top). |
759 | | lp TMP1, L->cframe | 762 | | lp TMP1, L->cframe |
760 | | stp sp, L->cframe // Add our C frame to cframe chain. | 763 | | addi DISPATCH, DISPATCH, GG_G2DISP |
761 | | .toc lp CARG4, 0(CARG4) | 764 | | .toc lp CARG4, 0(CARG4) |
762 | | li TMP2, 0 | 765 | | li TMP2, 0 |
763 | | stw TMP0, SAVE_NRES // Neg. delta means cframe w/o frame. | 766 | | stw TMP0, SAVE_NRES // Neg. delta means cframe w/o frame. |
764 | | stw TMP2, SAVE_ERRF // No error function. | 767 | | stw TMP2, SAVE_ERRF // No error function. |
765 | | stp TMP1, SAVE_CFRAME | 768 | | stp TMP1, SAVE_CFRAME |
769 | | stp sp, L->cframe // Add our C frame to cframe chain. | ||
770 | | stw L, DISPATCH_GL(cur_L)(DISPATCH) | ||
766 | | mtctr CARG4 | 771 | | mtctr CARG4 |
767 | | bctrl // (lua_State *L, lua_CFunction func, void *ud) | 772 | | bctrl // (lua_State *L, lua_CFunction func, void *ud) |
768 | |.if PPE | 773 | |.if PPE |
@@ -771,9 +776,7 @@ static void build_subroutines(BuildCtx *ctx) | |||
771 | |.else | 776 | |.else |
772 | | mr. BASE, CRET1 | 777 | | mr. BASE, CRET1 |
773 | |.endif | 778 | |.endif |
774 | | lwz DISPATCH, L->glref // Setup pointer to dispatch table. | 779 | | li PC, FRAME_CP |
775 | | li PC, FRAME_CP | ||
776 | | addi DISPATCH, DISPATCH, GG_G2DISP | ||
777 | | bne <3 // Else continue with the call. | 780 | | bne <3 // Else continue with the call. |
778 | | b ->vm_leave_cp // No base? Just remove C frame. | 781 | | b ->vm_leave_cp // No base? Just remove C frame. |
779 | | | 782 | | |
@@ -1629,6 +1632,7 @@ static void build_subroutines(BuildCtx *ctx) | |||
1629 | | lp TMP3, L:SAVE0->top | 1632 | | lp TMP3, L:SAVE0->top |
1630 | | li_vmstate INTERP | 1633 | | li_vmstate INTERP |
1631 | | lp BASE, L->base | 1634 | | lp BASE, L->base |
1635 | | stw L, DISPATCH_GL(cur_L)(DISPATCH) | ||
1632 | | st_vmstate | 1636 | | st_vmstate |
1633 | | bgt >8 | 1637 | | bgt >8 |
1634 | | sub RD, TMP3, TMP2 | 1638 | | sub RD, TMP3, TMP2 |
@@ -2535,7 +2539,7 @@ static void build_subroutines(BuildCtx *ctx) | |||
2535 | | savex_ 20,21,22,23 | 2539 | | savex_ 20,21,22,23 |
2536 | | lhz CARG4, 2(CARG3) // Load trace number. | 2540 | | lhz CARG4, 2(CARG3) // Load trace number. |
2537 | | savex_ 24,25,26,27 | 2541 | | savex_ 24,25,26,27 |
2538 | | lwz L, DISPATCH_GL(jit_L)(DISPATCH) | 2542 | | lwz L, DISPATCH_GL(cur_L)(DISPATCH) |
2539 | | savex_ 28,29,30,31 | 2543 | | savex_ 28,29,30,31 |
2540 | | sub CARG3, TMP0, CARG3 // Compute exit number. | 2544 | | sub CARG3, TMP0, CARG3 // Compute exit number. |
2541 | | lp BASE, DISPATCH_GL(jit_base)(DISPATCH) | 2545 | | lp BASE, DISPATCH_GL(jit_base)(DISPATCH) |
@@ -4852,7 +4856,6 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
4852 | | lp TMP2, TRACE:TMP2->mcode | 4856 | | lp TMP2, TRACE:TMP2->mcode |
4853 | | stw BASE, DISPATCH_GL(jit_base)(DISPATCH) | 4857 | | stw BASE, DISPATCH_GL(jit_base)(DISPATCH) |
4854 | | mtctr TMP2 | 4858 | | mtctr TMP2 |
4855 | | stw L, DISPATCH_GL(jit_L)(DISPATCH) | ||
4856 | | addi JGL, DISPATCH, GG_DISP2G+32768 | 4859 | | addi JGL, DISPATCH, GG_DISP2G+32768 |
4857 | | stw L, DISPATCH_GL(tmpbuf.L)(DISPATCH) | 4860 | | stw L, DISPATCH_GL(tmpbuf.L)(DISPATCH) |
4858 | | bctr | 4861 | | bctr |
@@ -4989,6 +4992,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
4989 | | lp TMP1, L->top | 4992 | | lp TMP1, L->top |
4990 | | li_vmstate INTERP | 4993 | | li_vmstate INTERP |
4991 | | lwz PC, FRAME_PC(BASE) // Fetch PC of caller. | 4994 | | lwz PC, FRAME_PC(BASE) // Fetch PC of caller. |
4995 | | stw L, DISPATCH_GL(cur_L)(DISPATCH) | ||
4992 | | sub RA, TMP1, RD // RA = L->top - nresults*8 | 4996 | | sub RA, TMP1, RD // RA = L->top - nresults*8 |
4993 | | st_vmstate | 4997 | | st_vmstate |
4994 | | b ->vm_returnc | 4998 | | b ->vm_returnc |