*/
#define MASK_DISPLACEMENT(reg, mode) ({ \
sint64_t val = 0; \
- if (mode == DISP8) { \
+ if (mode == DISP0) { \
+ val = reg; \
+ } else if (mode == DISP8) { \
val = (sint8_t)(reg & 0xff); \
} else if (mode == DISP16) { \
val = (sint16_t)(reg & 0xffff); \
#define ADDR_MASK(val, length) ({ \
ullong_t mask = 0x0LL; \
switch (length) { \
+ case 1: \
+ mask = 0x0000000000000ffLL; \
+ break; \
case 2: \
mask = 0x00000000000fffffLL; \
break; \
mod_mode = DISP8;
} else if (modrm->mod == 2) {
mod_mode = DISP16;
+ } else {
+ PrintError("Instruction format error: Invalid mod_rm mode (%d)\n", modrm->mod);
+ v3_print_instr(instr);
+ return -1;
}
switch (modrm->rm) {
case 0:
- base_addr = gprs->rbx + MASK_DISPLACEMENT(gprs->rsi, mod_mode);
+ base_addr = gprs->rbx + ADDR_MASK(gprs->rsi, 2);
break;
case 1:
- base_addr = gprs->rbx + MASK_DISPLACEMENT(gprs->rdi, mod_mode);
+ base_addr = gprs->rbx + ADDR_MASK(gprs->rdi, 2);
break;
case 2:
- base_addr = gprs->rbp + MASK_DISPLACEMENT(gprs->rsi, mod_mode);
+ base_addr = gprs->rbp + ADDR_MASK(gprs->rsi, 2);
break;
case 3:
- base_addr = gprs->rbp + MASK_DISPLACEMENT(gprs->rdi, mod_mode);
+ base_addr = gprs->rbp + ADDR_MASK(gprs->rdi, 2);
break;
case 4:
- base_addr = gprs->rsi;
+ base_addr = ADDR_MASK(gprs->rsi, 2);
break;
case 5:
- base_addr = gprs->rdi;
+ base_addr = ADDR_MASK(gprs->rdi, 2);
break;
case 6:
if (modrm->mod == 0) {
base_addr = 0;
mod_mode = DISP16;
} else {
- base_addr = gprs->rbp;
+ base_addr = ADDR_MASK(gprs->rbp, 2);
}
break;
case 7:
- base_addr = gprs->rbx;
+ base_addr = ADDR_MASK(gprs->rbx, 2);
break;
}
mod_mode = DISP8;
} else if (modrm->mod == 2) {
mod_mode = DISP32;
+ } else {
+ PrintError("Instruction format error: Invalid mod_rm mode (%d)\n", modrm->mod);
+ v3_print_instr(instr);
+ return -1;
}
switch (modrm->rm) {
mod_mode = DISP8;
} else if (modrm->mod == 2) {
mod_mode = DISP32;
+ } else {
+ PrintError("Instruction format error: Invalid mod_rm mode (%d)\n", modrm->mod);
+ v3_print_instr(instr);
+ return -1;
}
if (rm_val == 4) {