2022-06-12 16:51:51 -05:00
|
|
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
|
2009-09-21 13:48:22 -05:00
|
|
|
# MEMORY
|
2008-07-06 14:17:43 -05:00
|
|
|
#
|
|
|
|
# All Memory regions have two components.
|
|
|
|
# (1) A count of regions, in the form N_NAME
|
|
|
|
# (2) An array within info about each region.
|
|
|
|
#
|
|
|
|
# The ARRAY
|
|
|
|
#
|
|
|
|
# <NAME>( RegionNumber , ATTRIBUTE )
|
|
|
|
#
|
|
|
|
# Where <NAME> is one of:
|
|
|
|
#
|
|
|
|
# N_FLASH & FLASH (internal memory)
|
|
|
|
# N_RAM & RAM (internal memory)
|
|
|
|
# N_MMREGS & MMREGS (for memory mapped registers)
|
|
|
|
# N_XMEM & XMEM (off chip memory, ie: flash on cs0, sdram on cs2)
|
|
|
|
# or N_UNKNOWN & UNKNOWN for things that do not exist.
|
|
|
|
#
|
|
|
|
# We have 1 unknown region.
|
|
|
|
set N_UNKNOWN 1
|
|
|
|
# All MEMORY regions must have these attributes
|
|
|
|
# CS - chip select (if internal, use -1)
|
|
|
|
set UNKNOWN(0,CHIPSELECT) -1
|
|
|
|
# BASE - base address in memory
|
|
|
|
set UNKNOWN(0,BASE) 0
|
|
|
|
# LEN - length in bytes
|
|
|
|
set UNKNOWN(0,LEN) $CPU_MAX_ADDRESS
|
|
|
|
# HUMAN - human name of the region
|
|
|
|
set UNKNOWN(0,HUMAN) "unknown"
|
|
|
|
# TYPE - one of:
|
|
|
|
# flash, ram, mmr, unknown
|
|
|
|
# For harvard arch:
|
|
|
|
# iflash, dflash, iram, dram
|
|
|
|
set UNKNOWN(0,TYPE) "unknown"
|
|
|
|
# RWX - access ablity
|
|
|
|
# unix style chmod bits
|
|
|
|
# 0 - no access
|
|
|
|
# 1 - execute
|
|
|
|
# 2 - write
|
|
|
|
# 4 - read
|
|
|
|
# hence: 7 - readwrite execute
|
|
|
|
set RWX_NO_ACCESS 0
|
|
|
|
set RWX_X_ONLY $BIT0
|
|
|
|
set RWX_W_ONLY $BIT1
|
|
|
|
set RWX_R_ONLY $BIT2
|
2021-04-09 18:23:57 -05:00
|
|
|
set RWX_RW [expr {$RWX_R_ONLY + $RWX_W_ONLY}]
|
|
|
|
set RWX_R_X [expr {$RWX_R_ONLY + $RWX_X_ONLY}]
|
|
|
|
set RWX_RWX [expr {$RWX_R_ONLY + $RWX_W_ONLY + $RWX_X_ONLY}]
|
2008-07-06 14:17:43 -05:00
|
|
|
set UNKNOWN(0,RWX) $RWX_NO_ACCESS
|
|
|
|
|
|
|
|
# WIDTH - access width
|
|
|
|
# 8,16,32 [0 means ANY]
|
|
|
|
set ACCESS_WIDTH_NONE 0
|
|
|
|
set ACCESS_WIDTH_8 $BIT0
|
|
|
|
set ACCESS_WIDTH_16 $BIT1
|
|
|
|
set ACCESS_WIDTH_32 $BIT2
|
2021-04-09 18:23:57 -05:00
|
|
|
set ACCESS_WIDTH_ANY [expr {$ACCESS_WIDTH_8 + $ACCESS_WIDTH_16 + $ACCESS_WIDTH_32}]
|
2008-07-06 14:17:43 -05:00
|
|
|
set UNKNOWN(0,ACCESS_WIDTH) $ACCESS_WIDTH_NONE
|
|
|
|
|
|
|
|
proc iswithin { ADDRESS BASE LEN } {
|
2021-04-10 11:28:52 -05:00
|
|
|
return [expr {(($ADDRESS - $BASE) >= 0) && (($BASE + $LEN - $ADDRESS) > 0)}]
|
2008-07-06 14:17:43 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
proc address_info { ADDRESS } {
|
2009-09-21 13:48:22 -05:00
|
|
|
|
2008-07-06 14:17:43 -05:00
|
|
|
foreach WHERE { FLASH RAM MMREGS XMEM UNKNOWN } {
|
2024-05-15 21:39:12 -05:00
|
|
|
if { [info exists $WHERE] } {
|
2008-07-06 14:17:43 -05:00
|
|
|
set lmt [set N_[set WHERE]]
|
|
|
|
for { set region 0 } { $region < $lmt } { incr region } {
|
2024-05-15 21:39:12 -05:00
|
|
|
if { [iswithin $ADDRESS $WHERE($region,BASE) $WHERE($region,LEN)] } {
|
2008-07-06 14:17:43 -05:00
|
|
|
return "$WHERE $region";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
# Return the 'unknown'
|
|
|
|
return "UNKNOWN 0"
|
|
|
|
}
|
|
|
|
|
2008-07-10 13:47:50 -05:00
|
|
|
proc memread32 {ADDR} {
|
2022-02-25 08:44:58 -06:00
|
|
|
if ![ catch { set foo [read_memory $ADDR 32 1] } msg ] {
|
|
|
|
return $foo
|
2008-07-06 14:17:43 -05:00
|
|
|
} else {
|
2008-07-10 13:47:50 -05:00
|
|
|
error "memread32: $msg"
|
2008-07-06 14:17:43 -05:00
|
|
|
}
|
2009-09-21 13:48:22 -05:00
|
|
|
}
|
2008-07-06 14:17:43 -05:00
|
|
|
|
2008-07-10 13:47:50 -05:00
|
|
|
proc memread16 {ADDR} {
|
2022-02-25 08:44:58 -06:00
|
|
|
if ![ catch { set foo [read_memory $ADDR 16 1] } msg ] {
|
|
|
|
return $foo
|
2008-07-06 14:17:43 -05:00
|
|
|
} else {
|
2008-07-10 13:47:50 -05:00
|
|
|
error "memread16: $msg"
|
2008-07-06 14:17:43 -05:00
|
|
|
}
|
2009-09-21 13:48:22 -05:00
|
|
|
}
|
2008-07-06 14:17:43 -05:00
|
|
|
|
2008-07-10 13:47:50 -05:00
|
|
|
proc memread8 {ADDR} {
|
2022-02-25 08:44:58 -06:00
|
|
|
if ![ catch { set foo [read_memory $ADDR 8 1] } msg ] {
|
|
|
|
return $foo
|
2008-07-06 14:17:43 -05:00
|
|
|
} else {
|
2008-07-10 13:47:50 -05:00
|
|
|
error "memread8: $msg"
|
2008-07-06 14:17:43 -05:00
|
|
|
}
|
2009-09-21 13:48:22 -05:00
|
|
|
}
|
2008-07-06 14:17:43 -05:00
|
|
|
|
2008-07-10 13:47:50 -05:00
|
|
|
proc memwrite32 {ADDR DATA} {
|
2022-02-25 08:44:58 -06:00
|
|
|
if ![ catch { write_memory $ADDR 32 $DATA } msg ] {
|
|
|
|
return $DATA
|
2008-07-10 13:47:50 -05:00
|
|
|
} else {
|
|
|
|
error "memwrite32: $msg"
|
|
|
|
}
|
2009-09-21 13:48:22 -05:00
|
|
|
}
|
2008-07-06 14:17:43 -05:00
|
|
|
|
2008-07-10 13:47:50 -05:00
|
|
|
proc memwrite16 {ADDR DATA} {
|
2022-02-25 08:44:58 -06:00
|
|
|
if ![ catch { write_memory $ADDR 16 $DATA } msg ] {
|
|
|
|
return $DATA
|
2008-07-10 13:47:50 -05:00
|
|
|
} else {
|
|
|
|
error "memwrite16: $msg"
|
|
|
|
}
|
2009-09-21 13:48:22 -05:00
|
|
|
}
|
2008-07-10 13:47:50 -05:00
|
|
|
|
|
|
|
proc memwrite8 {ADDR DATA} {
|
2022-02-25 08:44:58 -06:00
|
|
|
if ![ catch { write_memory $ADDR 8 $DATA } msg ] {
|
|
|
|
return $DATA
|
2008-07-10 13:47:50 -05:00
|
|
|
} else {
|
|
|
|
error "memwrite8: $msg"
|
|
|
|
}
|
2009-09-21 13:48:22 -05:00
|
|
|
}
|
2016-03-02 06:52:52 -06:00
|
|
|
|
|
|
|
proc memread32_phys {ADDR} {
|
2022-02-25 08:44:58 -06:00
|
|
|
if ![ catch { set foo [read_memory $ADDR 32 1 phys] } msg ] {
|
|
|
|
return $foo
|
2016-03-02 06:52:52 -06:00
|
|
|
} else {
|
|
|
|
error "memread32: $msg"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
proc memread16_phys {ADDR} {
|
2022-02-25 08:44:58 -06:00
|
|
|
if ![ catch { set foo [read_memory $ADDR 16 1 phys] } msg ] {
|
|
|
|
return $foo
|
2016-03-02 06:52:52 -06:00
|
|
|
} else {
|
|
|
|
error "memread16: $msg"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
proc memread8_phys {ADDR} {
|
2022-02-25 08:44:58 -06:00
|
|
|
if ![ catch { set foo [read_memory $ADDR 8 1 phys] } msg ] {
|
|
|
|
return $foo
|
2016-03-02 06:52:52 -06:00
|
|
|
} else {
|
|
|
|
error "memread8: $msg"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
proc memwrite32_phys {ADDR DATA} {
|
2022-02-25 08:44:58 -06:00
|
|
|
if ![ catch { write_memory $ADDR 32 $DATA phys } msg ] {
|
|
|
|
return $DATA
|
2016-03-02 06:52:52 -06:00
|
|
|
} else {
|
|
|
|
error "memwrite32: $msg"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
proc memwrite16_phys {ADDR DATA} {
|
2022-02-25 08:44:58 -06:00
|
|
|
if ![ catch { write_memory $ADDR 16 $DATA phys } msg ] {
|
|
|
|
return $DATA
|
2016-03-02 06:52:52 -06:00
|
|
|
} else {
|
|
|
|
error "memwrite16: $msg"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
proc memwrite8_phys {ADDR DATA} {
|
2022-02-25 08:44:58 -06:00
|
|
|
if ![ catch { write_memory $ADDR 8 $DATA phys } msg ] {
|
|
|
|
return $DATA
|
2016-03-02 06:52:52 -06:00
|
|
|
} else {
|
|
|
|
error "memwrite8: $msg"
|
|
|
|
}
|
|
|
|
}
|