diff options
Diffstat (limited to '')
-rw-r--r-- | src/lj_ccallback.c | 36 |
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 | ||
121 | static 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 |
114 | static void callback_mcode_init(global_State *g, uint32_t *page) | 143 | static 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 | ||