Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python3
- # SPDX-License-Identifier: MIT
- import sys, pathlib
- sys.path.append(str(pathlib.Path(__file__).resolve().parents[1]))
- import time
- import atexit
- import struct
- from m1n1.hw.ave import *
- from m1n1.hw.dart import DART
- from m1n1.utils import *
- PAGE_SIZE = 0x4000
- AVE_BASE = 0x266000000
- def ave_r32(off): return p.read32(AVE_BASE + off)
- def ave_w32(off, x): return p.write32(AVE_BASE + off, x)
- def ave_m32(off, cl, st): return p.mask32(AVE_BASE + off, cl, st)
- def printf(fmt, *args): print(fmt % (*args,), end='')
- def round_up(x, y): return ((x + (y - 1)) & (-y))
- def round_down(x, y): return (x - (x % y))
- class AVE:
- def __init__(self, u):
- self.u = u
- self.p = u.proxy
- self.iface = u.iface
- self.PAGE_SIZE = 0x4000
- self.page_size = self.PAGE_SIZE
- self.dart = None
- self.AVE_BASE = 0x266000000
- self.regs = AVERegs(backend=u, base=self.AVE_BASE)
- self.asc_regs = AVEASCRegs(backend=u, base=self.AVE_BASE)
- self.ipc_iova = 0x0
- def ave_r32(self, off): return self.p.read32(self.AVE_BASE + off)
- def ave_w32(self, off, x): return self.p.write32(self.AVE_BASE + off, x)
- def ave_m32(self, off, cl, st): return self.p.mask32(self.AVE_BASE + off, cl, st)
- def ave_power_off(self):
- p = self.p
- p.write32(0x23b708020, 0x0)
- p.write32(0x23b708018, 0x0)
- p.write32(0x23b708010, 0x0)
- p.write32(0x23b708008, 0x0)
- p.write32(0x23b708000, 0x0)
- def ave_power_on(self):
- p = self.p
- p.pmgr_adt_clocks_enable('/arm-io/ave')
- p.pmgr_adt_clocks_enable('/arm-io/dart-ave')
- self.ave_write_fabric()
- p.write32(0x23b708000, 0xf)
- p.write32(0x23b708008, 0xf)
- p.write32(0x23b708010, 0xf)
- p.write32(0x23b708018, 0xf)
- p.write32(0x23b708020, 0xf)
- atexit.register(self.ave_power_off)
- def ave_write_fabric(self):
- p = self.p
- p.mask32(0x266000000, 0x10, 0x10)
- p.mask32(0x266000038, 0xffff, 0x50010)
- p.mask32(0x26600003c, 0xffff, 0xa0030)
- p.mask32(0x266000400, 0x4, 0x40010001)
- p.mask32(0x266000600, 0x0, 0x1ffffff)
- p.mask32(0x266000738, 0x1ff01ff, 0x100008)
- p.mask32(0x266000798, 0x1ff01ff, 0x80030)
- p.mask32(0x2660007f8, 0x1ff01ff, 0x60000a)
- p.mask32(0x266000900, 0x1, 0x101)
- p.mask32(0x266000410, 0x100, 0x1100)
- p.mask32(0x266000420, 0x100, 0x1100)
- p.mask32(0x266000430, 0x100, 0x1100)
- def ave_init_iommu(self):
- u = self.u
- p = self.p
- p.write32(0x2670400fc, 0x0)
- p.write32(0x2670300fc, 0x0)
- p.write32(0x267020020, 0x80000000)
- dart = DART.from_adt(u, f'/arm-io/dart-ave', instance=0)
- dart.initialize()
- self.dart = dart
- p.write32(0x267040080, 0x3020000)
- p.write32(0x267040084, 0x7060504)
- p.write32(0x267040088, 0xb0a0908)
- p.write32(0x26704008c, 0xf0e0d0c)
- p.write32(0x2670400fc, 0x0)
- p.write32(0x2670402f0, 0x0)
- p.write32(0x267040034, 0xffffffff)
- p.write32(0x267040020, 0x100000)
- p.mask32(0x267040060, p.read32(0x267040060), 0x80016100)
- p.mask32(0x267040068, p.read32(0x267040068), 0xf0f0f)
- p.mask32(0x26704006c, p.read32(0x26704006c), 0x80808)
- p.write32(0x267044004, 0x1)
- text_phys_new, data_phys_new = self.patch_firmware()
- #p.write32(0x267044008, 0x8f4000)
- #p.write32(0x26704400c, 0x8)
- #p.write32(0x267044010, 0x9bffff)
- #p.write32(0x267044014, 0x8)
- p.write32(0x267044000, 0x11)
- p.write32(0x267044044, 0x1)
- p.write32(0x267044048, 0x0)
- p.write32(0x26704404c, 0xf)
- p.write32(0x267044050, 0xffffffff)
- p.write32(0x267044054, 0xf)
- p.write32(0x267044040, 0x33)
- p.write32(0x267040100, 0x80)
- p.write32(0x26704013c, 0x100)
- p.write32(0x267030080, 0x3020000)
- p.write32(0x267030084, 0x7060504)
- p.write32(0x267030088, 0xb0a0908)
- p.write32(0x26703008c, 0xf0e0d0c)
- p.write32(0x2670300fc, 0x0)
- p.write32(0x2670302f0, 0x0)
- p.write32(0x267030034, 0xffffffff)
- p.write32(0x267030020, 0x100000)
- p.mask32(0x267030060, p.read32(0x267030060), 0x80016100)
- p.mask32(0x267030068, p.read32(0x267030068), 0xf0f0f)
- p.mask32(0x26703006c, p.read32(0x26703006c), 0x80808)
- p.write32(0x267030100, 0x80)
- p.write32(0x26703013c, 0x20000)
- p.write32(0x267050038, 0x1)
- p.write32(0x2671dc400, 0x0)
- p.write32(0x2671dc400, 0x3)
- p.write32(0x2671dc000, 0x101)
- (text_phys, text_iova, _, text_size, data_phys, data_iova, _, data_size) = struct.unpack('<QQQI4xQQQI4x', getattr(u.adt['/arm-io/ave'], 'segment-ranges'))
- self.dart.iomap_at(0, text_iova, text_phys_new, text_size)
- self.dart.iomap_at(0, data_iova, data_phys_new, data_size)
- p.write32(0x267040200, self.dart.dart.regs.TTBR[0, 0].val)
- p.write32(0x267030200, self.dart.dart.regs.TTBR[0, 0].val)
- def boot(self):
- self.ave_power_on()
- self.ave_init_iommu()
- def asc_boot(self):
- self.asc_regs.AVE_ASC_UNK_808.val = 0x1
- self.asc_regs.AVE_ASC_CONTROL.val = 0x0
- self.asc_regs.AVE_ASC_UNK_400.val = 0x10000
- self.asc_regs.AVE_ASC_CONTROL.val = 0x10
- def ioread(self, iova, size):
- return self.dart.ioread(0, iova & 0xFFFFFFFFFF, size)
- def iowrite(self, iova, data):
- return self.dart.iowrite(0, iova & 0xFFFFFFFFFF, data)
- def iomap(self, phys, size):
- return self.dart.iomap(phys, size)
- def iomap_at(self, iova, phys, size):
- return self.dart.iomap_at(0, iova & 0xFFFFFFFFFF, phys, size)
- def ioalloc_at(self, iova, size):
- phys = self.u.memalign(self.PAGE_SIZE, size)
- self.p.memset32(phys, 0, size)
- return self.dart.iomap_at(0, iova & 0xFFFFFFFFFF, phys, size)
- ave = AVE(u)
- ave.boot()
- mon = RegMonitor(u)
- mon.add(0x267050000, 0x4000)
- mon.poll()
- iomon = RegMonitor(u, ascii=True)
- def readmem_iova(addr, size, readfn=None):
- try:
- return ave.dart.ioread(0, addr, size)
- except Exception as e:
- print(e)
- return None
- iomon.readmem = readmem_iova
- def ave_boot_stage1(ave):
- heap_size = 0x700000
- heap_iova = 0x1f8000
- heap_phys = u.heap.memalign(PAGE_SIZE, heap_size)
- ave.dart.iomap_at(0, heap_iova, heap_phys, heap_size)
- mon.poll()
- iomon.add(heap_iova, heap_size)
- iomon.poll()
- ave.ipc_iova = heap_iova
- p.write32(0x267050018, 0x8042006)
- p.write32(0x26705001c, 0x0)
- p.write32(0x267050020, 0xd)
- ave.asc_boot()
- printf("asc status: 0x%x\n", p.read32(0x267c00048))
- p.write32(0x267050010, 0x1)
- time.sleep(0.1)
- mon.poll()
- mon.poll()
- mon.poll()
- mon.poll()
- mon.poll()
- num_chans = p.read32(0x267050018) # 7
- buf_size = p.read32(0x26705001c) # 0x9bc0
- desc_size = p.read32(0x267050020) # 0x100
- ipc_size = p.read32(0x267050024) # 0xc0000
- printf('num_chans: %d buf_size: 0x%x desc_size: 0x%x ipc_size: 0x%x\n', num_chans, buf_size, desc_size, ipc_size)
- ipc_iova = heap_iova + heap_size
- ipc_phys = u.heap.memalign(PAGE_SIZE, ipc_size)
- p.memset32(ipc_phys, 0, ipc_size)
- ave.dart.iomap_at(0, ipc_iova, ipc_phys, ipc_size)
- p.write32(0x267050018, heap_iova)
- p.write32(0x26705001c, 0x0)
- p.write32(0x267050020, heap_size)
- p.write32(0x267050024, 0x0)
- p.write32(0x26705000c, 0x1)
- time.sleep(0.1)
- mon.poll()
- mon.poll()
- mon.poll()
- mon.poll()
- mon.poll()
- iomon.poll()
- def ave_boot_stage2(ave):
- unk_addr = p.read32(0x267050018) # 0x80000000
- unk_mask = p.read32(0x26705001c) # 0xffffffff
- printf('unk_addr: 0x%x unk_mask: 0x%x\n', unk_addr, unk_mask)
- """
- 00000000 00000000 00000000 80000000 ffffffff 00000000 00000000 00000000 008fc000
- 00000020 00000000 000c0000 0000000a 00000000 00000000 00000000 00000000 00000000
- 00000040 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
- 00000060 *
- """
- AVEBootArgs = Struct(
- "unk_0" / Default(Int32ul, 0),
- "unk_4" / Default(Int32ul, 0),
- "unk_8" / Default(Int32ul, 0),
- "unk_c" / Default(Int32ul, 0),
- "unk_10" / Default(Int32ul, 0),
- "unk_14" / Default(Int32ul, 0),
- "unk_18" / Default(Int32ul, 0),
- "unk_1c" / Default(Int32ul, 0),
- "unk_20" / Default(Int32ul, 0),
- "unk_24" / Default(Int32ul, 0),
- "unk_28" / Default(Int32ul, 0),
- "unk_2c" / Default(Int32ul, 0),
- "unk_30" / Default(Int32ul, 0),
- "unk_34" / Default(Int32ul, 0),
- "unk_38" / Default(Int32ul, 0),
- "unk_3c" / Default(Int32ul, 0),
- )
- args = AVEBootArgs.build(dict(
- unk_8=0x80000000,
- unk_c=0xffffffff,
- unk_1c=0x8fc000,
- unk_24=0xc0000,
- unk_28=0xa,
- ))
- ave.iowrite(ave.ipc_iova + 0xe000, args)
- # FwHeap
- chan_iova = 0x8fc000
- chan_size = 0xc0000
- ave.ioalloc_at(chan_iova, chan_size)
- p.write32(0x267050018, 0x8000e000)
- p.write32(0x26705001c, 0xffffffff)
- p.write32(0x267050020, 0x0)
- p.write32(0x267050024, 0x0)
- p.write32(0x26705000c, 0x1)
- p.write32(0x267050010, 0x1)
- time.sleep(0.1)
- mon.poll()
- mon.poll()
- mon.poll()
- mon.poll()
- mon.poll()
- def ave_boot_stage3(ave):
- unk_addr = p.read32(0x267050018) # 0x80000000
- unk_mask = p.read32(0x26705001c) # 0xffffffff
- unk_thing = p.read32(0x267050020) # 0xb0000
- printf('unk_thing: 0x%x unk_addr: 0x%x unk_mask: 0x%x\n', unk_thing, unk_addr, unk_mask)
- AVEIPCChanTableDescEntry = Struct(
- "name" / PaddedString(0x40, "utf8"),
- "type" / Int32ul,
- "src" / Int32ul,
- "num" / Int32ul,
- "iova" / Hex(Int32ul),
- "mask" / Hex(Int32ul),
- "pad" / Default(Int32ul, 0),
- "pad" / Default(Int32ul, 0),
- "pad" / Default(Int32ul, 0),
- "pad" / Padding(0xa0),
- )
- assert((AVEIPCChanTableDescEntry.sizeof() == 0x100))
- for n in range(7):
- data = ave.ioread(ave.ipc_iova + (n * 0x100), 0x100)
- x = AVEIPCChanTableDescEntry.parse(data)
- print(x)
- ave_boot_stage1(ave)
- ave_boot_stage2(ave)
- ave_boot_stage3(ave)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement