memory.tcl 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. # SPDX-License-Identifier: GPL-2.0-or-later
  2. # MEMORY
  3. #
  4. # All Memory regions have two components.
  5. # (1) A count of regions, in the form N_NAME
  6. # (2) An array within info about each region.
  7. #
  8. # The ARRAY
  9. #
  10. # <NAME>( RegionNumber , ATTRIBUTE )
  11. #
  12. # Where <NAME> is one of:
  13. #
  14. # N_FLASH & FLASH (internal memory)
  15. # N_RAM & RAM (internal memory)
  16. # N_MMREGS & MMREGS (for memory mapped registers)
  17. # N_XMEM & XMEM (off chip memory, ie: flash on cs0, sdram on cs2)
  18. # or N_UNKNOWN & UNKNOWN for things that do not exist.
  19. #
  20. # We have 1 unknown region.
  21. set N_UNKNOWN 1
  22. # All MEMORY regions must have these attributes
  23. # CS - chip select (if internal, use -1)
  24. set UNKNOWN(0,CHIPSELECT) -1
  25. # BASE - base address in memory
  26. set UNKNOWN(0,BASE) 0
  27. # LEN - length in bytes
  28. set UNKNOWN(0,LEN) $CPU_MAX_ADDRESS
  29. # HUMAN - human name of the region
  30. set UNKNOWN(0,HUMAN) "unknown"
  31. # TYPE - one of:
  32. # flash, ram, mmr, unknown
  33. # For harvard arch:
  34. # iflash, dflash, iram, dram
  35. set UNKNOWN(0,TYPE) "unknown"
  36. # RWX - access ablity
  37. # unix style chmod bits
  38. # 0 - no access
  39. # 1 - execute
  40. # 2 - write
  41. # 4 - read
  42. # hence: 7 - readwrite execute
  43. set RWX_NO_ACCESS 0
  44. set RWX_X_ONLY $BIT0
  45. set RWX_W_ONLY $BIT1
  46. set RWX_R_ONLY $BIT2
  47. set RWX_RW [expr {$RWX_R_ONLY + $RWX_W_ONLY}]
  48. set RWX_R_X [expr {$RWX_R_ONLY + $RWX_X_ONLY}]
  49. set RWX_RWX [expr {$RWX_R_ONLY + $RWX_W_ONLY + $RWX_X_ONLY}]
  50. set UNKNOWN(0,RWX) $RWX_NO_ACCESS
  51. # WIDTH - access width
  52. # 8,16,32 [0 means ANY]
  53. set ACCESS_WIDTH_NONE 0
  54. set ACCESS_WIDTH_8 $BIT0
  55. set ACCESS_WIDTH_16 $BIT1
  56. set ACCESS_WIDTH_32 $BIT2
  57. set ACCESS_WIDTH_ANY [expr {$ACCESS_WIDTH_8 + $ACCESS_WIDTH_16 + $ACCESS_WIDTH_32}]
  58. set UNKNOWN(0,ACCESS_WIDTH) $ACCESS_WIDTH_NONE
  59. proc iswithin { ADDRESS BASE LEN } {
  60. return [expr {(($ADDRESS - $BASE) >= 0) && (($BASE + $LEN - $ADDRESS) > 0)}]
  61. }
  62. proc address_info { ADDRESS } {
  63. foreach WHERE { FLASH RAM MMREGS XMEM UNKNOWN } {
  64. if { info exists $WHERE } {
  65. set lmt [set N_[set WHERE]]
  66. for { set region 0 } { $region < $lmt } { incr region } {
  67. if { iswithin $ADDRESS $WHERE($region,BASE) $WHERE($region,LEN) } {
  68. return "$WHERE $region";
  69. }
  70. }
  71. }
  72. }
  73. # Return the 'unknown'
  74. return "UNKNOWN 0"
  75. }
  76. proc memread32 {ADDR} {
  77. if ![ catch { set foo [read_memory $ADDR 32 1] } msg ] {
  78. return $foo
  79. } else {
  80. error "memread32: $msg"
  81. }
  82. }
  83. proc memread16 {ADDR} {
  84. if ![ catch { set foo [read_memory $ADDR 16 1] } msg ] {
  85. return $foo
  86. } else {
  87. error "memread16: $msg"
  88. }
  89. }
  90. proc memread8 {ADDR} {
  91. if ![ catch { set foo [read_memory $ADDR 8 1] } msg ] {
  92. return $foo
  93. } else {
  94. error "memread8: $msg"
  95. }
  96. }
  97. proc memwrite32 {ADDR DATA} {
  98. if ![ catch { write_memory $ADDR 32 $DATA } msg ] {
  99. return $DATA
  100. } else {
  101. error "memwrite32: $msg"
  102. }
  103. }
  104. proc memwrite16 {ADDR DATA} {
  105. if ![ catch { write_memory $ADDR 16 $DATA } msg ] {
  106. return $DATA
  107. } else {
  108. error "memwrite16: $msg"
  109. }
  110. }
  111. proc memwrite8 {ADDR DATA} {
  112. if ![ catch { write_memory $ADDR 8 $DATA } msg ] {
  113. return $DATA
  114. } else {
  115. error "memwrite8: $msg"
  116. }
  117. }
  118. proc memread32_phys {ADDR} {
  119. if ![ catch { set foo [read_memory $ADDR 32 1 phys] } msg ] {
  120. return $foo
  121. } else {
  122. error "memread32: $msg"
  123. }
  124. }
  125. proc memread16_phys {ADDR} {
  126. if ![ catch { set foo [read_memory $ADDR 16 1 phys] } msg ] {
  127. return $foo
  128. } else {
  129. error "memread16: $msg"
  130. }
  131. }
  132. proc memread8_phys {ADDR} {
  133. if ![ catch { set foo [read_memory $ADDR 8 1 phys] } msg ] {
  134. return $foo
  135. } else {
  136. error "memread8: $msg"
  137. }
  138. }
  139. proc memwrite32_phys {ADDR DATA} {
  140. if ![ catch { write_memory $ADDR 32 $DATA phys } msg ] {
  141. return $DATA
  142. } else {
  143. error "memwrite32: $msg"
  144. }
  145. }
  146. proc memwrite16_phys {ADDR DATA} {
  147. if ![ catch { write_memory $ADDR 16 $DATA phys } msg ] {
  148. return $DATA
  149. } else {
  150. error "memwrite16: $msg"
  151. }
  152. }
  153. proc memwrite8_phys {ADDR DATA} {
  154. if ![ catch { write_memory $ADDR 8 $DATA phys } msg ] {
  155. return $DATA
  156. } else {
  157. error "memwrite8: $msg"
  158. }
  159. }