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_arm.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_arm.dasc')
-rw-r--r-- | src/vm_arm.dasc | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/src/vm_arm.dasc b/src/vm_arm.dasc index b235967f..dd39052c 100644 --- a/src/vm_arm.dasc +++ b/src/vm_arm.dasc | |||
@@ -419,13 +419,14 @@ static void build_subroutines(BuildCtx *ctx) | |||
419 | | add CARG2, sp, #CFRAME_RESUME | 419 | | add CARG2, sp, #CFRAME_RESUME |
420 | | ldrb CARG1, L->status | 420 | | ldrb CARG1, L->status |
421 | | str CARG3, SAVE_ERRF | 421 | | str CARG3, SAVE_ERRF |
422 | | str CARG2, L->cframe | 422 | | str L, SAVE_PC // Any value outside of bytecode is ok. |
423 | | str CARG3, SAVE_CFRAME | 423 | | str CARG3, SAVE_CFRAME |
424 | | cmp CARG1, #0 | 424 | | cmp CARG1, #0 |
425 | | str L, SAVE_PC // Any value outside of bytecode is ok. | 425 | | str CARG2, L->cframe |
426 | | beq >3 | 426 | | beq >3 |
427 | | | 427 | | |
428 | | // Resume after yield (like a return). | 428 | | // Resume after yield (like a return). |
429 | | str L, [DISPATCH, #DISPATCH_GL(cur_L)] | ||
429 | | mov RA, BASE | 430 | | mov RA, BASE |
430 | | ldr BASE, L->base | 431 | | ldr BASE, L->base |
431 | | ldr CARG1, L->top | 432 | | ldr CARG1, L->top |
@@ -459,14 +460,15 @@ static void build_subroutines(BuildCtx *ctx) | |||
459 | | str CARG3, SAVE_NRES | 460 | | str CARG3, SAVE_NRES |
460 | | mov L, CARG1 | 461 | | mov L, CARG1 |
461 | | str CARG1, SAVE_L | 462 | | str CARG1, SAVE_L |
462 | | mov BASE, CARG2 | ||
463 | | str sp, L->cframe // Add our C frame to cframe chain. | ||
464 | | ldr DISPATCH, L->glref // Setup pointer to dispatch table. | 463 | | ldr DISPATCH, L->glref // Setup pointer to dispatch table. |
464 | | mov BASE, CARG2 | ||
465 | | str CARG1, SAVE_PC // Any value outside of bytecode is ok. | 465 | | str CARG1, SAVE_PC // Any value outside of bytecode is ok. |
466 | | str RC, SAVE_CFRAME | 466 | | str RC, SAVE_CFRAME |
467 | | add DISPATCH, DISPATCH, #GG_G2DISP | 467 | | add DISPATCH, DISPATCH, #GG_G2DISP |
468 | | str sp, L->cframe // Add our C frame to cframe chain. | ||
468 | | | 469 | | |
469 | |3: // Entry point for vm_cpcall/vm_resume (BASE = base, PC = ftype). | 470 | |3: // Entry point for vm_cpcall/vm_resume (BASE = base, PC = ftype). |
471 | | str L, [DISPATCH, #DISPATCH_GL(cur_L)] | ||
470 | | ldr RB, L->base // RB = old base (for vmeta_call). | 472 | | ldr RB, L->base // RB = old base (for vmeta_call). |
471 | | ldr CARG1, L->top | 473 | | ldr CARG1, L->top |
472 | | mov MASKR8, #255 | 474 | | mov MASKR8, #255 |
@@ -492,20 +494,21 @@ static void build_subroutines(BuildCtx *ctx) | |||
492 | | mov L, CARG1 | 494 | | mov L, CARG1 |
493 | | ldr RA, L:CARG1->stack | 495 | | ldr RA, L:CARG1->stack |
494 | | str CARG1, SAVE_L | 496 | | str CARG1, SAVE_L |
497 | | ldr DISPATCH, L->glref // Setup pointer to dispatch table. | ||
495 | | ldr RB, L->top | 498 | | ldr RB, L->top |
496 | | str CARG1, SAVE_PC // Any value outside of bytecode is ok. | 499 | | str CARG1, SAVE_PC // Any value outside of bytecode is ok. |
497 | | ldr RC, L->cframe | 500 | | ldr RC, L->cframe |
501 | | add DISPATCH, DISPATCH, #GG_G2DISP | ||
498 | | sub RA, RA, RB // Compute -savestack(L, L->top). | 502 | | sub RA, RA, RB // Compute -savestack(L, L->top). |
499 | | str sp, L->cframe // Add our C frame to cframe chain. | ||
500 | | mov RB, #0 | 503 | | mov RB, #0 |
501 | | str RA, SAVE_NRES // Neg. delta means cframe w/o frame. | 504 | | str RA, SAVE_NRES // Neg. delta means cframe w/o frame. |
502 | | str RB, SAVE_ERRF // No error function. | 505 | | str RB, SAVE_ERRF // No error function. |
503 | | str RC, SAVE_CFRAME | 506 | | str RC, SAVE_CFRAME |
507 | | str sp, L->cframe // Add our C frame to cframe chain. | ||
508 | | str L, [DISPATCH, #DISPATCH_GL(cur_L)] | ||
504 | | blx CARG4 // (lua_State *L, lua_CFunction func, void *ud) | 509 | | blx CARG4 // (lua_State *L, lua_CFunction func, void *ud) |
505 | | ldr DISPATCH, L->glref // Setup pointer to dispatch table. | ||
506 | | movs BASE, CRET1 | 510 | | movs BASE, CRET1 |
507 | | mov PC, #FRAME_CP | 511 | | mov PC, #FRAME_CP |
508 | | add DISPATCH, DISPATCH, #GG_G2DISP | ||
509 | | bne <3 // Else continue with the call. | 512 | | bne <3 // Else continue with the call. |
510 | | b ->vm_leave_cp // No base? Just remove C frame. | 513 | | b ->vm_leave_cp // No base? Just remove C frame. |
511 | | | 514 | | |
@@ -1262,9 +1265,10 @@ static void build_subroutines(BuildCtx *ctx) | |||
1262 | | ldr CARG3, L:RA->base | 1265 | | ldr CARG3, L:RA->base |
1263 | | mv_vmstate CARG2, INTERP | 1266 | | mv_vmstate CARG2, INTERP |
1264 | | ldr CARG4, L:RA->top | 1267 | | ldr CARG4, L:RA->top |
1265 | | st_vmstate CARG2 | ||
1266 | | cmp CRET1, #LUA_YIELD | 1268 | | cmp CRET1, #LUA_YIELD |
1267 | | ldr BASE, L->base | 1269 | | ldr BASE, L->base |
1270 | | str L, [DISPATCH, #DISPATCH_GL(cur_L)] | ||
1271 | | st_vmstate CARG2 | ||
1268 | | bhi >8 | 1272 | | bhi >8 |
1269 | | subs RC, CARG4, CARG3 | 1273 | | subs RC, CARG4, CARG3 |
1270 | | ldr CARG1, L->maxstack | 1274 | | ldr CARG1, L->maxstack |
@@ -2102,7 +2106,7 @@ static void build_subroutines(BuildCtx *ctx) | |||
2102 | | add CARG1, CARG1, CARG2, asr #6 | 2106 | | add CARG1, CARG1, CARG2, asr #6 |
2103 | | ldr CARG2, [lr, #4] // Load exit stub group offset. | 2107 | | ldr CARG2, [lr, #4] // Load exit stub group offset. |
2104 | | sub CARG1, CARG1, lr | 2108 | | sub CARG1, CARG1, lr |
2105 | | ldr L, [DISPATCH, #DISPATCH_GL(jit_L)] | 2109 | | ldr L, [DISPATCH, #DISPATCH_GL(cur_L)] |
2106 | | add CARG1, CARG2, CARG1, lsr #2 // Compute exit number. | 2110 | | add CARG1, CARG2, CARG1, lsr #2 // Compute exit number. |
2107 | | ldr BASE, [DISPATCH, #DISPATCH_GL(jit_base)] | 2111 | | ldr BASE, [DISPATCH, #DISPATCH_GL(jit_base)] |
2108 | | str CARG1, [DISPATCH, #DISPATCH_J(exitno)] | 2112 | | str CARG1, [DISPATCH, #DISPATCH_J(exitno)] |
@@ -4285,7 +4289,6 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
4285 | | st_vmstate CARG2 | 4289 | | st_vmstate CARG2 |
4286 | | ldr RA, TRACE:RC->mcode | 4290 | | ldr RA, TRACE:RC->mcode |
4287 | | str BASE, [DISPATCH, #DISPATCH_GL(jit_base)] | 4291 | | str BASE, [DISPATCH, #DISPATCH_GL(jit_base)] |
4288 | | str L, [DISPATCH, #DISPATCH_GL(jit_L)] | ||
4289 | | str L, [DISPATCH, #DISPATCH_GL(tmpbuf.L)] | 4292 | | str L, [DISPATCH, #DISPATCH_GL(tmpbuf.L)] |
4290 | | bx RA | 4293 | | bx RA |
4291 | |.endif | 4294 | |.endif |
@@ -4404,6 +4407,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
4404 | | ldr BASE, L->base | 4407 | | ldr BASE, L->base |
4405 | | mv_vmstate CARG3, INTERP | 4408 | | mv_vmstate CARG3, INTERP |
4406 | | ldr CRET2, L->top | 4409 | | ldr CRET2, L->top |
4410 | | str L, [DISPATCH, #DISPATCH_GL(cur_L)] | ||
4407 | | lsl RC, CRET1, #3 | 4411 | | lsl RC, CRET1, #3 |
4408 | | st_vmstate CARG3 | 4412 | | st_vmstate CARG3 |
4409 | | ldr PC, [BASE, FRAME_PC] | 4413 | | ldr PC, [BASE, FRAME_PC] |