From 7c2f3dfea23983fa7d1719dd0bab80e92c968502 Mon Sep 17 00:00:00 2001 From: Olof Astrand Date: Fri, 31 Jul 2020 03:16:54 +0200 Subject: [PATCH] Add fake iX and oX registers to get a better decompilation for esp32 binaries --- build.gradle | 10 ++ data/languages/xtensa.cspec | 29 +++-- data/languages/xtensa.sinc | 2 + data/languages/xtensaInstructions.sinc | 15 +++ data/languages/xtensaTodo.sinc | 141 +++++++++---------------- 5 files changed, 94 insertions(+), 103 deletions(-) create mode 100644 build.gradle diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..c190f1f --- /dev/null +++ b/build.gradle @@ -0,0 +1,10 @@ +apply from: "$rootProject.projectDir/gradle/distributableGhidraModule.gradle" +apply from: "$rootProject.projectDir/gradle/javaProject.gradle" +apply from: "$rootProject.projectDir/gradle/javaTestProject.gradle" +apply from: "$rootProject.projectDir/gradle/processorProject.gradle" +apply plugin: 'eclipse' +eclipse.project.name = 'Processors Xtensa' + +dependencies { + compile project(':Base') +} diff --git a/data/languages/xtensa.cspec b/data/languages/xtensa.cspec index f7049a2..7c1b787 100644 --- a/data/languages/xtensa.cspec +++ b/data/languages/xtensa.cspec @@ -30,22 +30,22 @@ - + - + - + - + - + - + @@ -53,16 +53,16 @@ - + - + - + - + @@ -70,6 +70,15 @@ + + + + + + + + + diff --git a/data/languages/xtensa.sinc b/data/languages/xtensa.sinc index 5260c3a..55d32ab 100644 --- a/data/languages/xtensa.sinc +++ b/data/languages/xtensa.sinc @@ -15,6 +15,8 @@ define save_register offset=0x0000 size=4 [ # Address registers (AR). define register offset=0x0000 size=4 [ a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 + i2 i3 i4 i5 i6 i7 + o2 o3 o4 o5 o6 o7 ]; # Floating Point registers (FR + FCR (control) + FSR (status)). diff --git a/data/languages/xtensaInstructions.sinc b/data/languages/xtensaInstructions.sinc index 479ccfd..d6f9c4e 100644 --- a/data/languages/xtensaInstructions.sinc +++ b/data/languages/xtensaInstructions.sinc @@ -303,15 +303,29 @@ macro extract_bit(val, bit, result) { # CALL0 - Non-windowed Call, pg. 297. :call0 srel_6.23_sb2 is srel_6.23_sb2 & u2_4.5 = 0 & op0 = 0b0101 { + i2 = a2; + i3 = a3; + i4 = a4; + i5 = a5; + i6 = a6; + i7 = a7; a0 = inst_start + 3; call srel_6.23_sb2; + a2=o2; } # CALLX0 - Non-windowed Call Register, pg. 304. :callx0 as is op2 = 0 & op1 = 0 & ar = 0 & as & u2_6.7 = 0b11 & u2_4.5 = 0 & op0 = 0 { local dst = as; + i2 = a2; + i3 = a3; + i4 = a4; + i5 = a5; + i6 = a6; + i7 = a7; a0 = inst_start + 3; call [dst]; + a2=o2; } # CEIL.S - Ceiling Single to Fixed, pg. 311. @@ -931,6 +945,7 @@ macro extract_bit(val, bit, result) { # RET.N - Narrow Non-Windowed Return, pg. 479. :ret.n is n_ar = 0b1111 & n_as = 0 & n_at = 0 & n_op0 = 0b1101 { return [a0]; + o2=a2; } # RFDD - Return from Debug and Dispatch, pg. 484. diff --git a/data/languages/xtensaTodo.sinc b/data/languages/xtensaTodo.sinc index c40177c..aa820b9 100644 --- a/data/languages/xtensaTodo.sinc +++ b/data/languages/xtensaTodo.sinc @@ -33,130 +33,92 @@ macro restore() { # CALL4 - Call PC-relative, Rotate Window by 4, pg. 298. :call4 srel_6.23_sb2 is srel_6.23_sb2 & u2_4.5 = 0b01 & op0 = 0b0101 { local dst = srel_6.23_sb2; - a2=a6; - a3=a7; - a4=a8; - a5=a9; + i2=a6; + i3=a7; + i4=a8; + i5=a9; a0 = inst_start + 3; call [dst]; + a6=o2; } # CALL8 - Call PC-relative, Rotate Window by 8, pg. 300. :call8 srel_6.23_sb2 is srel_6.23_sb2 & u2_4.5 = 0b10 & op0 = 0b0101 { local dst = srel_6.23_sb2; - save(); - #s2=a2; - #s3=a3; - #s4=a4; - #s5=a5; - #s6=a6; - #s7=a7; - a2=a10; - a3=a11; - a4=a12; - a5=a13; - a6=a14; - a7=a15; + i2=a10; + i3=a11; + i4=a12; + i5=a13; + i6=a14; + i7=a15; a0 = inst_start + 3; call [dst]; - restore(); + a10=o2; } # CALL12 - Call PC-relative, Rotate Window by 12, pg. 302. :call12 srel_6.23_sb2 is srel_6.23_sb2 & u2_4.5 = 0b11 & op0 = 0b0101 { local dst = srel_6.23_sb2; - a2=a14; - a3=a15; + i2=a14; + i3=a15; a0 = inst_start + 3; call [dst]; + a14=o2; } # ENTRY - Subroutine Entry, pg. 340. :entry as, u15_12.23_sb3 is u15_12.23_sb3 & as & u2_6.7 = 0b00 & u2_4.5 = 0b11 & op0 = 0b0110 { local amn = sext(u15_12.23_sb3); + a2=i2; + a3=i3; + a4=i4; + a5=i5; + a6=i6; + a7=i7; #as = as + amn; WindowBase = amn; a1 = a1 - amn; } -# if (u15_12.23_sb3 ==4) -# goto ; -# if (u15_12.23_sb3 ==8) -# goto ; -# if (u15_12.23_sb3 ==12) -# goto ; -# -# a2=a6; -# a3=a7; -# a4=a8; -# a5=a9; -# a6=a10; -# a7=a11; -# a8=a12; -# a9=a13; -# a10=a14; -# a11=a15; -# goto ; -# -# a2=a10; -# a3=a11; -# a4=a12; -# a5=a13; -# a6=a14; -# a7=a15; -# goto ; -# -# a2=a14; -# a3=a15; -# - - # CALLX4 - Call Register, Rotate Window by 4, pg. 305. :callx4 as is op2 = 0 & op1 = 0 & ar = 0 & as & u2_6.7 = 0b11 & u2_4.5 = 0b01 & op0 = 0 { local dst = as; - a2=a6; - a3=a7; - a4=a8; - a5=a9; - a6=a10; - a7=a11; - a8=a12; - a9=a13; - a10=a14; - a11=a15; + i2=a6; + i3=a7; + i4=a8; + i5=a9; + i6=a10; + i7=a11; a0 = inst_start + 3; call [dst]; + a6=o2; } # CALLX8 - Call Register, Rotate Window by 8, pg. 307. :callx8 as is op2 = 0 & op1 = 0 & ar = 0 & as & u2_6.7 = 0b11 & u2_4.5 = 0b10 & op0 = 0 { local dst = as; - #s2=a2; - #s3=a3; - #s4=a4; - #s5=a5; - #s6=a6; - #s7=a7; - a2=a10; - a3=a11; - a4=a12; - a5=a13; - a6=a14; - a7=a15; + i2=a10; + i3=a11; + i4=a12; + i5=a13; + i6=a14; + i7=a15; a0 = inst_start + 3; call [dst]; + a10=o2; } # CALLX12 - Call Register, Rotate Window by 12, pg. 308. :callx12 as is op2 = 0 & op1 = 0 & ar = 0 & as & u2_6.7 = 0b11 & u2_4.5 = 0b11 & op0 = 0 { local dst = as; - a2=a14; - a3=a15; + i2=a14; + i3=a15; a0 = inst_start + 3; call [dst]; + a14=o2; } @@ -170,30 +132,23 @@ macro restore() { # RETW - Windowed Return, pg. 480. :retw is op2 = 0 & op1 = 0 & ar = 0 & as = 0 & u2_6.7 = 0b10 & u2_4.5 = 0b01 & op0 = 0 { # Assume call8 - a10=a2; - a11=a3; - a12=a4; - a13=a5; - a14=a6; - a15=a7; - #a2=s2; - #a3=s3; - #a4=s4; - #a5=s5; - #a6=s6; - #a7=s7; + o2=a2; + o3=a3; + o4=a4; + a10=a2; a1 = a1 + WindowBase; return [a0]; } # RETW.N - Narrow Windowed Return, pg. 482. :retw.n is n_ar = 0b1111 & n_as = 0 & n_at = 0b0001 & n_op0 = 0b1101 { + o2=a2; + o3=a3; + o4=a4; + o5=a5; + o6=a6; + o7=a7; a10=a2; - a11=a3; - a12=a4; - a13=a5; - a14=a6; - a15=a7; a1 = a1 + WindowBase; return [a0]; }