aboutsummaryrefslogtreecommitdiff
path: root/src/vm_arm.dasc
diff options
context:
space:
mode:
authorMike Pall <mike>2013-08-28 13:06:19 +0200
committerMike Pall <mike>2013-08-30 23:38:17 +0200
commit517500ba48a290699d5a2ec7465bf76a5109c49f (patch)
treeb780b0919bd2b79db462d0f392158d4b1ee6339c /src/vm_arm.dasc
parent5120240b77e4544b9b7405b4849a6cc63cdbbe1e (diff)
downloadluajit-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.dasc26
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]