int rd = (inst >> 21) & 0x1f;
- naja->regs[NAJA_REG_LR] = naja->ip + 4;
+ naja->regs[NAJA_REG_LR] = SCF_VM_ADDR(vm, naja->ip + 4);
if (naja_vm_dynamic_link == (void*)naja->regs[rd]) {
naja->ip = naja->regs[NAJA_REG_LR];
+ if (naja->ip >= (uint64_t)vm->text->data
+ && naja->ip < (uint64_t)vm->text->data + vm->text->len) {
+ naja->ip = SCF_ELF_ADDR(vm, naja->ip);
+ }
+
} else if (naja->regs[rd] < vm->text->addr
|| naja->regs[rd] > vm->text->addr + vm->text->len) {
naja->fvec[7].d[0]);
naja->ip = naja->regs[NAJA_REG_LR];
+
+ if (naja->ip >= (uint64_t)vm->text->data
+ && naja->ip < (uint64_t)vm->text->data + vm->text->len) {
+ naja->ip = SCF_ELF_ADDR(vm, naja->ip);
+ }
} else {
NAJA_PRINTF("call r%d, %#lx\n", rd, naja->regs[rd]);
naja->ip = naja->regs[rd];
{
scf_vm_naja_t* naja = vm->priv;
- naja->ip = naja->regs[NAJA_REG_LR];
int64_t sp = -naja->regs[NAJA_REG_SP];
-
assert (sp >= 0);
- if (naja->size > sp + STACK_INC) {
-
+ if (naja->size > sp + STACK_INC)
+ {
void* p = realloc(naja->stack, sp + STACK_INC);
if (!p) {
scf_loge("\n");
naja->size = sp + STACK_INC;
}
+ naja->ip = naja->regs[NAJA_REG_LR];
+
if (naja->ip >= (uint64_t)vm->text->data
&& naja->ip < (uint64_t)vm->text->data + vm->text->len) {
naja->ip = SCF_ELF_ADDR(vm, naja->ip);
uint32_t inst = *(uint32_t*)(vm->text->data + offset);
naja_opcode_pt pt = naja_opcodes[(inst >> 26) & 0x3f];
-
if (!pt) {
scf_loge("inst: %d, %#x\n", (inst >> 26) & 0x3f, inst);
return -EINVAL;
printf("\n%s: \n", s->name);
int j;
- for (j = 0; j < s->st_size; j+= 4) {
+ for (j = 0; j < s->st_size; j += 4) {
uint32_t inst = *(uint32_t*)(vm->text->data + offset + j);
naja_opcode_pt pt = naja_opcodes[(inst >> 26) & 0x3f];
+ naja->ip = vm->text->addr + offset + j;
+
if (!pt) {
- scf_loge("inst: %d, %#x\n", (inst >> 26) & 0x3f, inst);
+ scf_loge("%4d, %#lx: inst: %d, %08x\n", j, naja->ip, (inst >> 26) & 0x3f, inst);
continue;
}
- naja->ip = vm->text->addr + offset + j;
-
- printf("%4d, %#lx: ", j, naja->ip);
+ printf("%4d, %#lx: %08x | ", j, naja->ip, inst);
ret = pt(vm, inst);
if (ret < 0) {