summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorWladimir J. van der Laan <laanwj@gmail.com>2013-09-25 09:59:31 +0200
committerWladimir J. van der Laan <laanwj@gmail.com>2013-09-25 10:01:16 +0200
commit27f5349326d4e432a71edd5d00372dd11d32a06d (patch)
treebc898138ab4647f24c963fdf838ad042927e19dc /tools
parenta2c4be45d43425fdfb34ae91e6695f61cf1df549 (diff)
tools: add deobfuscator for v4-uapi
Diffstat (limited to 'tools')
-rw-r--r--tools/deobfuscate-simple2-vivante.pl31
1 files changed, 31 insertions, 0 deletions
diff --git a/tools/deobfuscate-simple2-vivante.pl b/tools/deobfuscate-simple2-vivante.pl
new file mode 100644
index 0000000..03973ab
--- /dev/null
+++ b/tools/deobfuscate-simple2-vivante.pl
@@ -0,0 +1,31 @@
+# deobfuscation for alternative gcmXXX macros
+# - Make u32 type configurable (for uapi)
+# - Modify macros to take a bit field instead of register name and field
+# - Add gcmGETFIELD
+$bitfield = '\d+:\d+|[A-Z_a-z]+';
+$id = '[^()]+|[^()]*(?:(\((?:[^()]++|(?-1))*+\))[^()]*)*';
+$hex = '0x[0-9a-fA-F]+';
+# 32-bit type
+$u32 = 'u32';
+#$u32 = 'gctUINT32';
+
+$sub = "";
+$name = "";
+undef $prev;
+
+while (<>) {
+ s/\(0 ?\? ?($bitfield)\)/__gcmSTART(\1)/g;
+ s/\(1 ?\? ?($bitfield)\)/__gcmEND(\1)/g;
+ s/\(__gcmEND\(($bitfield)\) ?- ?__gcmSTART\(\1\) ?\+ ?1\)/__gcmGETSIZE(\1)/g;
+ s/\(\($u32\) ?\(\(__gcmGETSIZE\(($bitfield)\) ?== ?32\) ?\? ?~0 ?: ?\(~\(~0 ?\<\< ?__gcmGETSIZE\((?-1)\)\)\)\)\)/__gcmMASK(\1)/g;
+ s/\(\(\($u32\) ?\(($id)\)\) ?\<\< ?__gcmSTART\((?<field>$bitfield)\)\)/__gcmALIGN(\1, $+{field})/g;
+ s/\( ?__gcmALIGN\(__gcmMASK\((?<field>$bitfield)\), ?(?-1)\) ?\)/gcmFIELDMASK($+{field})/g;
+ s/\( ?\(\(\($u32\) ?\((?<data>$id)\)\) ?& ?~__gcmALIGN\(__gcmMASK\((?<field>$bitfield)\), ?\g{field}\)\) ?\| ?__gcmALIGN\(\($u32\) ?\((?<value>$id)\) ?& ?__gcmMASK\(\g{field}\), ?\g{field}\) ?\)/gcmSETFIELD($+{data}, $+{field}, $+{value})/g;
+ # SETFIELD without u32 cast?!
+ s/\( ?\(\(\($u32\) ?\((?<data>$id)\)\) ?& ?~__gcmALIGN\(__gcmMASK\((?<field>$bitfield)\), ?\g{field}\)\) ?\| ?__gcmALIGN\((?<value>$id) ?& ?__gcmMASK\(\g{field}\), ?\g{field}\) ?\)/gcmSETFIELD($+{data}, $+{field}, $+{value})/g;
+ s/\( ?\(\(\($u32\) ?\((?<data>$id)\)\) ?\>\> ?__gcmSTART\((?<field>$bitfield)\) ?& ?__gcmMASK\(\g{field}\)\) ?== ?\((?<value>$id) ?& ?__gcmMASK\(\g{field}\) ?\) ?\)/gcmVERIFYFIELDVALUE($+{data}, $+{field}, $+{value})/g;
+
+ s/\( ?\(\(\(\(u32\) ?\((?<data>$id)\)\) ?>> ?__gcmSTART\((?<field>$bitfield)\)\) ?& ?__gcmMASK\(\g{field}\)\) ?\)/gcmGETFIELD($+{data}, $+{field})/g;
+
+ print;
+}