summaryrefslogtreecommitdiff
path: root/utils/hwpatcher/fuzep_rb.lua
diff options
context:
space:
mode:
Diffstat (limited to 'utils/hwpatcher/fuzep_rb.lua')
-rw-r--r--utils/hwpatcher/fuzep_rb.lua38
1 files changed, 38 insertions, 0 deletions
diff --git a/utils/hwpatcher/fuzep_rb.lua b/utils/hwpatcher/fuzep_rb.lua
new file mode 100644
index 0000000000..f47a4983fa
--- /dev/null
+++ b/utils/hwpatcher/fuzep_rb.lua
@@ -0,0 +1,38 @@
1--[[
2Fuze+ RB hacking
3required argument (in order):
4- path to firmware
5- path to output firmware
6- path to blob
7]]--
8
9if #arg < 3 then
10 error("not enough argument to fuzep patcher")
11end
12
13local fw = hwp.load_file(arg[1])
14local irq_addr_pool = hwp.make_addr(0x38)
15local proxy_addr = arm.to_arm(hwp.make_addr(0x60115ba4))
16-- read old IRQ address pool
17local old_irq_addr = hwp.make_addr(hwp.read32(fw, irq_addr_pool))
18print(string.format("Old IRQ address: %s", old_irq_addr))
19-- modify it
20hwp.write32(fw, irq_addr_pool, proxy_addr.addr)
21print(string.format("New IRQ address: %s", proxy_addr))
22-- in proxy, save registers
23arm.write_save_regs(fw, proxy_addr)
24proxy_addr = hwp.inc_addr(proxy_addr, 4)
25-- do some work
26local blob = hwp.load_bin_file(arg[3])
27local blob_info = hwp.section_info(blob, "")
28local blob_data = hwp.read(blob, hwp.make_addr(blob_info.addr, ""), blob_info.size)
29hwp.write(fw, proxy_addr, blob_data)
30proxy_addr = hwp.inc_addr(proxy_addr, blob_info.size)
31-- restore registers
32arm.write_restore_regs(fw, proxy_addr)
33proxy_addr = hwp.inc_addr(proxy_addr, 4)
34-- branch to old code
35local branch_to_old = arm.make_branch(old_irq_addr, false)
36arm.write_branch(fw, proxy_addr, branch_to_old)
37-- save
38hwp.save_file(fw, arg[2]) \ No newline at end of file