summaryrefslogtreecommitdiff
path: root/src/lj_ccallback.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/lj_ccallback.c36
1 files changed, 35 insertions, 1 deletions
diff --git a/src/lj_ccallback.c b/src/lj_ccallback.c
index c0668e41..f3474588 100644
--- a/src/lj_ccallback.c
+++ b/src/lj_ccallback.c
@@ -43,6 +43,13 @@ static MSize CALLBACK_OFS2SLOT(MSize ofs)
43#define CALLBACK_MAX_SLOT \ 43#define CALLBACK_MAX_SLOT \
44 (((CALLBACK_MCODE_SIZE-CALLBACK_MCODE_HEAD)/(CALLBACK_MCODE_GROUP+4*32))*32) 44 (((CALLBACK_MCODE_SIZE-CALLBACK_MCODE_HEAD)/(CALLBACK_MCODE_GROUP+4*32))*32)
45 45
46#elif LJ_TARGET_ARM
47
48#define CALLBACK_MCODE_HEAD 32
49#define CALLBACK_SLOT2OFS(slot) (CALLBACK_MCODE_HEAD + 8*(slot))
50#define CALLBACK_OFS2SLOT(ofs) (((ofs)-CALLBACK_MCODE_HEAD)/8)
51#define CALLBACK_MAX_SLOT (CALLBACK_OFS2SLOT(CALLBACK_MCODE_SIZE))
52
46#elif LJ_TARGET_PPC 53#elif LJ_TARGET_PPC
47 54
48#define CALLBACK_MCODE_HEAD 24 55#define CALLBACK_MCODE_HEAD 24
@@ -110,6 +117,28 @@ static void callback_mcode_init(global_State *g, uint8_t *page)
110 } 117 }
111 lua_assert(p - page <= CALLBACK_MCODE_SIZE); 118 lua_assert(p - page <= CALLBACK_MCODE_SIZE);
112} 119}
120#elif LJ_TARGET_ARM
121static void callback_mcode_init(global_State *g, uint32_t *page)
122{
123 uint32_t *p = page;
124 void *target = (void *)lj_vm_ffi_callback;
125 MSize slot;
126 /* This must match with the saveregs macro in buildvm_arm.dasc. */
127 *p++ = ARMI_SUB|ARMF_D(RID_R12)|ARMF_N(RID_R12)|ARMF_M(RID_PC);
128 *p++ = ARMI_PUSH|ARMF_N(RID_SP)|RSET_RANGE(RID_R4,RID_R11+1)|RID2RSET(RID_LR);
129 *p++ = ARMI_SUB|ARMI_K12|ARMF_D(RID_R12)|ARMF_N(RID_R12)|CALLBACK_MCODE_HEAD;
130 *p++ = ARMI_STR|ARMI_LS_P|ARMI_LS_W|ARMF_D(RID_R12)|ARMF_N(RID_SP)|(CFRAME_SIZE-4*9);
131 *p++ = ARMI_LDR|ARMI_LS_P|ARMI_LS_U|ARMF_D(RID_R12)|ARMF_N(RID_PC);
132 *p++ = ARMI_LDR|ARMI_LS_P|ARMI_LS_U|ARMF_D(RID_PC)|ARMF_N(RID_PC);
133 *p++ = u32ptr(g);
134 *p++ = u32ptr(target);
135 for (slot = 0; slot < CALLBACK_MAX_SLOT; slot++) {
136 *p++ = ARMI_MOV|ARMF_D(RID_R12)|ARMF_M(RID_PC);
137 *p = ARMI_B | ((page-p-2) & 0x00ffffffu);
138 p++;
139 }
140 lua_assert(p - page <= CALLBACK_MCODE_SIZE);
141}
113#elif LJ_TARGET_PPC 142#elif LJ_TARGET_PPC
114static void callback_mcode_init(global_State *g, uint32_t *page) 143static void callback_mcode_init(global_State *g, uint32_t *page)
115{ 144{
@@ -245,7 +274,12 @@ void lj_ccallback_mcode_free(CTState *cts)
245#elif LJ_TARGET_ARM 274#elif LJ_TARGET_ARM
246 275
247#define CALLBACK_HANDLE_REGARG \ 276#define CALLBACK_HANDLE_REGARG \
248 UNUSED(ngpr); UNUSED(maxgpr); goto done; /* NYI */ 277 if (n > 1) ngpr = (ngpr + 1u) & ~1u; /* Align to regpair. */ \
278 if (ngpr + n <= maxgpr) { \
279 sp = &cts->cb.gpr[ngpr]; \
280 ngpr += n; \
281 goto done; \
282 }
249 283
250#elif LJ_TARGET_PPC 284#elif LJ_TARGET_PPC
251 285