Skip to content
Snippets Groups Projects
Commit 986b7367 authored by Nguyen Anh Quynh's avatar Nguyen Anh Quynh
Browse files

arm: handle V8 mode

parent ba961552
No related branches found
No related tags found
No related merge requests found
......@@ -40,6 +40,10 @@ static void usage(char *prog)
printf(" armbe: ARM - big endian\n");
printf(" thumb: Thumb - little endian\n");
printf(" thumbbe: Thumb - big endian\n");
printf(" armv8: ARM V8 - little endian\n");
printf(" armv8be: ARM V8 - big endian\n");
printf(" thumbv8: Thumb V8 - little endian\n");
printf(" thumbv8be: Thumb V8 - big endian\n");
}
if (ks_arch_supported(KS_ARCH_ARM64)) {
......@@ -207,6 +211,22 @@ int main(int argc, char **argv)
err = ks_open(KS_ARCH_ARM, KS_MODE_THUMB+KS_MODE_BIG_ENDIAN, &ks);
}
if (!strcmp(mode, "armv8")) {
err = ks_open(KS_ARCH_ARM, KS_MODE_ARM+KS_MODE_LITTLE_ENDIAN+KS_MODE_V8, &ks);
}
if (!strcmp(mode, "armv8be")) {
err = ks_open(KS_ARCH_ARM, KS_MODE_ARM+KS_MODE_BIG_ENDIAN+KS_MODE_V8, &ks);
}
if (!strcmp(mode, "thumbv8")) {
err = ks_open(KS_ARCH_ARM, KS_MODE_THUMB+KS_MODE_LITTLE_ENDIAN+KS_MODE_V8, &ks);
}
if (!strcmp(mode, "thumbv8be")) {
err = ks_open(KS_ARCH_ARM, KS_MODE_THUMB+KS_MODE_BIG_ENDIAN+KS_MODE_V8, &ks);
}
if (!strcmp(mode, "arm64")) {
err = ks_open(KS_ARCH_ARM64, KS_MODE_LITTLE_ENDIAN, &ks);
}
......
......@@ -266,16 +266,36 @@ ks_err ks_open(ks_arch arch, int mode, ks_engine **result)
return KS_ERR_MODE;
}
if (mode & KS_MODE_THUMB) {
if (mode & KS_MODE_BIG_ENDIAN)
TripleName = "thumbebv7";
else
TripleName = "thumbv7";
} else {
if (mode & KS_MODE_BIG_ENDIAN)
switch(mode) {
default:
return KS_ERR_MODE;
// big-endian
case KS_MODE_BIG_ENDIAN | KS_MODE_V8 | KS_MODE_ARM:
TripleName = "armv8eb";
break;
case KS_MODE_BIG_ENDIAN | KS_MODE_V8 | KS_MODE_THUMB:
TripleName = "thumbv8eb";
break;
case KS_MODE_BIG_ENDIAN | KS_MODE_ARM:
TripleName = "armv7eb";
else
break;
case KS_MODE_BIG_ENDIAN | KS_MODE_THUMB:
TripleName = "thumbebv7";
break;
// little-endian
case KS_MODE_LITTLE_ENDIAN | KS_MODE_V8 | KS_MODE_ARM:
TripleName = "armv8";
break;
case KS_MODE_LITTLE_ENDIAN | KS_MODE_V8 | KS_MODE_THUMB:
TripleName = "thumbv8";
break;
case KS_MODE_LITTLE_ENDIAN | KS_MODE_ARM:
TripleName = "armv7";
break;
case KS_MODE_LITTLE_ENDIAN | KS_MODE_THUMB:
TripleName = "thumbv7";
break;
}
InitKs(arch, ks, TripleName);
......
......@@ -20,7 +20,7 @@
// These are masks of supported modes for each cpu/arch.
// They should be updated when changes are made to the ks_mode enum typedef.
#define KS_MODE_ARM_MASK (KS_MODE_ARM|KS_MODE_THUMB|KS_MODE_LITTLE_ENDIAN|KS_MODE_BIG_ENDIAN)
#define KS_MODE_ARM_MASK (KS_MODE_ARM|KS_MODE_THUMB|KS_MODE_LITTLE_ENDIAN|KS_MODE_BIG_ENDIAN|KS_MODE_V8)
#define KS_MODE_MIPS_MASK (KS_MODE_MIPS32|KS_MODE_MIPS64|KS_MODE_LITTLE_ENDIAN|KS_MODE_BIG_ENDIAN)
#define KS_MODE_X86_MASK (KS_MODE_16|KS_MODE_32|KS_MODE_64|KS_MODE_LITTLE_ENDIAN)
#define KS_MODE_PPC_MASK (KS_MODE_PPC32|KS_MODE_PPC64|KS_MODE_LITTLE_ENDIAN|KS_MODE_BIG_ENDIAN)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment