165 lines
4.4 KiB
Python
165 lines
4.4 KiB
Python
# from utils.utils import *
|
|
# # Circular import fix
|
|
# from typing import TYPE_CHECKING
|
|
# if TYPE_CHECKING:
|
|
# from emulator import GA_Emulator
|
|
|
|
# Add memory maps from https://dn.odroid.com/S905X3/ODROID-C4/Docs/S905X3_Public_Datasheet_Hardkernel.pdf
|
|
|
|
memory_maps = '''
|
|
START END REGION (NORMAL)
|
|
FFFF0000 FFFFFFFF a55_rom
|
|
FFFE8000 FFFEFFFF reserved
|
|
FFFA0000 FFFE7FFF ahb sram
|
|
FFE80000 FFF9FFFF reserved
|
|
FFE40000 FFE7FFFF mali
|
|
FFE0D000 FFE3FFFF reserved
|
|
FFE0B000 FFE0CFFF reserved
|
|
FFE09000 FFE0AFFF usbctrl
|
|
FFE07000 FFE08FFF emmcC
|
|
FFE05000 FFE06FFF emmcB
|
|
FFE03000 FFE04FFF emmcA
|
|
FFE02000 FFE02FFF bt656
|
|
FFE01000 FFE01FFF htx_hdcp22
|
|
FFE00000 FFE00FFF reserved
|
|
FFD27000 FFDFFFFF reserved
|
|
FFD26000 FFD26FFF async_fifo3
|
|
FFD25000 FFD25FFF sc
|
|
FFD24000 FFD24FFF uart0
|
|
FFD23000 FFD23FFF uart1
|
|
FFD22000 FFD22FFF uart2
|
|
FFD21000 FFD21FFF reserved
|
|
FFD20000 FFD20FFF reserved
|
|
FFD1F000 FFD1FFFF i2c_m0
|
|
FFD1E000 FFD1EFFF i2c_m1
|
|
FFD1D000 FFD1DFFF i2c_m2
|
|
FFD1C000 FFD1CFFF i2c_m3
|
|
FFD1B000 FFD1BFFF pwm_ab
|
|
FFD1A000 FFD1AFFF pwm_cd
|
|
FFD19000 FFD19FFF pwm_ef
|
|
FFD18000 FFD18FFF msr_clk
|
|
FFD17000 FFD17FFF reserve
|
|
FFD16000 FFD16FFF reserved
|
|
FFD15000 FFD15FFF spicc_1
|
|
FFD14000 FFD14FFF spifc
|
|
FFD13000 FFD13FFF spicc_0
|
|
FFD12000 FFD12FFF reserved
|
|
FFD11000 FFD11FFF reserved
|
|
FFD10000 FFD10FFF reserved
|
|
FFD0F000 FFD0FFFF isa
|
|
FFD0E000 FFD0EFFF parser
|
|
FFD0D000 FFD0DFFF parser1
|
|
FFD0C000 FFD0CFFF sana
|
|
FFD0B000 FFD0BFFF stream
|
|
FFD0A000 FFD0AFFF async_fifo
|
|
FFD09000 FFD09FFF async_fifo2
|
|
FFD08000 FFD08FFF assist
|
|
FFD07000 FFD07FFF
|
|
FFD06000 FFD06FFF stb
|
|
FFD05000 FFD05FFF aififo
|
|
FFD04000 FFD04FFF reserved
|
|
FFD03000 FFD03FFF reserved
|
|
FFD02000 FFD02FFF reserved
|
|
FFD01000 FFD01FFF reset
|
|
FFD00000 FFD00FFF reserved
|
|
FFC08000 FFCFFFFF reserved
|
|
FFC00000 FFC07FFF gic
|
|
FFB00000 FFBFFFFF gpv
|
|
FF950000 FFAFFFFF reserved
|
|
FF940000 FF94FFFF ge2d
|
|
FF900000 FF93FFFF vpu
|
|
FF80B000 FF8FFFFF reserved
|
|
FF80A000 FF80AFFF ao_mailbox
|
|
FF809000 FF809FFF sar_adc
|
|
FF808000 FF808FFF ir_dec
|
|
FF807000 FF807FFF pwm_ab
|
|
FF806000 FF806FFF i2c_s
|
|
FF805000 FF805FFF i2c_m
|
|
FF804000 FF804FFF uart2
|
|
FF803000 FF803FFF uart
|
|
FF802000 FF802FFF pwm_cd
|
|
FF801000 FF801FFF reserved
|
|
FF800000 FF800FFF rti
|
|
FF664000 FF7FFFFF reserved
|
|
FF663800 FF663FFF
|
|
FF663000 FF6637FF
|
|
FF662000 FF662FFF eqdrc
|
|
FF661C00 FF661FFF resampleA
|
|
FF661800 FF661BFF vad
|
|
FF661400 FF6617FF locker
|
|
FF661000 FF6613FF pdm
|
|
FF660000 FF660FFF audiotop
|
|
FF652000 FF65FFFF reserved
|
|
FF650000 FF651FFF
|
|
FF64E000 FF64FFFF reset_sec
|
|
FF64C000 FF64DFFF eth_phy
|
|
FF64A000 FF64BFFF
|
|
FF648000 FF649FFF pcie_A
|
|
FF646000 FF647FFF pcie_phy
|
|
FF644000 FF645FFF
|
|
FF642000 FF643FFF
|
|
FF640000 FF641FFF pdm
|
|
FF63E000 FF63FFFF dma
|
|
FF63C000 FF63DFFF hiu
|
|
FF63A000 FF63BFFF usbphy21
|
|
FF638000 FF639FFF dmc
|
|
FF636000 FF637FFF usbphy20
|
|
FF635000 FF635FFF reserved
|
|
FF634C00 FF634FFF ts_ddr
|
|
FF634800 FF634BFF ts_pll
|
|
FF634400 FF6347FF periphs_reg
|
|
FF634000 FF6343FF reserved
|
|
FF632000 FF633FFF acodec
|
|
FF630000 FF631FFF efuse
|
|
FF620000 FF62FFFF dos
|
|
FF610000 FF61FFFF wavel
|
|
FF600000 FF60FFFF hdmitx
|
|
FF500000 FF5FFFFF usb0
|
|
FF400000 FF4FFFFF usb1
|
|
FF3F0000 FF3FFFFF eth
|
|
FF140000 FF3EFFFF reserved
|
|
FF100000 FF13FFFF NN
|
|
FF000000 FF0FFFFF reserved
|
|
FE000000 FEFFFFFF ddr_ctrl
|
|
FC000000 FDFFFFFF pcie_axi
|
|
FA000000 FBFFFFFF reserved
|
|
F6000000 F9FFFFFF flash
|
|
F5800000 F5FFFFFF a55_dbg
|
|
0 F57FFFFF ddr
|
|
'''
|
|
|
|
def find_memory(address):
|
|
# ff800228
|
|
for line in memory_maps.split("\n"):
|
|
if line == "" or line == 'START END REGION (NORMAL)':
|
|
continue
|
|
items = line.split(" ")
|
|
if len(items) >= 3:
|
|
start, end, name = items[0], items[1], items[2]
|
|
else:
|
|
start, end = items[0], items[1]
|
|
name = f"{start}_UNKNOWN"
|
|
start = int(start, 16)
|
|
end = int(end, 16)
|
|
if address >= start and address <= end:
|
|
print(f"{hex(start)}|{hex(end)}|{name}")
|
|
break
|
|
|
|
def add_memory_maps(em : "GA_Emulator"):
|
|
for line in memory_maps.split("\n"):
|
|
if line == "" or line == 'START END REGION (NORMAL)':
|
|
continue
|
|
items = line.split(" ")
|
|
if len(items) >= 3:
|
|
start, end, name = items[0], items[1], items[2]
|
|
else:
|
|
start, end = items[0], items[1]
|
|
name = f"{start}_UNKNOWN"
|
|
start = int(start, 16)
|
|
end = int(end, 16)
|
|
# info(f"Mapping {name} at {hex(start)} with length: {hex(end - start)}")
|
|
# Create empty dataset only if length is smaller than 64Kb
|
|
if end - start > 0x10000:
|
|
continue
|
|
data = (end - start) * b"\x00"
|
|
em.ghidra.add_memory(data, start, False, name, False) |