... | ... |
@@ -1116,6 +1116,7 @@ static int cli_bytecode_prepare_interpreter(struct cli_bc *bc) |
1116 | 1116 |
case OP_ICMP_SLT: |
1117 | 1117 |
case OP_ICMP_SLE: |
1118 | 1118 |
case OP_COPY: |
1119 |
+ case OP_STORE: |
|
1119 | 1120 |
MAP(inst->u.binop[0]); |
1120 | 1121 |
MAP(inst->u.binop[1]); |
1121 | 1122 |
break; |
... | ... |
@@ -1175,6 +1176,9 @@ static int cli_bytecode_prepare_interpreter(struct cli_bc *bc) |
1175 | 1175 |
} |
1176 | 1176 |
break; |
1177 | 1177 |
} |
1178 |
+ case OP_LOAD: |
|
1179 |
+ MAP(inst->u.unaryop); |
|
1180 |
+ break; |
|
1178 | 1181 |
default: |
1179 | 1182 |
cli_dbgmsg("Unhandled opcode: %d\n", inst->opcode); |
1180 | 1183 |
return CL_EBYTECODE; |
... | ... |
@@ -251,6 +251,10 @@ static always_inline struct stack_entry *pop_stack(struct stack *stack, |
251 | 251 |
CHECK_EQ((p)&7, 0);\ |
252 | 252 |
TRACE_W(x, p, 64);\ |
253 | 253 |
*(uint64_t*)&values[p] = x |
254 |
+#define WRITEP(x, p) CHECK_GT(func->numBytes, p+PSIZE-1);\ |
|
255 |
+ CHECK_EQ((p)&(PSIZE-1), 0);\ |
|
256 |
+ TRACE_W(x, p, PSIZE*8);\ |
|
257 |
+ *(void**)&values[p] = x |
|
254 | 258 |
|
255 | 259 |
#define READ1(x, p) CHECK_GT(func->numBytes, p);\ |
256 | 260 |
x = (*(uint8_t*)&values[p])&1;\ |
... | ... |
@@ -270,6 +274,11 @@ static always_inline struct stack_entry *pop_stack(struct stack *stack, |
270 | 270 |
CHECK_EQ((p)&7, 0);\ |
271 | 271 |
x = *(uint64_t*)&values[p];\ |
272 | 272 |
TRACE_R(x) |
273 |
+#define PSIZE sizeof(void*) |
|
274 |
+#define READP(x, p) CHECK_GT(func->numBytes, p+PSIZE-1);\ |
|
275 |
+ CHECK_EQ((p)&(PSIZE-1), 0);\ |
|
276 |
+ x = *(void**)&values[p];\ |
|
277 |
+ TRACE_R(x) |
|
273 | 278 |
|
274 | 279 |
#define READOLD8(x, p) CHECK_GT(func->numBytes, p);\ |
275 | 280 |
x = *(uint8_t*)&old_values[p];\ |
... | ... |
@@ -680,6 +689,82 @@ int cli_vm_execute(const struct cli_bc *bc, struct cli_bc_ctx *ctx, const struct |
680 | 680 |
break; |
681 | 681 |
} |
682 | 682 |
|
683 |
+ case OP_LOAD*5: |
|
684 |
+ case OP_LOAD*5+1: |
|
685 |
+ { |
|
686 |
+ uint8_t *ptr; |
|
687 |
+ READP(ptr, inst->u.unaryop); |
|
688 |
+ WRITE8(inst->dest, (*ptr)); |
|
689 |
+ break; |
|
690 |
+ } |
|
691 |
+ case OP_LOAD*5+2: |
|
692 |
+ { |
|
693 |
+ const union unaligned_16 *ptr; |
|
694 |
+ READP(ptr, inst->u.unaryop); |
|
695 |
+ WRITE16(inst->dest, (ptr->una_u16)); |
|
696 |
+ break; |
|
697 |
+ } |
|
698 |
+ case OP_LOAD*5+3: |
|
699 |
+ { |
|
700 |
+ const union unaligned_32 *ptr; |
|
701 |
+ READP(ptr, inst->u.unaryop); |
|
702 |
+ WRITE32(inst->dest, (ptr->una_u32)); |
|
703 |
+ break; |
|
704 |
+ } |
|
705 |
+ case OP_LOAD*5+4: |
|
706 |
+ { |
|
707 |
+ const union unaligned_64 *ptr; |
|
708 |
+ READP(ptr, inst->u.unaryop); |
|
709 |
+ WRITE64(inst->dest, (ptr->una_u64)); |
|
710 |
+ break; |
|
711 |
+ } |
|
712 |
+ |
|
713 |
+ case OP_STORE*5: |
|
714 |
+ { |
|
715 |
+ uint8_t *ptr; |
|
716 |
+ uint8_t v; |
|
717 |
+ READP(ptr, BINOP(0)); |
|
718 |
+ READ1(v, BINOP(1)); |
|
719 |
+ *ptr = v; |
|
720 |
+ break; |
|
721 |
+ } |
|
722 |
+ case OP_STORE*5+1: |
|
723 |
+ { |
|
724 |
+ uint8_t *ptr; |
|
725 |
+ uint8_t v; |
|
726 |
+ READP(ptr, BINOP(0)); |
|
727 |
+ READ8(v, BINOP(1)); |
|
728 |
+ *ptr = v; |
|
729 |
+ break; |
|
730 |
+ } |
|
731 |
+ case OP_STORE*5+2: |
|
732 |
+ { |
|
733 |
+ union unaligned_16 *ptr; |
|
734 |
+ uint16_t v; |
|
735 |
+ READP(ptr, BINOP(0)); |
|
736 |
+ READ16(v, BINOP(1)); |
|
737 |
+ ptr->una_s16 = v; |
|
738 |
+ break; |
|
739 |
+ } |
|
740 |
+ case OP_STORE*5+3: |
|
741 |
+ { |
|
742 |
+ union unaligned_32 *ptr; |
|
743 |
+ uint32_t v; |
|
744 |
+ READP(ptr, BINOP(0)); |
|
745 |
+ READ32(v, BINOP(1)); |
|
746 |
+ ptr->una_u32 = v; |
|
747 |
+ break; |
|
748 |
+ } |
|
749 |
+ case OP_STORE*5+4: |
|
750 |
+ { |
|
751 |
+ union unaligned_64 *ptr; |
|
752 |
+ uint64_t v; |
|
753 |
+ READP(ptr, BINOP(0)); |
|
754 |
+ READ64(v, BINOP(1)); |
|
755 |
+ ptr->una_u64 = v; |
|
756 |
+ break; |
|
757 |
+ } |
|
758 |
+ |
|
683 | 759 |
default: |
684 | 760 |
cli_errmsg("Opcode %u of type %u is not implemented yet!\n", |
685 | 761 |
inst->interp_op/5, inst->interp_op%5); |
... | ... |
@@ -229,6 +229,20 @@ extern int have_rar; |
229 | 229 |
(((v) & 0xff00000000000000ULL) >> 56)) |
230 | 230 |
|
231 | 231 |
|
232 |
+union unaligned_64 { |
|
233 |
+ uint64_t una_u64; |
|
234 |
+ int64_t una_s64; |
|
235 |
+} __attribute__((packed)); |
|
236 |
+ |
|
237 |
+union unaligned_32 { |
|
238 |
+ uint32_t una_u32; |
|
239 |
+ int32_t una_s32; |
|
240 |
+} __attribute__((packed)); |
|
241 |
+ |
|
242 |
+union unaligned_16 { |
|
243 |
+ uint16_t una_u16; |
|
244 |
+ int16_t una_s16; |
|
245 |
+} __attribute__((packed)); |
|
232 | 246 |
#if WORDS_BIGENDIAN == 0 |
233 | 247 |
|
234 | 248 |
#ifndef HAVE_ATTRIB_PACKED |
... | ... |
@@ -241,14 +255,6 @@ extern int have_rar; |
241 | 241 |
#pragma pack 1 |
242 | 242 |
#endif |
243 | 243 |
|
244 |
-union unaligned_32 { |
|
245 |
- uint32_t una_u32; |
|
246 |
- int32_t una_s32; |
|
247 |
-} __attribute__((packed)); |
|
248 |
- |
|
249 |
-union unaligned_16 { |
|
250 |
- int16_t una_s16; |
|
251 |
-} __attribute__((packed)); |
|
252 | 244 |
|
253 | 245 |
#ifdef HAVE_PRAGMA_PACK |
254 | 246 |
#pragma pack() |