summaryrefslogtreecommitdiff
path: root/utils/hwpatcher/zxfi2.lua
diff options
context:
space:
mode:
Diffstat (limited to 'utils/hwpatcher/zxfi2.lua')
-rw-r--r--utils/hwpatcher/zxfi2.lua50
1 files changed, 50 insertions, 0 deletions
diff --git a/utils/hwpatcher/zxfi2.lua b/utils/hwpatcher/zxfi2.lua
new file mode 100644
index 0000000000..fc3bdf800b
--- /dev/null
+++ b/utils/hwpatcher/zxfi2.lua
@@ -0,0 +1,50 @@
1--[[
2Zen X-Fi2 1.23.01e NAND hacking
3required argument (in order):
4- path to firmware
5- path to output firmware
6- path to blob
7- path to stub
8]]--
9
10if #arg < 4 then
11 error("not enough argument to fuzep patcher")
12end
13
14local fw = hwp.load_file(arg[1])
15local irq_addr_pool = hwp.make_addr(0x4035e154, "play")
16local proxy_addr = arm.to_arm(hwp.make_addr(0x402f06f8, "play"))
17-- read old IRQ address pool
18local old_irq_addr = hwp.make_addr(hwp.read32(fw, irq_addr_pool))
19print(string.format("Old IRQ address: %s", old_irq_addr))
20-- put stub at the beginning of the proxy
21local stub = hwp.load_bin_file(arg[4])
22local stub_info = hwp.section_info(stub, "")
23local stub_data = hwp.read(stub, hwp.make_addr(stub_info.addr, ""), stub_info.size)
24hwp.write(fw, proxy_addr, stub_data)
25local stub_addr = proxy_addr
26proxy_addr = hwp.inc_addr(proxy_addr, stub_info.size)
27-- modify irq
28hwp.write32(fw, irq_addr_pool, proxy_addr.addr)
29print(string.format("New IRQ address: %s", proxy_addr))
30-- in proxy, save registers
31arm.write_save_regs(fw, proxy_addr)
32proxy_addr = hwp.inc_addr(proxy_addr, 4)
33-- load blob
34local blob = hwp.load_bin_file(arg[3])
35local blob_info = hwp.section_info(blob, "")
36-- patch blob with stub address
37hwp.write32(blob, hwp.make_addr(blob_info.addr + 4, ""), stub_addr.addr)
38-- write it !
39local blob_data = hwp.read(blob, hwp.make_addr(blob_info.addr, ""), blob_info.size)
40hwp.write(fw, proxy_addr, blob_data)
41proxy_addr = hwp.inc_addr(proxy_addr, blob_info.size)
42-- restore registers
43arm.write_restore_regs(fw, proxy_addr)
44proxy_addr = hwp.inc_addr(proxy_addr, 4)
45-- branch to old code
46local branch_to_old = arm.make_branch(old_irq_addr, false)
47arm.write_branch(fw, proxy_addr, branch_to_old, hwp.inc_addr(proxy_addr, 4))
48-- save
49hwp.save_file(fw, arg[2])
50