+# Load dynamic Python code first.
+source ~/.gdbinit.py
+
#
-# Base settings
+# Base settings.
#
set print pretty on
-set prompt \e[30;1m(\e[34;1mgdb\e[30;1m)\e[0m
+set prompt \e[30;1m(\e[34;1mgdb\e[30;1m) \e[0m
set history save on
set pagination off
set output-radix 16
#catch fork
#catch vfork
-
-#
-# Random helpers.
-#
-
-define exit
- quit
-end
-
-define jtag
- target remote localhost:2000
-end
-define kgdboc
- set remotebaud 57600
- if $argc == 0
- target remote /dev/ttyS0
- else
- target remote /dev/tty$arg0
- end
-end
-define kgdbocusb
- kgdboc USB0
-end
-define kgdboe
- target remote udp:bfin:6443
-end
-define vapier
- target remote vapier:2000
-end
-define bfin
- target remote bfin:1234
-end
-
-define di
- if $argc == 0
- disassemble $pc ($pc + 0x40)
- end
- if $argc == 1
- disassemble $arg0 ($arg0 + 0x40)
- end
-end
-define dis
- if $argc == 0
- disassemble $pc,+0x40
- end
- if $argc == 1
- disassemble $arg0,+0x40
- end
-end
-define go
- jump *$arg0
-end
-
-
-#
-# Misc Blackfin helper functions
-#
-
-define regs
- printf "R0: %08x %-11i P0: %08x RETS: %08x LC0: %08x %u\n", $r0, $r0, $p0, $rets, $lc0, $lc0
- printf "R1: %08x %-11i P1: %08x RETI: %08x LT0: %08x\n", $r1, $r1, $p1, $reti, $lt0
- printf "R2: %08x %-11i P2: %08x RETX: %08x LB0: %08x\n", $r2, $r2, $p2, $retx, $lb0
- printf "R3: %08x %-11i P3: %08x RETE: %08x LC1: %08x %u\n", $r3, $r3, $p3, $rete, $lc1, $lc1
- printf "R4: %08x %-11i P4: %08x RETN: %08x LT1: %08x\n", $r4, $r4, $p4, $retn, $lt1
- printf "R5: %08x %-11i P5: %08x ASTAT: %08x LB1: %08x\n", $r5, $r5, $p5, $astat, $lb1
- printf "R6: %08x %-11i SP: %08x CC: %08x\n", $r6, $r6, $sp, $cc
- printf "R7: %08x %-11i USP: %08x CYC1: %08x SEQSTAT: %08x\n", $r7, $r7, $usp, $cycles, $seqstat
- printf "PC: %08x FP: %08x CYC2: %08x SYSCFG: %08x\n", $pc, $fp, $cycles2, $syscfg
-end
-document regs
-Usage: regs
-Display the common core registers in a compact format.
-end
-
-define all_regs
- regs
- printf " B0 : %08x L0 : %08x M0 : %08x I0 : %08x\n", $b0, $l0, $m0, $i0
- printf " B1 : %08x L1 : %08x M1 : %08x I1 : %08x\n", $b1, $l1, $m1, $i1
- printf " B2 : %08x L2 : %08x M2 : %08x I2 : %08x\n", $b2, $l2, $m2, $i2
- printf " B3 : %08x L3 : %08x M3 : %08x I3 : %08x\n", $b3, $l3, $m3, $i3
- printf "A0.w: %08x A0.x: %08x A1.w: %08x A1.x: %08x\n", $a0w, $a0x, $a1w, $a1x
-end
-document all_regs
-Usage: all_regs
-Display all core registers in a compact format.
-end
-
-define astat
- printf "ASTAT: %#x ( ", $astat
- if $astat & (1 << 25)
- printf "VS "
- end
- if $astat & (1 << 24)
- printf "V "
- end
- if $astat & (1 << 19)
- printf "AV1S "
- end
- if $astat & (1 << 18)
- printf "AV1 "
- end
- if $astat & (1 << 17)
- printf "AV0S "
- end
- if $astat & (1 << 16)
- printf "AV0 "
- end
- if $astat & (1 << 13)
- printf "AC1 "
- end
- if $astat & (1 << 12)
- printf "AC0 "
- end
- if $astat & (1 << 8)
- printf "RND_MOD "
- end
- if $astat & (1 << 6)
- printf "AQ "
- end
- if $astat & (1 << 5)
- printf "CC "
- end
- if $astat & (1 << 3)
- printf "V_COPY "
- end
- if $astat & (1 << 2)
- printf "AC0_COPY "
- end
- if $astat & (1 << 1)
- printf "AN "
- end
- if $astat & (1 << 0)
- printf "AZ "
- end
- printf ")\n"
- set $$inv = $astat & 0xfcf0ce90
- if $$inv
- printf "Invalid bits: %#x\n", $$inv
- end
-end
-
-define seqstat
- if $argc == 1
- set $$seqstat = $arg0
- else
- set $$seqstat = $seqstat
- end
- set $$excause = ($$seqstat & 0x3f)
- set $$sftreset = ($$seqstat & (0x1 << 13)) >> 13
- set $$hwerrcause = ($$seqstat & (0x1f << 14)) >> 14
- printf "SEQSTAT: %08x\n", $$seqstat
- printf " EXCAUSE: 0x%x\t", $$excause
- if $$excause >= 0x0 && $$excause <= 0xf
- printf "(custom exception)"
- end
- if $$excause == 0x10
- printf "(single step)"
- end
- if $$excause == 0x11
- printf "(trace buffer full)"
- end
- if $$excause == 0x21
- printf "(undef inst)"
- end
- if $$excause == 0x22
- printf "(illegal inst)"
- end
- if $$excause == 0x23
- printf "(dcplb prot violation)"
- end
- if $$excause == 0x24
- printf "(misaligned data)"
- end
- if $$excause == 0x25
- printf "(unrecoverable event)"
- end
- if $$excause == 0x26
- printf "(dcplb miss)"
- end
- if $$excause == 0x27
- printf "(multiple dcplb hit)"
- end
- if $$excause == 0x28
- printf "(emulation watchpoint)"
- end
- if $$excause == 0x2a
- printf "(misaligned inst)"
- end
- if $$excause == 0x2b
- printf "(icplb prot violation)"
- end
- if $$excause == 0x2c
- printf "(icplb miss)"
- end
- if $$excause == 0x2d
- printf "(multiple icplb hit)"
- end
- if $$excause == 0x2e
- printf "(illegal use of supervisor resource)"
- end
- printf "\n"
- printf " SFTRESET: 0x%x\t(last reset was ", $$sftreset
- if $$sftreset == 0
- printf "not "
- end
- printf "a software reset)\n"
- printf " HWERRCAUSE: 0x%x\t", $$hwerrcause
- if $$hwerrcause == 0x2
- printf "(system mmr error)"
- end
- if $$hwerrcause == 0x3
- printf "(external memory addressing error)"
- end
- if $$hwerrcause == 0x12
- printf "(performance monitor overflow)"
- end
- if $$hwerrcause == 0x18
- printf "(raise 5 instruction)"
- end
- printf "\n"
-end
-document seqstat
-Usage: seqstat [value=$seqstat]
-Parse the bits of the seqstat [value] into the human readable definitions.
-end
-
-define reset
- if $argc == 0
- set $$l1 = 0xffa00000
- else
- set $$l1 = $arg0
- end
- set $$pc = $$l1
-
- # SSYNC
- set *(unsigned short *)($$l1) = 0x0024
- set $$l1 += 2
-
- # P2.H = 0xffc0
- set *(unsigned long *)($$l1) = 0xffc0e14a
- set $$l1 += 4
-
- # P2.L = 0x100
- set *(unsigned long *)($$l1) = 0x0100e10a
- set $$l1 += 4
-
- # R0 = 0x7 (X)
- set *(unsigned short *)($$l1) = 0x6038
- set $$l1 += 2
-
- # [P2] = R0
- set *(unsigned short *)($$l1) = 0x9310
- set $$l1 += 2
-
- # SSYNC
- set *(unsigned short *)($$l1) = 0x0024
- set $$l1 += 2
-
- # R0 = 0x0 (X)
- set *(unsigned short *)($$l1) = 0x6000
- set $$l1 += 2
-
- # [P2] = R0
- set *(unsigned short *)($$l1) = 0x9310
- set $$l1 += 2
-
- # SSYNC
- set *(unsigned short *)($$l1) = 0x0024
- set $$l1 += 2
-
- # RAISE 0x1
- set *(unsigned short *)($$l1) = 0x0091
- set $$l1 += 2
-
- # JUMP.S -0x18
- if ($$l1 - $$pc) != 0x18
- echo ERROR: jump.s has wrong offset
- else
- set $pc == $$pc
- end
- set *(unsigned short *)($$l1) = 0x2ff4
- set $$l1 += 2
-
- printf "Continuing.\n"
- continue
-end
-document reset
-Usage: reset [L1 Instruction address=0xffa00000]
-Cram the software reset code into [L1 Instruction address] and execute it.
-This will perform both a system reset and a core reset.
-end
-
-define hwtrace_on
- set $$TBUFCTL = (unsigned long *)0xFFE06000
- set *$$TBUFCTL = 0x3
-end
-define hwtrace_off
- set $$TBUFCTL = (unsigned long *)0xFFE06000
- set *$$TBUFCTL = 0x1
-end
-define hwtrace
- set $$TBUFSTAT = (unsigned long *)0xFFE06004
- set $$TBUF = (unsigned long *)0xFFE06100
- set $$i = 0
- if (!(*$$TBUFSTAT & 0x1F))
- printf "Hardware trace buffer is empty\n"
- end
- while (*$$TBUFSTAT & 0x1F)
- printf "%2i Target: ", $$i
- output/a *$$TBUF
- printf "\n"
- printf " Source: "
- output/a *$$TBUF
- printf "\n"
- set $$i++
- end
-end
-document hwtrace
-Usage: hwtrace
-Dump the hardware trace buffer. Remember, this is a destructive operation,
-so it can only be dumped once.
-end
-
-define show_clocks
- printf "PLL_LOCKCNT: 0x%04x\n", *(unsigned short *)0xFFC00010
- printf "VR_CTL: 0x%04x\n", *(unsigned short *)0xFFC00008
- printf "PLL_DIV: 0x%04x\n", *(unsigned short *)0xFFC00004
- printf "PLL_CTL: 0x%04x\n", *(unsigned short *)0xFFC00000
-end
-
-define show_sdram
- printf "SDRRC: 0x%04x\n", *(unsigned short *)0xFFC00A18
-
- set $$SDBCTL = *(unsigned short *)0xFFC00A14
- set $$EBCAW = ($$SDBCTL & 0x30) >> 4
- set $$EBSZ = ($$SDBCTL & 0xe) >> 1
- printf "SDBCTL: 0x%04x ", $$SDBCTL
- if ($$SDBCTL & 0x1)
- printf "(enabled) "
- else
- printf "(disabled) "
- end
- if $$EBCAW == 0x0
- printf "(8-bit) "
- end
- if $$EBCAW == 0x1
- printf "(9-bit) "
- end
- if $$EBCAW == 0x2
- printf "(10-bit) "
- end
- if $$EBCAW == 0x3
- printf "(11-bit) "
- end
- if $$EBSZ == 0x0
- printf "(16MB)"
- end
- if $$EBSZ == 0x1
- printf "(32MB)"
- end
- if $$EBSZ == 0x2
- printf "(64MB)"
- end
- if $$EBSZ == 0x3
- printf "(128MB)"
- end
- if $$EBSZ == 0x4
- printf "(256MB)"
- end
- if $$EBSZ == 0x5
- printf "(512MB)"
- end
- printf "\n"
-
- set $$SDSTAT = *(unsigned short *)0xFFC00A1C
- printf "SDSTAT: 0x%04x ", $$SDSTAT
- if ($$SDSTAT & (1 << 0))
- printf "(idle) "
- else
- printf "(busy) "
- end
- if ($$SDSTAT & (1 << 1))
- printf "(self-refresh) "
- end
- if ($$SDSTAT & (1 << 2))
- printf "(powerup) "
- end
- if ($$SDSTAT & (1 << 3))
- printf "(will power up) "
- end
- if ($$SDSTAT & (1 << 4))
- printf "(EAB error) "
- end
- printf "\n"
-
- printf "SDGCTL: 0x%08x\n", *(unsigned long *)0xFFC00A10
-end
-
-define show_ddr
- printf "DDRCTL0: 0x%08x\n", *(unsigned long *)0xFFC00A20
- printf "DDRCTL1: 0x%08x\n", *(unsigned long *)0xFFC00A24
- printf "DDRCTL2: 0x%08x\n", *(unsigned long *)0xFFC00A28
- printf "DDRCTL3: 0x%08x\n", *(unsigned long *)0xFFC00A2C
- printf "DDRQUE: 0x%08x\n", *(unsigned long *)0xFFC00A30
- printf "ERRADD: "
- output/a *(unsigned long *)0xFFC00A34
- printf "\n"
-
- set $$ERRMST = *(unsigned short *)0xFFC00A38
- printf "ERRMST: 0x%04x ( ", $$ERRMST
- if ($$ERRMST & (1 << 7))
- printf "core_merror "
- end
- if ($$ERRMST & (1 << 6))
- printf "deb2_merror "
- end
- if ($$ERRMST & (1 << 5))
- printf "deb1_merror "
- end
- if ($$ERRMST & (1 << 4))
- printf "deb0_merror "
- end
- if ($$ERRMST & (1 << 3))
- printf "core_error "
- end
- if ($$ERRMST & (1 << 2))
- printf "deb2_error "
- end
- if ($$ERRMST & (1 << 1))
- printf "deb1_error "
- end
- if ($$ERRMST & (1 << 0))
- printf "deb0_error "
- end
- printf ")\n"
-
- set $$RSTCTL = *(unsigned short *)0xFFC00A3C
- printf "RSTCTL: 0x%04x ( ", $$RSTCTL
- if ($$RSTCTL & (1 << 4))
- printf "srack "
- end
- if ($$RSTCTL & (1 << 3))
- printf "srreq "
- end
- if (!($$RSTCTL & (1 << 1)))
- printf "!!! ERROR: bit 1 needs to be 1, but it is 0 !!! "
- end
- if ($$RSTCTL & (1 << 0))
- printf "ddr_sreset "
- end
- printf ")\n"
-end
-
-define show_ebiu
- printf "EBIU_AMGCTL: 0x%04x\n", *(unsigned short *)0xFFC00A00
- printf "EBIU_AMBCTL0: 0x%08x\n", *(unsigned long *)0xFFC00A04
- printf "EBIU_AMBCTL1: 0x%08x\n", *(unsigned long *)0xFFC00A08
- printf "EBIU_MBSCTL: 0x%08x\n", *(unsigned long *)0xFFC00A0C
-
- set $$EBIU_ARBSTAT = *(unsigned long *)0xFFC00A10
- printf "EBIU_ARBSTAT: 0x%08x ( ", $$EBIU_ARBSTAT
- if ($$EBIU_ARBSTAT & (1 << 1))
- printf "bgstat "
- end
- if ($$EBIU_ARBSTAT & (1 << 0))
- printf "arbstat "
- end
- printf ")\n"
-
- printf "EBIU_MODE: 0x%08x\n", *(unsigned long *)0xFFC00A14
- printf "EBIU_FCTL: 0x%08x\n", *(unsigned long *)0xFFC00A18
-end
-
-define _show_cec
- set $$cec = *(unsigned long *)$arg0
- printf "0x%08x: ", $$cec
- if ($$cec & (1 << 0))
- printf "EMU "
- else
- printf " "
- end
- if ($$cec & (1 << 1))
- printf "RST "
- else
- printf " "
- end
- if ($$cec & (1 << 2))
- printf "NMI "
- else
- printf " "
- end
- if ($$cec & (1 << 3))
- printf "EVX "
- else
- printf " "
- end
- if ($$cec & (1 << 4))
- printf "GBL "
- else
- printf " "
- end
- if ($$cec & (1 << 5))
- printf "HW "
- else
- printf " "
- end
- if ($$cec & (1 << 6))
- printf "TMR "
- else
- printf " "
- end
- set $$ceci = 7
- while ($$ceci < 16)
- if ($$cec & (1 << $$ceci))
- printf "G%i ", $$ceci
- else
- printf " "
- if ($$ceci > 9)
- printf " "
- end
- end
- set $$ceci = $$ceci + 1
- end
- printf "\n"
-end
-define show_cec
- printf "IMASK: "
- _show_cec 0xFFE02104
- printf "IPEND: "
- _show_cec 0xFFE02108
- printf "ILAT: "
- _show_cec 0xFFE0210C
-
- set $$EVT = 0xFFE02000
- set $$EVTi = 0
- while ($$EVTi < 16)
- printf "EVT%-2i ", $$EVTi
- output/a *(unsigned long *)($$EVT + $$EVTi * 4)
- printf "\n"
- set $$EVTi = $$EVTi + 1
- end
-end
-
-define _show_cplbs
- set $$addr = $arg0
- set $$data = $arg1
- set $$i = 0
- while ($$i < 16)
- set $$data_val = *(unsigned long *)($$data + $$i * 4)
- printf " 0x%08x 0x%08x ( ", *(unsigned long *)($$addr + $$i * 4), $$data_val
- if (($$data_val & (0x3 << 16)) == (0x0 << 16))
- printf "1K "
- end
- if (($$data_val & (0x3 << 16)) == (0x1 << 16))
- printf "4K "
- end
- if (($$data_val & (0x3 << 16)) == (0x2 << 16))
- printf "1M "
- end
- if (($$data_val & (0x3 << 16)) == (0x3 << 16))
- printf "4M "
- end
- if ($$data_val & (0x1 << 14))
- printf "wt "
- else
- printf "wb "
- end
- if ($$data_val & (0x1 << 7))
- printf "dirty "
- end
- if ($$data_val & (0x1 << 4))
- printf "supv-wr "
- end
- if ($$data_val & (0x1 << 3))
- printf "user-wr "
- end
- if ($$data_val & (0x1 << 2))
- printf "user-rd "
- end
- if ($$data_val & (0x1 << 1))
- printf "locked "
- end
- if ($$data_val & (0x1 << 0))
- printf "valid "
- else
- printf "invalid "
- end
- printf ")\n"
- set $$i = $$i + 1
- end
-end
-define show_icplbs
- set $$IMEM_CONTROL = 0xFFE01004
- printf "ICPLBS (0x%08x)\n", *(unsigned long *)$$IMEM_CONTROL
- _show_cplbs 0xFFE01100 0xFFE01200
-end
-define show_dcplbs
- set $$DMEM_CONTROL = 0xFFE00004
- printf "DCPLBS (0x%08x)\n", *(unsigned long *)$$DMEM_CONTROL
- _show_cplbs 0xFFE00100 0xFFE00200
-end
-define show_cplbs
- show_icplbs
- show_dcplbs
-end
-
-define _show_cplbstatus
- set $$CPLB_STATUS = *(unsigned long *)$arg0
- printf " STATUS = 0x%08x ( ", $$CPLB_STATUS
- if ($$CPLB_STATUS & (1 << 19))
- printf "illaddr "
- end
- if ($$CPLB_STATUS & (1 << 18))
- printf "dag1 "
- else
- printf "dag0 "
- end
- if ($$CPLB_STATUS & (1 << 17))
- printf "super "
- else
- printf "user "
- end
- if ($$CPLB_STATUS & (1 << 16))
- printf "write "
- else
- printf "read "
- end
- set $$i = 15
- while ($$i >= 0)
- if ($$CPLB_STATUS & (1 << $$i))
- printf "%i ", $$i
- end
- set $$i--
- end
- printf ")\n"
-
- set $$CPLB_FAULT_ADDR = *(unsigned long *)$arg1
- printf " FAULT_ADDR = "
- output/a $$CPLB_FAULT_ADDR
- printf "\n"
-end
-define show_icplbstatus
- printf "ICPLB Status\n"
- _show_cplbstatus 0xFFE01008 0xFFE0100C
-end
-define show_dcplbstatus
- printf "DCPLB Status\n"
- _show_cplbstatus 0xFFE00008 0xFFE0000C
-end
-define show_cplbstatus
- seqstat
- show_icplbstatus
- show_dcplbstatus
-end
-
-define safe_regs
- set $r0 = $r1 = $r2 = $r3 = $r4 = $r5 = $r6 = $r7 = 0xffb00000
- set $sp = $fp = $usp = $r0 + 0x100
- set $p0 = $p1 = $p2 = $p3 = $p4 = $p5 = 0xffa00000
- set $pc = $rets = $reti = $retx = $retn = $p0
- set $lt0 = $lt1 = $lb0 = $lb1 = 1
- set $lc0 = $lc1 = 0
- set $i0 = $i1 = $i2 = $i3 = $r0
- set $b0 = $b1 = $b2 = $b3 = $r0
- set $l0 = $l1 = $l2 = $l3 = $r0
- set $m0 = $m1 = $m2 = $m3 = $r0
-end
-
-define _show_dma
- set $$DMA_BASE = $arg0
- set $$NEXT_DESC_PTR = *(unsigned long *) ($$DMA_BASE + 0x00)
- set $$START_ADDR = *(unsigned long *) ($$DMA_BASE + 0x04)
- set $$CONFIG = *(unsigned short *) ($$DMA_BASE + 0x08)
- set $$X_COUNT = *(unsigned short *) ($$DMA_BASE + 0x10)
- set $$X_MODIFY = *(unsigned short *) ($$DMA_BASE + 0x14)
- set $$Y_COUNT = *(unsigned short *) ($$DMA_BASE + 0x18)
- set $$Y_MODIFY = *(unsigned short *) ($$DMA_BASE + 0x1C)
- set $$CURR_DESC_PTR = *(unsigned long *) ($$DMA_BASE + 0x20)
- set $$CURR_ADDR = *(unsigned long *) ($$DMA_BASE + 0x24)
- set $$IRQ_STATUS = *(unsigned short *) ($$DMA_BASE + 0x28)
- set $$CURR_X_COUNT = *(unsigned short *) ($$DMA_BASE + 0x30)
- set $$CURR_Y_COUNT = *(unsigned short *) ($$DMA_BASE + 0x38)
- printf "desc: curr: 0x%08x next: 0x%08x\n", $$CURR_DESC_PTR, $$NEXT_DESC_PTR
- printf "addr: curr: 0x%08x start: 0x%08x\n", $$CURR_ADDR, $$START_ADDR
- printf "X: curr: 0x%04x count: 0x%04x mod: 0x%04x (%i)\n", $$CURR_X_COUNT, $$X_COUNT, $$X_MODIFY, (short)$$X_MODIFY
- printf "Y: curr: 0x%04x count: 0x%04x mod: 0x%04x (%i)\n", $$CURR_Y_COUNT, $$Y_COUNT, $$Y_MODIFY, (short)$$Y_MODIFY
- printf "dma config: 0x%04x (", $$CONFIG
- if ($$CONFIG & (1 << 0))
- printf "enabled "
- else
- printf "disabled "
- end
- if ($$CONFIG & (0x1 << 1))
- printf "write "
- else
- printf "read "
- end
- set $$WDSIZE = ($$CONFIG & (0x3 << 2)) >> 2
- if ($$WDSIZE == 0x3)
- printf "WDSIZE:INVALID "
- end
- if ($$WDSIZE == 0x2)
- printf "32-bit "
- end
- if ($$WDSIZE == 0x1)
- printf "16-bit "
- end
- if ($$WDSIZE == 0x0)
- printf "8-bit "
- end
- if ($$CONFIG & (0x1 << 4))
- printf "2D "
- else
- printf "1D "
- end
- if ($$CONFIG & (0x1 << 5))
- printf "sync "
- end
- if ($$CONFIG & (0x1 << 6))
- printf "di_sel "
- end
- if ($$CONFIG & (0x1 << 7))
- printf "interrupt "
- end
- set $$NDSIZE = ($$CONFIG & (0xF << 8)) >> 8
- if ($$NDSIZE > 0 && $$NDSIZE < 10)
- printf "NDSIZE_%i ", $$NDSIZE
- end
- if ($$NDSIZE >= 10)
- printf "NDSIZE:INVALID:%i ", $$NDSIZE
- end
- set $$FLOW = ($$CONFIG & (0x7 << 12)) >> 12
- if ($$FLOW == 0)
- printf "stop"
- else
- if ($$FLOW == 1)
- printf "autobuffer"
- else
- if ($$FLOW == 4)
- printf "descriptor_array"
- else
- if ($$FLOW == 6)
- printf "descriptor_list_small"
- else
- if ($$FLOW == 7)
- printf "descriptor_list_large"
- else
- printf "FLOW:INVALID:%i", $$FLOW
- end
- end
- end
- end
- end
- printf ")\n"
- printf "irq status: 0x%04x (", $$IRQ_STATUS
- if ($$IRQ_STATUS & (0x1 << 0))
- printf "done "
- end
- if ($$IRQ_STATUS & (0x1 << 1))
- printf "err "
- end
- if ($$IRQ_STATUS & (0x1 << 2))
- printf "dfetch "
- end
- if ($$IRQ_STATUS & (0x1 << 3))
- printf "run "
- end
- printf ")\n"
-end
-
-define show_ctimer
- set $$CTIMER = 0xFFE03000
- set $$TCNTL = *(unsigned long *) ($$CTIMER + 0x0)
- set $$TPERIOD = *(unsigned long *) ($$CTIMER + 0x4)
- set $$TSCALE = *(unsigned long *) ($$CTIMER + 0x8)
- set $$TCOUNT = *(unsigned long *) ($$CTIMER + 0xC)
- printf "TCNTL: %#x ( ", $$TCNTL
- if ($$TCNTL & (1 << 0))
- printf "power "
- end
- if ($$TCNTL & (1 << 1))
- printf "enable "
- end
- if ($$TCNTL & (1 << 2))
- printf "autoreload "
- end
- if ($$TCNTL & (1 << 3))
- printf "int-enabled "
- end
- printf ")\n"
- printf "TPERIOD: %#x\n", $$TPERIOD
- printf "TSCALE: %#x\n", $$TSCALE
- printf "TCOUNT: %#x\n", $$TCOUNT
-end
-
-define show_spi
- if $argc > 0
- set $$SPI_BASE = $arg0
- else
- set $$SPI_BASE = 0xFFC00500
- end
- set $$SPI_BAUD = *(unsigned short *) ($$SPI_BASE + 0x14)
- set $$SPI_CTL = *(unsigned short *) ($$SPI_BASE + 0x00)
- set $$SPI_FLG = *(unsigned short *) ($$SPI_BASE + 0x04)
- set $$SPI_STAT = *(unsigned short *) ($$SPI_BASE + 0x08)
- set $$SPI_TDBR = *(unsigned short *) ($$SPI_BASE + 0x0C)
- set $$SPI_RDBR = *(unsigned short *) ($$SPI_BASE + 0x10)
- set $$SPI_SHAD = *(unsigned short *) ($$SPI_BASE + 0x18)
- printf "BAUD: %04x (%i)\n", $$SPI_BAUD, $$SPI_BAUD
- printf "CTL: %04x (", $$SPI_CTL
- set $$TIMOD = $$SPI_CTL & 0x3
- printf "timod:%i ", $$TIMOD
- if ($$SPI_CTL & (1 << 2))
- printf "sz "
- end
- if ($$SPI_CTL & (1 << 3))
- printf "gm "
- end
- if ($$SPI_CTL & (1 << 4))
- printf "psse "
- end
- if ($$SPI_CTL & (1 << 5))
- printf "emiso "
- end
- if ($$SPI_CTL & (1 << 8))
- printf "16bit "
- else
- printf "8bit "
- end
- if ($$SPI_CTL & (1 << 9))
- printf "lsbf "
- end
- if ($$SPI_CTL & (1 << 10))
- printf "cpol "
- end
- if ($$SPI_CTL & (1 << 11))
- printf "cpha "
- end
- if ($$SPI_CTL & (1 << 12))
- printf "mstr "
- else
- printf "slave "
- end
- if ($$SPI_CTL & (1 << 13))
- printf "wom "
- end
- if ($$SPI_CTL & (1 << 14))
- printf "enabled"
- else
- printf "disabled"
- end
- printf ")\n"
- printf "STAT: %04x (", $$SPI_STAT
- if ($$SPI_STAT & (1 << 0))
- printf "spif "
- end
- if ($$SPI_STAT & (1 << 1))
- printf "modf "
- end
- if ($$SPI_STAT & (1 << 2))
- printf "txe "
- end
- if ($$SPI_STAT & (1 << 3))
- printf "txs "
- end
- if ($$SPI_STAT & (1 << 4))
- printf "rbsy "
- end
- if ($$SPI_STAT & (1 << 5))
- printf "rxs "
- end
- if ($$SPI_STAT & (1 << 6))
- printf "txcol "
- end
- printf ")\n"
- printf "FLG: %04x\n", $$SPI_FLG
- printf "TDBR: %04x RDBR: %04x\n", $$SPI_TDBR, $$SPI_SHAD
-end
-
-define show_uart_lcr
- set $$LCR = $arg0
- printf "LCR: 0x%02x ( ", $$LCR
- set $$WLS = $$LCR & 0x3
- if ($$WLS == 0)
- printf "5-bit "
- end
- if ($$WLS == 1)
- printf "6-bit "
- end
- if ($$WLS == 2)
- printf "7-bit "
- end
- if ($$WLS == 3)
- printf "8-bit "
- end
- if ($$LCR & (1 << 2))
- printf "stb "
- end
- if ($$LCR & (1 << 3))
- printf "pen "
- end
- if ($$LCR & (1 << 4))
- printf "eps "
- end
- if ($$LCR & (1 << 5))
- printf "stp "
- end
- if ($$LCR & (1 << 6))
- printf "sb "
- end
- printf ")\n"
-end
-
-define show_uart_lsr
- set $$LSR = $arg0
- printf "LSR: 0x%02x ( ", $$LSR
- if ($$LSR & (1 << 0))
- printf "dr "
- end
- if ($$LSR & (1 << 1))
- printf "oe "
- end
- if ($$LSR & (1 << 2))
- printf "pe "
- end
- if ($$LSR & (1 << 3))
- printf "fe "
- end
- if ($$LSR & (1 << 4))
- printf "bi "
- end
- if ($$LSR & (1 << 5))
- printf "thre "
- end
- if ($$LSR & (1 << 6))
- printf "temt "
- end
- if ($$LSR & (1 << 7))
- printf "tfi "
- end
- printf ")\n"
-end
-
-define show_uart_ier
- set $$IER = $arg0
- printf "IER: 0x%02x ( ", $$IER
- if ($$IER & (1 << 0))
- printf "erbfi "
- end
- if ($$IER & (1 << 1))
- printf "etbei "
- end
- if ($$IER & (1 << 2))
- printf "elsi "
- end
- if ($$IER & (1 << 3))
- printf "edssi "
- end
- if ($$IER & (1 << 4))
- printf "edtpti "
- end
- if ($$IER & (1 << 5))
- printf "etfi "
- end
- if ($$IER & (1 << 6))
- printf "erfci "
- end
- printf ")\n"
-end
-
-define show_uart_mcr
- set $$MCR = $arg0
- printf "MCR: 0x%02x ( ", $$MCR
- if ($$MCR & (1 << 0))
- printf "xoff "
- end
- if ($$MCR & (1 << 1))
- printf "mrts "
- end
- if ($$MCR & (1 << 2))
- printf "rfit "
- end
- if ($$MCR & (1 << 3))
- printf "rfrt "
- end
- if ($$MCR & (1 << 4))
- printf "loop_ena "
- end
- if ($$MCR & (1 << 5))
- printf "fcpol "
- end
- if ($$MCR & (1 << 6))
- printf "arts "
- end
- if ($$MCR & (1 << 7))
- printf "acts "
- end
- printf ")\n"
-end
-
-define show_uart_msr
- set $$MSR = $arg0
- printf "MSR: 0x%02x ( ", $$MSR
- if ($$MSR & (1 << 0))
- printf "scts "
- end
- if ($$MSR & (1 << 4))
- printf "cts "
- end
- if ($$MSR & (1 << 5))
- printf "rfcs "
- end
- printf ")\n"
-end
-
-define show_uart_gctl
- set $$GCTL = $arg0
- printf "GCTL: 0x%02x ( ", $$GCTL
- if ($$GCTL & (1 << 0))
- printf "ucen "
- end
- if ($$GCTL & (1 << 1))
- printf "iren "
- end
- if ($$GCTL & (1 << 2))
- printf "tpolc "
- end
- if ($$GCTL & (1 << 3))
- printf "rpolc "
- end
- if ($$GCTL & (1 << 4))
- printf "fpe "
- end
- if ($$GCTL & (1 << 5))
- printf "ffe "
- end
- if ($$GCTL & (1 << 6))
- printf "edbo "
- end
- if ($$GCTL & (1 << 7))
- printf "eglsi "
- end
- printf ")\n"
-end
-
-define show_uart
- if $argc > 0
- set $$UART_BASE = $arg0
- else
- set $$UART_BASE = 0xffc00400
- end
- set $$UART_DLL = (unsigned short *) ($$UART_BASE + 0x00)
- set $$UART_RBR = (unsigned short *) ($$UART_BASE + 0x00)
- set $$UART_DLH = (unsigned short *) ($$UART_BASE + 0x04)
- set $$UART_IER = (unsigned short *) ($$UART_BASE + 0x04)
- set $$UART_IIR = (unsigned short *) ($$UART_BASE + 0x08)
- set $$UART_LCR = (unsigned short *) ($$UART_BASE + 0x0C)
- set $$UART_MCR = (unsigned short *) ($$UART_BASE + 0x10)
- set $$UART_LSR = (unsigned short *) ($$UART_BASE + 0x14)
- set $$UART_MSR = (unsigned short *) ($$UART_BASE + 0x18)
- set $$UART_SCR = (unsigned short *) ($$UART_BASE + 0x1C)
- set $$UART_GCTL = (unsigned short *) ($$UART_BASE + 0x24)
-
- set $$DLAB = (1 << 7)
- set $$LCR = *$$UART_LCR
- set *$$UART_LCR = ($$LCR | $$DLAB)
- printf "DLL: 0x%02x DLH: 0x%02x\n", *$$UART_DLL, *$$UART_DLH
- set *$$UART_LCR = $$LCR & ~$$DLAB
- printf "RBR: 0x%02x SCR: 0x%02x\n", *$$UART_RBR, *$$UART_SCR
- set *$$UART_LCR = $$LCR
-
- printf "IIR: 0x%02x ", *$$UART_IIR
- show_uart_ier *$$UART_IER
- show_uart_lcr $$LCR
- show_uart_mcr *$$UART_MCR
- show_uart_lsr *$$UART_LSR
- show_uart_msr *$$UART_MSR
- show_uart_gctl *$$UART_GCTL
-end
-
-define show_uart2
- if $argc > 0
- set $$UART_BASE = $arg0
- else
- set $$UART_BASE = 0xffc00400
- end
- set $$UART_DLL = (unsigned short *) ($$UART_BASE + 0x00)
- set $$UART_DLH = (unsigned short *) ($$UART_BASE + 0x04)
- set $$UART_GCTL = (unsigned short *) ($$UART_BASE + 0x08)
- set $$UART_LCR = (unsigned short *) ($$UART_BASE + 0x0C)
- set $$UART_MCR = (unsigned short *) ($$UART_BASE + 0x10)
- set $$UART_LSR = (unsigned short *) ($$UART_BASE + 0x14)
- set $$UART_MSR = (unsigned short *) ($$UART_BASE + 0x18)
- set $$UART_SCR = (unsigned short *) ($$UART_BASE + 0x1C)
- set $$UART_IER = (unsigned short *) ($$UART_BASE + 0x20)
- set $$UART_RBR = (unsigned short *) ($$UART_BASE + 0x2C)
-
- printf "DLL: 0x%02x DLH: 0x%02x\n", *$$UART_DLL, *$$UART_DLH
- printf "RBR: 0x%02x SCR: 0x%02x\n", *$$UART_RBR, *$$UART_SCR
-
- printf " "
- show_uart_ier *$$UART_IER
- show_uart_lcr *$$UART_LCR
- show_uart_mcr *$$UART_MCR
- show_uart_lsr *$$UART_LSR
- show_uart_msr *$$UART_MSR
- show_uart_gctl *$$UART_GCTL
-end
-
-define show_uart4
- if $argc > 0
- set $$UART_BASE = $arg0
- else
- set $$UART_BASE = 0xffc02000
- end
- set $$UART_REVID = (unsigned long *) ($$UART_BASE + 0x00)
- set $$UART_CTL = (unsigned long *) ($$UART_BASE + 0x04)
- set $$UART_STAT = (unsigned long *) ($$UART_BASE + 0x08)
- set $$UART_SCR = (unsigned long *) ($$UART_BASE + 0x0C)
- set $$UART_CLK = (unsigned long *) ($$UART_BASE + 0x10)
- set $$UART_IMASK = (unsigned long *) ($$UART_BASE + 0x14)
- set $$UART_RBR = (unsigned long *) ($$UART_BASE + 0x20)
- set $$UART_THR = (unsigned long *) ($$UART_BASE + 0x24)
- set $$UART_TAIP = (unsigned long *) ($$UART_BASE + 0x28)
- set $$UART_TSR = (unsigned long *) ($$UART_BASE + 0x2C)
- set $$UART_RSR = (unsigned long *) ($$UART_BASE + 0x30)
- set $$UART_TXCNT = (unsigned long *) ($$UART_BASE + 0x34)
- set $$UART_RXCNT = (unsigned long *) ($$UART_BASE + 0x38)
-
- printf "REVID: 0x%08x SCR: 0x%08x\n", *$$UART_REVID, *$$UART_SCR
- printf " CLK: 0x%08x TAIP: 0x%08x\n", *$$UART_CLK, *$$UART_TAIP
-
- set $$CTL = *$$UART_CTL
- printf " CTL: 0x%08x ( ", $$CTL
- if ($$CTL & (1 << 0))
- printf "uen "
- end
- if ($$CTL & (1 << 1))
- printf "loop_ena "
- end
- set $$UMOD = ($$CTL & (3 << 4)) >> 4
- printf "mode:"
- if ($$UMOD == 0)
- printf "uart "
- end
- if ($$UMOD == 1)
- printf "mdb "
- end
- if ($$UMOD == 2)
- printf "irda "
- end
- if ($$UMOD == 3)
- printf "reserved "
- end
- set $$WLS = ($$CTL & (3 << 8)) >> 8
- printf "wls:"
- if ($$WLS == 0)
- printf "5"
- end
- if ($$WLS == 1)
- printf "6 "
- end
- if ($$WLS == 2)
- printf "7 "
- end
- if ($$WLS == 3)
- printf "8 "
- end
- if ($$CTL & (1 << 12))
- printf "stb "
- end
- if ($$CTL & (1 << 13))
- printf "stbh "
- end
- if ($$CTL & (1 << 14))
- printf "pen "
- end
- if ($$CTL & (1 << 15))
- printf "eps "
- end
- if ($$CTL & (1 << 16))
- printf "stp "
- end
- if ($$CTL & (1 << 17))
- printf "fpe "
- end
- if ($$CTL & (1 << 18))
- printf "ffe "
- end
- if ($$CTL & (1 << 19))
- printf "sb "
- end
- if ($$CTL & (1 << 22))
- printf "fcpol "
- end
- if ($$CTL & (1 << 23))
- printf "rpolc "
- end
- if ($$CTL & (1 << 24))
- printf "tpolc "
- end
- if ($$CTL & (1 << 25))
- printf "mrts "
- end
- if ($$CTL & (1 << 26))
- printf "xoff "
- end
- if ($$CTL & (1 << 27))
- printf "arts "
- end
- if ($$CTL & (1 << 28))
- printf "acts "
- end
- if ($$CTL & (1 << 29))
- printf "rfit "
- end
- if ($$CTL & (1 << 30))
- printf "rfrt "
- end
- printf ")\n"
-
- set $$STAT = *$$UART_STAT
- printf " STAT: 0x%08x ( ", $$STAT
- if ($$STAT & (1 << 0))
- printf "dr "
- end
- if ($$STAT & (1 << 1))
- printf "oe "
- end
- if ($$STAT & (1 << 2))
- printf "pe "
- end
- if ($$STAT & (1 << 3))
- printf "fe "
- end
- if ($$STAT & (1 << 4))
- printf "bi "
- end
- if ($$STAT & (1 << 5))
- printf "thre "
- end
- if ($$STAT & (1 << 7))
- printf "temt "
- end
- if ($$STAT & (1 << 8))
- printf "tfi "
- end
- if ($$STAT & (1 << 9))
- printf "astky "
- end
- if ($$STAT & (1 << 10))
- printf "addr "
- end
- if ($$STAT & (1 << 11))
- printf "ro "
- end
- if ($$STAT & (1 << 12))
- printf "scts "
- end
- if ($$STAT & (1 << 16))
- printf "cts "
- end
- if ($$STAT & (1 << 17))
- printf "rfcs "
- end
- printf ")\n"
-
- printf "IMASK: 0x%08x\n", *$$UART_IMASK
- printf " RSR: 0x%04x TSR: 0x%04x\n", *$$UART_RSR, *$$UART_TSR
- printf " RBR: 0x%02x THR: 0x%02x\n", *$$UART_RBR, *$$UART_THR
- printf "RXCNT: 0x%02x TXCNT: 0x%02x\n", *$$UART_RXCNT, *$$UART_TXCNT
-end
-
-define _otp_save
- set $$s_pc = $pc
- set $$s_r0 = $r0
- set $$s_r1 = $r1
- set $$s_r2 = $r2
- set $$s_mm = (unsigned long *)0xFFB00000
- set $$s_m0 = $$s_mm[0]
- set $$s_m1 = $$s_mm[1]
-end
-define _otp_restore
- set $pc = $$s_pc
- set $r0 = $$s_r0
- set $r1 = $$s_r1
- set $r2 = $$s_r2
- set $$s_mm[0] = $$s_m0
- set $$s_mm[1] = $$s_m1
-end
-
-define _otp_read
- set $pc = 0xef00001a
- set $r0 = $arg0
- set $r1 = $arg1
- set $r2 = 0xFFB00000
-
-end
-define otp_read
- if $argc == 0
- set $$OTP_PAGE = 0
- else
- set $$OTP_PAGE = $arg0
- end
-
- printf "OTP Page 0x%02x: ", $$OTP_PAGE
- _otp_save
- _otp_read $$OTP_PAGE, 0
- _otp_read $$OTP_PAGE, 1
- _otp_restore
-end
-
-define otp_dump
- _otp_save
- set $$page = 0
- while $$page < 0xe0
- printf "0x%02x: ", $$page
- _otp_read $$page, 0
- printf "%08x %08x ", $$OTP_PAGE_L, $$OTP_PAGE_H
- _otp_read $$page, 1
- printf "%08x %08x ", $$OTP_PAGE_L, $$OTP_PAGE_H
- $$page++
- end
- _otp_restore
-end
-
-
-#
-# Provide U-Boot-style functions in gdb
-#
-
-define uboot_jtag_load
- set remotetimeout 300
- load init.elf
- continue
- load u-boot
- call memset(&_bss_vma, 0, &_bss_len)
- continue
-end
-
-
-#
-# U-Boot style memory display functions
-#
-
-define md
- if $argc == 2
- x/64x$arg0 $arg1
- else
- if $argc == 3
- x/$arg2x$arg0 $arg1
- else
- help md
- end
- end
-end
-document md
-Usage: md <unit type> <address> [count=64]
-Display [count] <unit type> starting at <address>.
-end
-
-define _md
- # dummy func for "document" to work
-end
-document _md
-Usage: md[cbwl] <address> [count=64]
-Display [count] <chars|bytes|words|longs> starting at <address>.
-end
-
-define mdb
- if $argc == 1
- md b $arg0
- else
- if $argc == 2
- md b $arg0 $arg1
- else
- help _md
- end
- end
-end
-document mdb
-Use 'help _md'
-end
-define mdw
- if $argc == 1
- md h $arg0
- else
- if $argc == 2
- md h $arg0 $arg1
- else
- help _md
- end
- end
-end
-document mdw
-Use 'help _md'
-end
-define mdl
- if $argc == 1
- md w $arg0
- else
- if $argc == 2
- md w $arg0 $arg1
- else
- help _md
- end
- end
-end
-document mdl
-Use 'help _md'
-end
-define mdq
- if $argc == 1
- md g $arg0
- else
- if $argc == 2
- md g $arg0 $arg1
- else
- help _md
- end
- end
-end
-document mdq
-Use 'help _md'
-end
-define mdc
- set output-radix 10
- if $argc == 1
- md c $arg0
- else
- if $argc == 2
- md c $arg0 $arg1
- else
- help _md
- end
- end
- set output-radix 16
-end
-document mdc
-Use 'help _md'
-end
-
-
-#
-# U-Boot style memory modify functions
-#
-
-define _mw
- set $$addr = $arg0
- set $$val = $arg1
- set $$count = $arg2
- while $$count-- > 0
- set *$$addr = $$val
- set $$addr += 1
- end
- dont-repeat
-end
-document _mw
-Usage: mw[bwl] <address> <value> <count>
-Set <count> <bytes|words|longs> at <address> to <value>.
-end
-
-define mwl
- if $argc == 3
- set $$addr = (unsigned long *)$arg0
- _mw $$addr $arg1 $arg2
- else
- help _mw
- end
-end
-document mwl
-Use 'help _mw'
-end
-define mww
- if $argc == 3
- set $$addr = (unsigned short *)$arg0
- _mw $$addr $arg1 $arg2
- else
- help _mw
- end
-end
-document mww
-Use 'help _mw'
-end
-define mwb
- if $argc == 3
- set $$addr = (unsigned char *)$arg0
- _mw $$addr $arg1 $arg2
- else
- help _mw
- end
-end
-document mwb
-Use 'help _mw'
-end
-
-
#
# U-Boot style memory compare functions
#
end
-#set extended-prompt \[\e[30;1m\](\[\e[34;1m\]gdb\[\e[30;1m\])\[\e[0m\]
+#set extended-prompt \[\e[30;1m\](\[\e[34;1m\]gdb\[\e[30;1m\]) \[\e[0m\]
--- /dev/null
+define jtag
+ target remote localhost:2000
+end
+define kgdboc
+ set remotebaud 57600
+ if $argc == 0
+ target remote /dev/ttyS0
+ else
+ target remote /dev/tty$arg0
+ end
+end
+define kgdbocusb
+ kgdboc USB0
+end
+define kgdboe
+ target remote udp:bfin:6443
+end
+define vapier
+ target remote vapier:2000
+end
+define bfin
+ target remote bfin:1234
+end
+
+
+#
+# Misc Blackfin helper functions
+#
+
+define regs
+ printf "R0: %08x %-11i P0: %08x RETS: %08x LC0: %08x %u\n", $r0, $r0, $p0, $rets, $lc0, $lc0
+ printf "R1: %08x %-11i P1: %08x RETI: %08x LT0: %08x\n", $r1, $r1, $p1, $reti, $lt0
+ printf "R2: %08x %-11i P2: %08x RETX: %08x LB0: %08x\n", $r2, $r2, $p2, $retx, $lb0
+ printf "R3: %08x %-11i P3: %08x RETE: %08x LC1: %08x %u\n", $r3, $r3, $p3, $rete, $lc1, $lc1
+ printf "R4: %08x %-11i P4: %08x RETN: %08x LT1: %08x\n", $r4, $r4, $p4, $retn, $lt1
+ printf "R5: %08x %-11i P5: %08x ASTAT: %08x LB1: %08x\n", $r5, $r5, $p5, $astat, $lb1
+ printf "R6: %08x %-11i SP: %08x CC: %08x\n", $r6, $r6, $sp, $cc
+ printf "R7: %08x %-11i USP: %08x CYC1: %08x SEQSTAT: %08x\n", $r7, $r7, $usp, $cycles, $seqstat
+ printf "PC: %08x FP: %08x CYC2: %08x SYSCFG: %08x\n", $pc, $fp, $cycles2, $syscfg
+end
+document regs
+Usage: regs
+Display the common core registers in a compact format.
+end
+
+define all_regs
+ regs
+ printf " B0 : %08x L0 : %08x M0 : %08x I0 : %08x\n", $b0, $l0, $m0, $i0
+ printf " B1 : %08x L1 : %08x M1 : %08x I1 : %08x\n", $b1, $l1, $m1, $i1
+ printf " B2 : %08x L2 : %08x M2 : %08x I2 : %08x\n", $b2, $l2, $m2, $i2
+ printf " B3 : %08x L3 : %08x M3 : %08x I3 : %08x\n", $b3, $l3, $m3, $i3
+ printf "A0.w: %08x A0.x: %08x A1.w: %08x A1.x: %08x\n", $a0w, $a0x, $a1w, $a1x
+end
+document all_regs
+Usage: all_regs
+Display all core registers in a compact format.
+end
+
+define astat
+ printf "ASTAT: %#x ( ", $astat
+ if $astat & (1 << 25)
+ printf "VS "
+ end
+ if $astat & (1 << 24)
+ printf "V "
+ end
+ if $astat & (1 << 19)
+ printf "AV1S "
+ end
+ if $astat & (1 << 18)
+ printf "AV1 "
+ end
+ if $astat & (1 << 17)
+ printf "AV0S "
+ end
+ if $astat & (1 << 16)
+ printf "AV0 "
+ end
+ if $astat & (1 << 13)
+ printf "AC1 "
+ end
+ if $astat & (1 << 12)
+ printf "AC0 "
+ end
+ if $astat & (1 << 8)
+ printf "RND_MOD "
+ end
+ if $astat & (1 << 6)
+ printf "AQ "
+ end
+ if $astat & (1 << 5)
+ printf "CC "
+ end
+ if $astat & (1 << 3)
+ printf "V_COPY "
+ end
+ if $astat & (1 << 2)
+ printf "AC0_COPY "
+ end
+ if $astat & (1 << 1)
+ printf "AN "
+ end
+ if $astat & (1 << 0)
+ printf "AZ "
+ end
+ printf ")\n"
+ set $$inv = $astat & 0xfcf0ce90
+ if $$inv
+ printf "Invalid bits: %#x\n", $$inv
+ end
+end
+
+define seqstat
+ if $argc == 1
+ set $$seqstat = $arg0
+ else
+ set $$seqstat = $seqstat
+ end
+ set $$excause = ($$seqstat & 0x3f)
+ set $$sftreset = ($$seqstat & (0x1 << 13)) >> 13
+ set $$hwerrcause = ($$seqstat & (0x1f << 14)) >> 14
+ printf "SEQSTAT: %08x\n", $$seqstat
+ printf " EXCAUSE: 0x%x\t", $$excause
+ if $$excause >= 0x0 && $$excause <= 0xf
+ printf "(custom exception)"
+ end
+ if $$excause == 0x10
+ printf "(single step)"
+ end
+ if $$excause == 0x11
+ printf "(trace buffer full)"
+ end
+ if $$excause == 0x21
+ printf "(undef inst)"
+ end
+ if $$excause == 0x22
+ printf "(illegal inst)"
+ end
+ if $$excause == 0x23
+ printf "(dcplb prot violation)"
+ end
+ if $$excause == 0x24
+ printf "(misaligned data)"
+ end
+ if $$excause == 0x25
+ printf "(unrecoverable event)"
+ end
+ if $$excause == 0x26
+ printf "(dcplb miss)"
+ end
+ if $$excause == 0x27
+ printf "(multiple dcplb hit)"
+ end
+ if $$excause == 0x28
+ printf "(emulation watchpoint)"
+ end
+ if $$excause == 0x2a
+ printf "(misaligned inst)"
+ end
+ if $$excause == 0x2b
+ printf "(icplb prot violation)"
+ end
+ if $$excause == 0x2c
+ printf "(icplb miss)"
+ end
+ if $$excause == 0x2d
+ printf "(multiple icplb hit)"
+ end
+ if $$excause == 0x2e
+ printf "(illegal use of supervisor resource)"
+ end
+ printf "\n"
+ printf " SFTRESET: 0x%x\t(last reset was ", $$sftreset
+ if $$sftreset == 0
+ printf "not "
+ end
+ printf "a software reset)\n"
+ printf " HWERRCAUSE: 0x%x\t", $$hwerrcause
+ if $$hwerrcause == 0x2
+ printf "(system mmr error)"
+ end
+ if $$hwerrcause == 0x3
+ printf "(external memory addressing error)"
+ end
+ if $$hwerrcause == 0x12
+ printf "(performance monitor overflow)"
+ end
+ if $$hwerrcause == 0x18
+ printf "(raise 5 instruction)"
+ end
+ printf "\n"
+end
+document seqstat
+Usage: seqstat [value=$seqstat]
+Parse the bits of the seqstat [value] into the human readable definitions.
+end
+
+define reset
+ if $argc == 0
+ set $$l1 = 0xffa00000
+ else
+ set $$l1 = $arg0
+ end
+ set $$pc = $$l1
+
+ # SSYNC
+ set *(unsigned short *)($$l1) = 0x0024
+ set $$l1 += 2
+
+ # P2.H = 0xffc0
+ set *(unsigned long *)($$l1) = 0xffc0e14a
+ set $$l1 += 4
+
+ # P2.L = 0x100
+ set *(unsigned long *)($$l1) = 0x0100e10a
+ set $$l1 += 4
+
+ # R0 = 0x7 (X)
+ set *(unsigned short *)($$l1) = 0x6038
+ set $$l1 += 2
+
+ # [P2] = R0
+ set *(unsigned short *)($$l1) = 0x9310
+ set $$l1 += 2
+
+ # SSYNC
+ set *(unsigned short *)($$l1) = 0x0024
+ set $$l1 += 2
+
+ # R0 = 0x0 (X)
+ set *(unsigned short *)($$l1) = 0x6000
+ set $$l1 += 2
+
+ # [P2] = R0
+ set *(unsigned short *)($$l1) = 0x9310
+ set $$l1 += 2
+
+ # SSYNC
+ set *(unsigned short *)($$l1) = 0x0024
+ set $$l1 += 2
+
+ # RAISE 0x1
+ set *(unsigned short *)($$l1) = 0x0091
+ set $$l1 += 2
+
+ # JUMP.S -0x18
+ if ($$l1 - $$pc) != 0x18
+ echo ERROR: jump.s has wrong offset
+ else
+ set $pc == $$pc
+ end
+ set *(unsigned short *)($$l1) = 0x2ff4
+ set $$l1 += 2
+
+ printf "Continuing.\n"
+ continue
+end
+document reset
+Usage: reset [L1 Instruction address=0xffa00000]
+Cram the software reset code into [L1 Instruction address] and execute it.
+This will perform both a system reset and a core reset.
+end
+
+define hwtrace_on
+ set $$TBUFCTL = (unsigned long *)0xFFE06000
+ set *$$TBUFCTL = 0x3
+end
+define hwtrace_off
+ set $$TBUFCTL = (unsigned long *)0xFFE06000
+ set *$$TBUFCTL = 0x1
+end
+define hwtrace
+ set $$TBUFSTAT = (unsigned long *)0xFFE06004
+ set $$TBUF = (unsigned long *)0xFFE06100
+ set $$i = 0
+ if (!(*$$TBUFSTAT & 0x1F))
+ printf "Hardware trace buffer is empty\n"
+ end
+ while (*$$TBUFSTAT & 0x1F)
+ printf "%2i Target: ", $$i
+ output/a *$$TBUF
+ printf "\n"
+ printf " Source: "
+ output/a *$$TBUF
+ printf "\n"
+ set $$i++
+ end
+end
+document hwtrace
+Usage: hwtrace
+Dump the hardware trace buffer. Remember, this is a destructive operation,
+so it can only be dumped once.
+end
+
+define show_clocks
+ printf "PLL_LOCKCNT: 0x%04x\n", *(unsigned short *)0xFFC00010
+ printf "VR_CTL: 0x%04x\n", *(unsigned short *)0xFFC00008
+ printf "PLL_DIV: 0x%04x\n", *(unsigned short *)0xFFC00004
+ printf "PLL_CTL: 0x%04x\n", *(unsigned short *)0xFFC00000
+end
+
+define show_sdram
+ printf "SDRRC: 0x%04x\n", *(unsigned short *)0xFFC00A18
+
+ set $$SDBCTL = *(unsigned short *)0xFFC00A14
+ set $$EBCAW = ($$SDBCTL & 0x30) >> 4
+ set $$EBSZ = ($$SDBCTL & 0xe) >> 1
+ printf "SDBCTL: 0x%04x ", $$SDBCTL
+ if ($$SDBCTL & 0x1)
+ printf "(enabled) "
+ else
+ printf "(disabled) "
+ end
+ if $$EBCAW == 0x0
+ printf "(8-bit) "
+ end
+ if $$EBCAW == 0x1
+ printf "(9-bit) "
+ end
+ if $$EBCAW == 0x2
+ printf "(10-bit) "
+ end
+ if $$EBCAW == 0x3
+ printf "(11-bit) "
+ end
+ if $$EBSZ == 0x0
+ printf "(16MB)"
+ end
+ if $$EBSZ == 0x1
+ printf "(32MB)"
+ end
+ if $$EBSZ == 0x2
+ printf "(64MB)"
+ end
+ if $$EBSZ == 0x3
+ printf "(128MB)"
+ end
+ if $$EBSZ == 0x4
+ printf "(256MB)"
+ end
+ if $$EBSZ == 0x5
+ printf "(512MB)"
+ end
+ printf "\n"
+
+ set $$SDSTAT = *(unsigned short *)0xFFC00A1C
+ printf "SDSTAT: 0x%04x ", $$SDSTAT
+ if ($$SDSTAT & (1 << 0))
+ printf "(idle) "
+ else
+ printf "(busy) "
+ end
+ if ($$SDSTAT & (1 << 1))
+ printf "(self-refresh) "
+ end
+ if ($$SDSTAT & (1 << 2))
+ printf "(powerup) "
+ end
+ if ($$SDSTAT & (1 << 3))
+ printf "(will power up) "
+ end
+ if ($$SDSTAT & (1 << 4))
+ printf "(EAB error) "
+ end
+ printf "\n"
+
+ printf "SDGCTL: 0x%08x\n", *(unsigned long *)0xFFC00A10
+end
+
+define show_ddr
+ printf "DDRCTL0: 0x%08x\n", *(unsigned long *)0xFFC00A20
+ printf "DDRCTL1: 0x%08x\n", *(unsigned long *)0xFFC00A24
+ printf "DDRCTL2: 0x%08x\n", *(unsigned long *)0xFFC00A28
+ printf "DDRCTL3: 0x%08x\n", *(unsigned long *)0xFFC00A2C
+ printf "DDRQUE: 0x%08x\n", *(unsigned long *)0xFFC00A30
+ printf "ERRADD: "
+ output/a *(unsigned long *)0xFFC00A34
+ printf "\n"
+
+ set $$ERRMST = *(unsigned short *)0xFFC00A38
+ printf "ERRMST: 0x%04x ( ", $$ERRMST
+ if ($$ERRMST & (1 << 7))
+ printf "core_merror "
+ end
+ if ($$ERRMST & (1 << 6))
+ printf "deb2_merror "
+ end
+ if ($$ERRMST & (1 << 5))
+ printf "deb1_merror "
+ end
+ if ($$ERRMST & (1 << 4))
+ printf "deb0_merror "
+ end
+ if ($$ERRMST & (1 << 3))
+ printf "core_error "
+ end
+ if ($$ERRMST & (1 << 2))
+ printf "deb2_error "
+ end
+ if ($$ERRMST & (1 << 1))
+ printf "deb1_error "
+ end
+ if ($$ERRMST & (1 << 0))
+ printf "deb0_error "
+ end
+ printf ")\n"
+
+ set $$RSTCTL = *(unsigned short *)0xFFC00A3C
+ printf "RSTCTL: 0x%04x ( ", $$RSTCTL
+ if ($$RSTCTL & (1 << 4))
+ printf "srack "
+ end
+ if ($$RSTCTL & (1 << 3))
+ printf "srreq "
+ end
+ if (!($$RSTCTL & (1 << 1)))
+ printf "!!! ERROR: bit 1 needs to be 1, but it is 0 !!! "
+ end
+ if ($$RSTCTL & (1 << 0))
+ printf "ddr_sreset "
+ end
+ printf ")\n"
+end
+
+define show_ebiu
+ printf "EBIU_AMGCTL: 0x%04x\n", *(unsigned short *)0xFFC00A00
+ printf "EBIU_AMBCTL0: 0x%08x\n", *(unsigned long *)0xFFC00A04
+ printf "EBIU_AMBCTL1: 0x%08x\n", *(unsigned long *)0xFFC00A08
+ printf "EBIU_MBSCTL: 0x%08x\n", *(unsigned long *)0xFFC00A0C
+
+ set $$EBIU_ARBSTAT = *(unsigned long *)0xFFC00A10
+ printf "EBIU_ARBSTAT: 0x%08x ( ", $$EBIU_ARBSTAT
+ if ($$EBIU_ARBSTAT & (1 << 1))
+ printf "bgstat "
+ end
+ if ($$EBIU_ARBSTAT & (1 << 0))
+ printf "arbstat "
+ end
+ printf ")\n"
+
+ printf "EBIU_MODE: 0x%08x\n", *(unsigned long *)0xFFC00A14
+ printf "EBIU_FCTL: 0x%08x\n", *(unsigned long *)0xFFC00A18
+end
+
+define _show_cec
+ set $$cec = *(unsigned long *)$arg0
+ printf "0x%08x: ", $$cec
+ if ($$cec & (1 << 0))
+ printf "EMU "
+ else
+ printf " "
+ end
+ if ($$cec & (1 << 1))
+ printf "RST "
+ else
+ printf " "
+ end
+ if ($$cec & (1 << 2))
+ printf "NMI "
+ else
+ printf " "
+ end
+ if ($$cec & (1 << 3))
+ printf "EVX "
+ else
+ printf " "
+ end
+ if ($$cec & (1 << 4))
+ printf "GBL "
+ else
+ printf " "
+ end
+ if ($$cec & (1 << 5))
+ printf "HW "
+ else
+ printf " "
+ end
+ if ($$cec & (1 << 6))
+ printf "TMR "
+ else
+ printf " "
+ end
+ set $$ceci = 7
+ while ($$ceci < 16)
+ if ($$cec & (1 << $$ceci))
+ printf "G%i ", $$ceci
+ else
+ printf " "
+ if ($$ceci > 9)
+ printf " "
+ end
+ end
+ set $$ceci = $$ceci + 1
+ end
+ printf "\n"
+end
+define show_cec
+ printf "IMASK: "
+ _show_cec 0xFFE02104
+ printf "IPEND: "
+ _show_cec 0xFFE02108
+ printf "ILAT: "
+ _show_cec 0xFFE0210C
+
+ set $$EVT = 0xFFE02000
+ set $$EVTi = 0
+ while ($$EVTi < 16)
+ printf "EVT%-2i ", $$EVTi
+ output/a *(unsigned long *)($$EVT + $$EVTi * 4)
+ printf "\n"
+ set $$EVTi = $$EVTi + 1
+ end
+end
+
+define _show_cplbs
+ set $$addr = $arg0
+ set $$data = $arg1
+ set $$i = 0
+ while ($$i < 16)
+ set $$data_val = *(unsigned long *)($$data + $$i * 4)
+ printf " 0x%08x 0x%08x ( ", *(unsigned long *)($$addr + $$i * 4), $$data_val
+ if (($$data_val & (0x3 << 16)) == (0x0 << 16))
+ printf "1K "
+ end
+ if (($$data_val & (0x3 << 16)) == (0x1 << 16))
+ printf "4K "
+ end
+ if (($$data_val & (0x3 << 16)) == (0x2 << 16))
+ printf "1M "
+ end
+ if (($$data_val & (0x3 << 16)) == (0x3 << 16))
+ printf "4M "
+ end
+ if ($$data_val & (0x1 << 14))
+ printf "wt "
+ else
+ printf "wb "
+ end
+ if ($$data_val & (0x1 << 7))
+ printf "dirty "
+ end
+ if ($$data_val & (0x1 << 4))
+ printf "supv-wr "
+ end
+ if ($$data_val & (0x1 << 3))
+ printf "user-wr "
+ end
+ if ($$data_val & (0x1 << 2))
+ printf "user-rd "
+ end
+ if ($$data_val & (0x1 << 1))
+ printf "locked "
+ end
+ if ($$data_val & (0x1 << 0))
+ printf "valid "
+ else
+ printf "invalid "
+ end
+ printf ")\n"
+ set $$i = $$i + 1
+ end
+end
+define show_icplbs
+ set $$IMEM_CONTROL = 0xFFE01004
+ printf "ICPLBS (0x%08x)\n", *(unsigned long *)$$IMEM_CONTROL
+ _show_cplbs 0xFFE01100 0xFFE01200
+end
+define show_dcplbs
+ set $$DMEM_CONTROL = 0xFFE00004
+ printf "DCPLBS (0x%08x)\n", *(unsigned long *)$$DMEM_CONTROL
+ _show_cplbs 0xFFE00100 0xFFE00200
+end
+define show_cplbs
+ show_icplbs
+ show_dcplbs
+end
+
+define _show_cplbstatus
+ set $$CPLB_STATUS = *(unsigned long *)$arg0
+ printf " STATUS = 0x%08x ( ", $$CPLB_STATUS
+ if ($$CPLB_STATUS & (1 << 19))
+ printf "illaddr "
+ end
+ if ($$CPLB_STATUS & (1 << 18))
+ printf "dag1 "
+ else
+ printf "dag0 "
+ end
+ if ($$CPLB_STATUS & (1 << 17))
+ printf "super "
+ else
+ printf "user "
+ end
+ if ($$CPLB_STATUS & (1 << 16))
+ printf "write "
+ else
+ printf "read "
+ end
+ set $$i = 15
+ while ($$i >= 0)
+ if ($$CPLB_STATUS & (1 << $$i))
+ printf "%i ", $$i
+ end
+ set $$i--
+ end
+ printf ")\n"
+
+ set $$CPLB_FAULT_ADDR = *(unsigned long *)$arg1
+ printf " FAULT_ADDR = "
+ output/a $$CPLB_FAULT_ADDR
+ printf "\n"
+end
+define show_icplbstatus
+ printf "ICPLB Status\n"
+ _show_cplbstatus 0xFFE01008 0xFFE0100C
+end
+define show_dcplbstatus
+ printf "DCPLB Status\n"
+ _show_cplbstatus 0xFFE00008 0xFFE0000C
+end
+define show_cplbstatus
+ seqstat
+ show_icplbstatus
+ show_dcplbstatus
+end
+
+define safe_regs
+ set $r0 = $r1 = $r2 = $r3 = $r4 = $r5 = $r6 = $r7 = 0xffb00000
+ set $sp = $fp = $usp = $r0 + 0x100
+ set $p0 = $p1 = $p2 = $p3 = $p4 = $p5 = 0xffa00000
+ set $pc = $rets = $reti = $retx = $retn = $p0
+ set $lt0 = $lt1 = $lb0 = $lb1 = 1
+ set $lc0 = $lc1 = 0
+ set $i0 = $i1 = $i2 = $i3 = $r0
+ set $b0 = $b1 = $b2 = $b3 = $r0
+ set $l0 = $l1 = $l2 = $l3 = $r0
+ set $m0 = $m1 = $m2 = $m3 = $r0
+end
+
+define _show_dma
+ set $$DMA_BASE = $arg0
+ set $$NEXT_DESC_PTR = *(unsigned long *) ($$DMA_BASE + 0x00)
+ set $$START_ADDR = *(unsigned long *) ($$DMA_BASE + 0x04)
+ set $$CONFIG = *(unsigned short *) ($$DMA_BASE + 0x08)
+ set $$X_COUNT = *(unsigned short *) ($$DMA_BASE + 0x10)
+ set $$X_MODIFY = *(unsigned short *) ($$DMA_BASE + 0x14)
+ set $$Y_COUNT = *(unsigned short *) ($$DMA_BASE + 0x18)
+ set $$Y_MODIFY = *(unsigned short *) ($$DMA_BASE + 0x1C)
+ set $$CURR_DESC_PTR = *(unsigned long *) ($$DMA_BASE + 0x20)
+ set $$CURR_ADDR = *(unsigned long *) ($$DMA_BASE + 0x24)
+ set $$IRQ_STATUS = *(unsigned short *) ($$DMA_BASE + 0x28)
+ set $$CURR_X_COUNT = *(unsigned short *) ($$DMA_BASE + 0x30)
+ set $$CURR_Y_COUNT = *(unsigned short *) ($$DMA_BASE + 0x38)
+ printf "desc: curr: 0x%08x next: 0x%08x\n", $$CURR_DESC_PTR, $$NEXT_DESC_PTR
+ printf "addr: curr: 0x%08x start: 0x%08x\n", $$CURR_ADDR, $$START_ADDR
+ printf "X: curr: 0x%04x count: 0x%04x mod: 0x%04x (%i)\n", $$CURR_X_COUNT, $$X_COUNT, $$X_MODIFY, (short)$$X_MODIFY
+ printf "Y: curr: 0x%04x count: 0x%04x mod: 0x%04x (%i)\n", $$CURR_Y_COUNT, $$Y_COUNT, $$Y_MODIFY, (short)$$Y_MODIFY
+ printf "dma config: 0x%04x (", $$CONFIG
+ if ($$CONFIG & (1 << 0))
+ printf "enabled "
+ else
+ printf "disabled "
+ end
+ if ($$CONFIG & (0x1 << 1))
+ printf "write "
+ else
+ printf "read "
+ end
+ set $$WDSIZE = ($$CONFIG & (0x3 << 2)) >> 2
+ if ($$WDSIZE == 0x3)
+ printf "WDSIZE:INVALID "
+ end
+ if ($$WDSIZE == 0x2)
+ printf "32-bit "
+ end
+ if ($$WDSIZE == 0x1)
+ printf "16-bit "
+ end
+ if ($$WDSIZE == 0x0)
+ printf "8-bit "
+ end
+ if ($$CONFIG & (0x1 << 4))
+ printf "2D "
+ else
+ printf "1D "
+ end
+ if ($$CONFIG & (0x1 << 5))
+ printf "sync "
+ end
+ if ($$CONFIG & (0x1 << 6))
+ printf "di_sel "
+ end
+ if ($$CONFIG & (0x1 << 7))
+ printf "interrupt "
+ end
+ set $$NDSIZE = ($$CONFIG & (0xF << 8)) >> 8
+ if ($$NDSIZE > 0 && $$NDSIZE < 10)
+ printf "NDSIZE_%i ", $$NDSIZE
+ end
+ if ($$NDSIZE >= 10)
+ printf "NDSIZE:INVALID:%i ", $$NDSIZE
+ end
+ set $$FLOW = ($$CONFIG & (0x7 << 12)) >> 12
+ if ($$FLOW == 0)
+ printf "stop"
+ else
+ if ($$FLOW == 1)
+ printf "autobuffer"
+ else
+ if ($$FLOW == 4)
+ printf "descriptor_array"
+ else
+ if ($$FLOW == 6)
+ printf "descriptor_list_small"
+ else
+ if ($$FLOW == 7)
+ printf "descriptor_list_large"
+ else
+ printf "FLOW:INVALID:%i", $$FLOW
+ end
+ end
+ end
+ end
+ end
+ printf ")\n"
+ printf "irq status: 0x%04x (", $$IRQ_STATUS
+ if ($$IRQ_STATUS & (0x1 << 0))
+ printf "done "
+ end
+ if ($$IRQ_STATUS & (0x1 << 1))
+ printf "err "
+ end
+ if ($$IRQ_STATUS & (0x1 << 2))
+ printf "dfetch "
+ end
+ if ($$IRQ_STATUS & (0x1 << 3))
+ printf "run "
+ end
+ printf ")\n"
+end
+
+define show_ctimer
+ set $$CTIMER = 0xFFE03000
+ set $$TCNTL = *(unsigned long *) ($$CTIMER + 0x0)
+ set $$TPERIOD = *(unsigned long *) ($$CTIMER + 0x4)
+ set $$TSCALE = *(unsigned long *) ($$CTIMER + 0x8)
+ set $$TCOUNT = *(unsigned long *) ($$CTIMER + 0xC)
+ printf "TCNTL: %#x ( ", $$TCNTL
+ if ($$TCNTL & (1 << 0))
+ printf "power "
+ end
+ if ($$TCNTL & (1 << 1))
+ printf "enable "
+ end
+ if ($$TCNTL & (1 << 2))
+ printf "autoreload "
+ end
+ if ($$TCNTL & (1 << 3))
+ printf "int-enabled "
+ end
+ printf ")\n"
+ printf "TPERIOD: %#x\n", $$TPERIOD
+ printf "TSCALE: %#x\n", $$TSCALE
+ printf "TCOUNT: %#x\n", $$TCOUNT
+end
+
+define show_spi
+ if $argc > 0
+ set $$SPI_BASE = $arg0
+ else
+ set $$SPI_BASE = 0xFFC00500
+ end
+ set $$SPI_BAUD = *(unsigned short *) ($$SPI_BASE + 0x14)
+ set $$SPI_CTL = *(unsigned short *) ($$SPI_BASE + 0x00)
+ set $$SPI_FLG = *(unsigned short *) ($$SPI_BASE + 0x04)
+ set $$SPI_STAT = *(unsigned short *) ($$SPI_BASE + 0x08)
+ set $$SPI_TDBR = *(unsigned short *) ($$SPI_BASE + 0x0C)
+ set $$SPI_RDBR = *(unsigned short *) ($$SPI_BASE + 0x10)
+ set $$SPI_SHAD = *(unsigned short *) ($$SPI_BASE + 0x18)
+ printf "BAUD: %04x (%i)\n", $$SPI_BAUD, $$SPI_BAUD
+ printf "CTL: %04x (", $$SPI_CTL
+ set $$TIMOD = $$SPI_CTL & 0x3
+ printf "timod:%i ", $$TIMOD
+ if ($$SPI_CTL & (1 << 2))
+ printf "sz "
+ end
+ if ($$SPI_CTL & (1 << 3))
+ printf "gm "
+ end
+ if ($$SPI_CTL & (1 << 4))
+ printf "psse "
+ end
+ if ($$SPI_CTL & (1 << 5))
+ printf "emiso "
+ end
+ if ($$SPI_CTL & (1 << 8))
+ printf "16bit "
+ else
+ printf "8bit "
+ end
+ if ($$SPI_CTL & (1 << 9))
+ printf "lsbf "
+ end
+ if ($$SPI_CTL & (1 << 10))
+ printf "cpol "
+ end
+ if ($$SPI_CTL & (1 << 11))
+ printf "cpha "
+ end
+ if ($$SPI_CTL & (1 << 12))
+ printf "mstr "
+ else
+ printf "slave "
+ end
+ if ($$SPI_CTL & (1 << 13))
+ printf "wom "
+ end
+ if ($$SPI_CTL & (1 << 14))
+ printf "enabled"
+ else
+ printf "disabled"
+ end
+ printf ")\n"
+ printf "STAT: %04x (", $$SPI_STAT
+ if ($$SPI_STAT & (1 << 0))
+ printf "spif "
+ end
+ if ($$SPI_STAT & (1 << 1))
+ printf "modf "
+ end
+ if ($$SPI_STAT & (1 << 2))
+ printf "txe "
+ end
+ if ($$SPI_STAT & (1 << 3))
+ printf "txs "
+ end
+ if ($$SPI_STAT & (1 << 4))
+ printf "rbsy "
+ end
+ if ($$SPI_STAT & (1 << 5))
+ printf "rxs "
+ end
+ if ($$SPI_STAT & (1 << 6))
+ printf "txcol "
+ end
+ printf ")\n"
+ printf "FLG: %04x\n", $$SPI_FLG
+ printf "TDBR: %04x RDBR: %04x\n", $$SPI_TDBR, $$SPI_SHAD
+end
+
+define show_uart_lcr
+ set $$LCR = $arg0
+ printf "LCR: 0x%02x ( ", $$LCR
+ set $$WLS = $$LCR & 0x3
+ if ($$WLS == 0)
+ printf "5-bit "
+ end
+ if ($$WLS == 1)
+ printf "6-bit "
+ end
+ if ($$WLS == 2)
+ printf "7-bit "
+ end
+ if ($$WLS == 3)
+ printf "8-bit "
+ end
+ if ($$LCR & (1 << 2))
+ printf "stb "
+ end
+ if ($$LCR & (1 << 3))
+ printf "pen "
+ end
+ if ($$LCR & (1 << 4))
+ printf "eps "
+ end
+ if ($$LCR & (1 << 5))
+ printf "stp "
+ end
+ if ($$LCR & (1 << 6))
+ printf "sb "
+ end
+ printf ")\n"
+end
+
+define show_uart_lsr
+ set $$LSR = $arg0
+ printf "LSR: 0x%02x ( ", $$LSR
+ if ($$LSR & (1 << 0))
+ printf "dr "
+ end
+ if ($$LSR & (1 << 1))
+ printf "oe "
+ end
+ if ($$LSR & (1 << 2))
+ printf "pe "
+ end
+ if ($$LSR & (1 << 3))
+ printf "fe "
+ end
+ if ($$LSR & (1 << 4))
+ printf "bi "
+ end
+ if ($$LSR & (1 << 5))
+ printf "thre "
+ end
+ if ($$LSR & (1 << 6))
+ printf "temt "
+ end
+ if ($$LSR & (1 << 7))
+ printf "tfi "
+ end
+ printf ")\n"
+end
+
+define show_uart_ier
+ set $$IER = $arg0
+ printf "IER: 0x%02x ( ", $$IER
+ if ($$IER & (1 << 0))
+ printf "erbfi "
+ end
+ if ($$IER & (1 << 1))
+ printf "etbei "
+ end
+ if ($$IER & (1 << 2))
+ printf "elsi "
+ end
+ if ($$IER & (1 << 3))
+ printf "edssi "
+ end
+ if ($$IER & (1 << 4))
+ printf "edtpti "
+ end
+ if ($$IER & (1 << 5))
+ printf "etfi "
+ end
+ if ($$IER & (1 << 6))
+ printf "erfci "
+ end
+ printf ")\n"
+end
+
+define show_uart_mcr
+ set $$MCR = $arg0
+ printf "MCR: 0x%02x ( ", $$MCR
+ if ($$MCR & (1 << 0))
+ printf "xoff "
+ end
+ if ($$MCR & (1 << 1))
+ printf "mrts "
+ end
+ if ($$MCR & (1 << 2))
+ printf "rfit "
+ end
+ if ($$MCR & (1 << 3))
+ printf "rfrt "
+ end
+ if ($$MCR & (1 << 4))
+ printf "loop_ena "
+ end
+ if ($$MCR & (1 << 5))
+ printf "fcpol "
+ end
+ if ($$MCR & (1 << 6))
+ printf "arts "
+ end
+ if ($$MCR & (1 << 7))
+ printf "acts "
+ end
+ printf ")\n"
+end
+
+define show_uart_msr
+ set $$MSR = $arg0
+ printf "MSR: 0x%02x ( ", $$MSR
+ if ($$MSR & (1 << 0))
+ printf "scts "
+ end
+ if ($$MSR & (1 << 4))
+ printf "cts "
+ end
+ if ($$MSR & (1 << 5))
+ printf "rfcs "
+ end
+ printf ")\n"
+end
+
+define show_uart_gctl
+ set $$GCTL = $arg0
+ printf "GCTL: 0x%02x ( ", $$GCTL
+ if ($$GCTL & (1 << 0))
+ printf "ucen "
+ end
+ if ($$GCTL & (1 << 1))
+ printf "iren "
+ end
+ if ($$GCTL & (1 << 2))
+ printf "tpolc "
+ end
+ if ($$GCTL & (1 << 3))
+ printf "rpolc "
+ end
+ if ($$GCTL & (1 << 4))
+ printf "fpe "
+ end
+ if ($$GCTL & (1 << 5))
+ printf "ffe "
+ end
+ if ($$GCTL & (1 << 6))
+ printf "edbo "
+ end
+ if ($$GCTL & (1 << 7))
+ printf "eglsi "
+ end
+ printf ")\n"
+end
+
+define show_uart
+ if $argc > 0
+ set $$UART_BASE = $arg0
+ else
+ set $$UART_BASE = 0xffc00400
+ end
+ set $$UART_DLL = (unsigned short *) ($$UART_BASE + 0x00)
+ set $$UART_RBR = (unsigned short *) ($$UART_BASE + 0x00)
+ set $$UART_DLH = (unsigned short *) ($$UART_BASE + 0x04)
+ set $$UART_IER = (unsigned short *) ($$UART_BASE + 0x04)
+ set $$UART_IIR = (unsigned short *) ($$UART_BASE + 0x08)
+ set $$UART_LCR = (unsigned short *) ($$UART_BASE + 0x0C)
+ set $$UART_MCR = (unsigned short *) ($$UART_BASE + 0x10)
+ set $$UART_LSR = (unsigned short *) ($$UART_BASE + 0x14)
+ set $$UART_MSR = (unsigned short *) ($$UART_BASE + 0x18)
+ set $$UART_SCR = (unsigned short *) ($$UART_BASE + 0x1C)
+ set $$UART_GCTL = (unsigned short *) ($$UART_BASE + 0x24)
+
+ set $$DLAB = (1 << 7)
+ set $$LCR = *$$UART_LCR
+ set *$$UART_LCR = ($$LCR | $$DLAB)
+ printf "DLL: 0x%02x DLH: 0x%02x\n", *$$UART_DLL, *$$UART_DLH
+ set *$$UART_LCR = $$LCR & ~$$DLAB
+ printf "RBR: 0x%02x SCR: 0x%02x\n", *$$UART_RBR, *$$UART_SCR
+ set *$$UART_LCR = $$LCR
+
+ printf "IIR: 0x%02x ", *$$UART_IIR
+ show_uart_ier *$$UART_IER
+ show_uart_lcr $$LCR
+ show_uart_mcr *$$UART_MCR
+ show_uart_lsr *$$UART_LSR
+ show_uart_msr *$$UART_MSR
+ show_uart_gctl *$$UART_GCTL
+end
+
+define show_uart2
+ if $argc > 0
+ set $$UART_BASE = $arg0
+ else
+ set $$UART_BASE = 0xffc00400
+ end
+ set $$UART_DLL = (unsigned short *) ($$UART_BASE + 0x00)
+ set $$UART_DLH = (unsigned short *) ($$UART_BASE + 0x04)
+ set $$UART_GCTL = (unsigned short *) ($$UART_BASE + 0x08)
+ set $$UART_LCR = (unsigned short *) ($$UART_BASE + 0x0C)
+ set $$UART_MCR = (unsigned short *) ($$UART_BASE + 0x10)
+ set $$UART_LSR = (unsigned short *) ($$UART_BASE + 0x14)
+ set $$UART_MSR = (unsigned short *) ($$UART_BASE + 0x18)
+ set $$UART_SCR = (unsigned short *) ($$UART_BASE + 0x1C)
+ set $$UART_IER = (unsigned short *) ($$UART_BASE + 0x20)
+ set $$UART_RBR = (unsigned short *) ($$UART_BASE + 0x2C)
+
+ printf "DLL: 0x%02x DLH: 0x%02x\n", *$$UART_DLL, *$$UART_DLH
+ printf "RBR: 0x%02x SCR: 0x%02x\n", *$$UART_RBR, *$$UART_SCR
+
+ printf " "
+ show_uart_ier *$$UART_IER
+ show_uart_lcr *$$UART_LCR
+ show_uart_mcr *$$UART_MCR
+ show_uart_lsr *$$UART_LSR
+ show_uart_msr *$$UART_MSR
+ show_uart_gctl *$$UART_GCTL
+end
+
+define show_uart4
+ if $argc > 0
+ set $$UART_BASE = $arg0
+ else
+ set $$UART_BASE = 0xffc02000
+ end
+ set $$UART_REVID = (unsigned long *) ($$UART_BASE + 0x00)
+ set $$UART_CTL = (unsigned long *) ($$UART_BASE + 0x04)
+ set $$UART_STAT = (unsigned long *) ($$UART_BASE + 0x08)
+ set $$UART_SCR = (unsigned long *) ($$UART_BASE + 0x0C)
+ set $$UART_CLK = (unsigned long *) ($$UART_BASE + 0x10)
+ set $$UART_IMASK = (unsigned long *) ($$UART_BASE + 0x14)
+ set $$UART_RBR = (unsigned long *) ($$UART_BASE + 0x20)
+ set $$UART_THR = (unsigned long *) ($$UART_BASE + 0x24)
+ set $$UART_TAIP = (unsigned long *) ($$UART_BASE + 0x28)
+ set $$UART_TSR = (unsigned long *) ($$UART_BASE + 0x2C)
+ set $$UART_RSR = (unsigned long *) ($$UART_BASE + 0x30)
+ set $$UART_TXCNT = (unsigned long *) ($$UART_BASE + 0x34)
+ set $$UART_RXCNT = (unsigned long *) ($$UART_BASE + 0x38)
+
+ printf "REVID: 0x%08x SCR: 0x%08x\n", *$$UART_REVID, *$$UART_SCR
+ printf " CLK: 0x%08x TAIP: 0x%08x\n", *$$UART_CLK, *$$UART_TAIP
+
+ set $$CTL = *$$UART_CTL
+ printf " CTL: 0x%08x ( ", $$CTL
+ if ($$CTL & (1 << 0))
+ printf "uen "
+ end
+ if ($$CTL & (1 << 1))
+ printf "loop_ena "
+ end
+ set $$UMOD = ($$CTL & (3 << 4)) >> 4
+ printf "mode:"
+ if ($$UMOD == 0)
+ printf "uart "
+ end
+ if ($$UMOD == 1)
+ printf "mdb "
+ end
+ if ($$UMOD == 2)
+ printf "irda "
+ end
+ if ($$UMOD == 3)
+ printf "reserved "
+ end
+ set $$WLS = ($$CTL & (3 << 8)) >> 8
+ printf "wls:"
+ if ($$WLS == 0)
+ printf "5"
+ end
+ if ($$WLS == 1)
+ printf "6 "
+ end
+ if ($$WLS == 2)
+ printf "7 "
+ end
+ if ($$WLS == 3)
+ printf "8 "
+ end
+ if ($$CTL & (1 << 12))
+ printf "stb "
+ end
+ if ($$CTL & (1 << 13))
+ printf "stbh "
+ end
+ if ($$CTL & (1 << 14))
+ printf "pen "
+ end
+ if ($$CTL & (1 << 15))
+ printf "eps "
+ end
+ if ($$CTL & (1 << 16))
+ printf "stp "
+ end
+ if ($$CTL & (1 << 17))
+ printf "fpe "
+ end
+ if ($$CTL & (1 << 18))
+ printf "ffe "
+ end
+ if ($$CTL & (1 << 19))
+ printf "sb "
+ end
+ if ($$CTL & (1 << 22))
+ printf "fcpol "
+ end
+ if ($$CTL & (1 << 23))
+ printf "rpolc "
+ end
+ if ($$CTL & (1 << 24))
+ printf "tpolc "
+ end
+ if ($$CTL & (1 << 25))
+ printf "mrts "
+ end
+ if ($$CTL & (1 << 26))
+ printf "xoff "
+ end
+ if ($$CTL & (1 << 27))
+ printf "arts "
+ end
+ if ($$CTL & (1 << 28))
+ printf "acts "
+ end
+ if ($$CTL & (1 << 29))
+ printf "rfit "
+ end
+ if ($$CTL & (1 << 30))
+ printf "rfrt "
+ end
+ printf ")\n"
+
+ set $$STAT = *$$UART_STAT
+ printf " STAT: 0x%08x ( ", $$STAT
+ if ($$STAT & (1 << 0))
+ printf "dr "
+ end
+ if ($$STAT & (1 << 1))
+ printf "oe "
+ end
+ if ($$STAT & (1 << 2))
+ printf "pe "
+ end
+ if ($$STAT & (1 << 3))
+ printf "fe "
+ end
+ if ($$STAT & (1 << 4))
+ printf "bi "
+ end
+ if ($$STAT & (1 << 5))
+ printf "thre "
+ end
+ if ($$STAT & (1 << 7))
+ printf "temt "
+ end
+ if ($$STAT & (1 << 8))
+ printf "tfi "
+ end
+ if ($$STAT & (1 << 9))
+ printf "astky "
+ end
+ if ($$STAT & (1 << 10))
+ printf "addr "
+ end
+ if ($$STAT & (1 << 11))
+ printf "ro "
+ end
+ if ($$STAT & (1 << 12))
+ printf "scts "
+ end
+ if ($$STAT & (1 << 16))
+ printf "cts "
+ end
+ if ($$STAT & (1 << 17))
+ printf "rfcs "
+ end
+ printf ")\n"
+
+ printf "IMASK: 0x%08x\n", *$$UART_IMASK
+ printf " RSR: 0x%04x TSR: 0x%04x\n", *$$UART_RSR, *$$UART_TSR
+ printf " RBR: 0x%02x THR: 0x%02x\n", *$$UART_RBR, *$$UART_THR
+ printf "RXCNT: 0x%02x TXCNT: 0x%02x\n", *$$UART_RXCNT, *$$UART_TXCNT
+end
+
+define _otp_save
+ set $$s_pc = $pc
+ set $$s_r0 = $r0
+ set $$s_r1 = $r1
+ set $$s_r2 = $r2
+ set $$s_mm = (unsigned long *)0xFFB00000
+ set $$s_m0 = $$s_mm[0]
+ set $$s_m1 = $$s_mm[1]
+end
+define _otp_restore
+ set $pc = $$s_pc
+ set $r0 = $$s_r0
+ set $r1 = $$s_r1
+ set $r2 = $$s_r2
+ set $$s_mm[0] = $$s_m0
+ set $$s_mm[1] = $$s_m1
+end
+
+define _otp_read
+ set $pc = 0xef00001a
+ set $r0 = $arg0
+ set $r1 = $arg1
+ set $r2 = 0xFFB00000
+
+end
+define otp_read
+ if $argc == 0
+ set $$OTP_PAGE = 0
+ else
+ set $$OTP_PAGE = $arg0
+ end
+
+ printf "OTP Page 0x%02x: ", $$OTP_PAGE
+ _otp_save
+ _otp_read $$OTP_PAGE, 0
+ _otp_read $$OTP_PAGE, 1
+ _otp_restore
+end
+
+define otp_dump
+ _otp_save
+ set $$page = 0
+ while $$page < 0xe0
+ printf "0x%02x: ", $$page
+ _otp_read $$page, 0
+ printf "%08x %08x ", $$OTP_PAGE_L, $$OTP_PAGE_H
+ _otp_read $$page, 1
+ printf "%08x %08x ", $$OTP_PAGE_L, $$OTP_PAGE_H
+ $$page++
+ end
+ _otp_restore
+end
+
+
+#
+# Provide U-Boot-style functions in gdb
+#
+
+define uboot_jtag_load
+ set remotetimeout 300
+ load init.elf
+ continue
+ load u-boot
+ call memset(&_bss_vma, 0, &_bss_len)
+ continue
+end
--- /dev/null
+#!/usr/bin/python3
+
+import inspect
+import os
+from pathlib import Path
+import sys
+
+import gdb
+
+
+#
+# Load frameworks if available.
+#
+
+if False:
+ PWNDBG = Path('/usr/local/src/pwndbg/gdbinit.py')
+ GDB_DASHBOARD = Path('/usr/local/src/gdb-dashboard/.gdbinit')
+ if PWNDBG.exists():
+ gdb.execute(f'source {PWNDBG}')
+ elif GDB_DASHBOARD.exists():
+ gdb.execute(f'source {GDB_DASHBOARD}')
+
+
+#
+# Random helpers.
+#
+
+TRACE = False
+
+class VapierCommand(gdb.Command):
+ """Base class for my custom commands."""
+
+ CMD_INIT = ()
+ CATCH_INVOKE_ERROR = True
+
+ def __init__(self):
+ gdb.Command.__init__(self, *self.CMD_INIT)
+
+ def invoke(self, arg, from_tty):
+ try:
+ if hasattr(self, 'v_invoke_argv'):
+ argv = gdb.string_to_argv(arg)
+ self.v_invoke_argv(argv, from_tty)
+ else:
+ self.v_invoke(arg, from_tty)
+ except gdb.error as e:
+ if self.CATCH_INVOKE_ERROR:
+ print(e, file=sys.stderr)
+ else:
+ raise
+
+ def v_exec(self, cmd):
+ if TRACE:
+ print(f'+ {cmd}')
+ gdb.execute(cmd)
+
+ def v_parse_int(self, arg):
+ try:
+ return int(arg)
+ except ValueError:
+ pass
+
+ try:
+ return int(arg, 16)
+ except ValueError as e:
+ raise gdb.error(f'Not a decimal or hex integer: {arg}')
+
+
+class VapierTraceCommand(VapierCommand):
+ """Toggle tracing of helpers."""
+
+ CMD_INIT = ('vapier-trace', gdb.COMMAND_SUPPORT)
+
+ def v_invoke(self, arg, from_tty):
+ global TRACE
+ if arg:
+ TRACE = bool(arg)
+ else:
+ TRACE = not TRACE
+ print(f'Tracing of vapier helpers is now {"on" if TRACE else "off"}')
+
+
+class ExitCommand(VapierCommand):
+ """Exit gdb.
+Alias to 'quit'.\
+"""
+ CMD_INIT = ('exit', gdb.COMMAND_SUPPORT)
+
+ def v_invoke(self, arg, from_tty):
+ self.dont_repeat()
+ self.v_exec(f'quit {arg}')
+
+
+class LoadBlackfinCommands(VapierCommand):
+ """Load Blackfin specific commands."""
+
+ BFIN_CONFIG = Path('~/.gdbinit.bfin').expanduser()
+ CMD_INIT = ('blackfin-commands', gdb.COMMAND_SUPPORT)
+
+ def v_invoke(self, arg, from_tty):
+ self.dont_repeat()
+ self.v_exec(f'source {self.BFIN_CONFIG}')
+
+
+class GoCommand(VapierCommand):
+ """A simple goto-like helper.
+Basically an alias to 'jump *<addr>'.\
+"""
+
+ CMD_INIT = ('go', gdb.COMMAND_RUNNING)
+
+ def v_invoke(self, arg, from_tty):
+ self.v_exec(f'jump *{arg}')
+
+
+class DiCommand(VapierCommand):
+
+ CMD_INIT = ('di', gdb.COMMAND_DATA)
+
+ def v_invoke_argv(self, argv, from_tty):
+ self.dont_repeat()
+ if not argv:
+ base = '$pc'
+ elif len(argv) == 1:
+ base = argv[0]
+ else:
+ raise gdb.error('di takes 0 or 1 arguments')
+ self.v_exec(f'disassemble {base} ({base} + 0x40)')
+
+
+class DisCommand(VapierCommand):
+
+ CMD_INIT = ('dis', gdb.COMMAND_DATA)
+
+ def v_invoke_argv(self, argv, from_tty):
+ self.dont_repeat()
+ if not argv:
+ base = '$pc'
+ elif len(argv) == 1:
+ base = argv[0]
+ else:
+ raise gdb.error('dis takes 0 or 1 arguments')
+ self.v_exec(f'disassemble {base},+0x40')
+
+
+class UBootMdCommand(VapierCommand):
+ """Display memory.
+Usage: md <unit type> <address> [count=64]
+Display [count] <unit type> starting at <address>.\
+"""
+
+ CMD_INIT = ('md', gdb.COMMAND_DATA)
+
+ def v_invoke_argv(self, argv, from_tty):
+ self.dont_repeat()
+ if len(argv) == 2:
+ count = 64
+ unit, addr = argv
+ elif len(argv) == 3:
+ unit, addr, count = argv
+ else:
+ raise gdb.error('usage: <unit> <addr> [count]')
+ self.v_exec(f'x/{count}x{unit} {addr}')
+
+
+class UBootMemoryDisplayCommand(VapierCommand):
+ """Display memory.
+Usage: md[cbwlq] <address> [count=64]
+Display [count] <chars|bytes|words|longs|quads> starting at <address>.\
+"""
+
+ UNIT = None
+ RADIX = 16
+
+ def v_invoke_argv(self, argv, from_tty):
+ assert self.UNIT
+ self.dont_repeat()
+
+ if len(argv) == 1:
+ count = 64
+ addr, = argv
+ elif len(argv) == 2:
+ addr, count = argv
+ else:
+ raise gdb.error('usage: <addr> [count]')
+
+ if self.RADIX != 16:
+ self.v_exec(f'set output-radix {self.RADIX}')
+ self.v_exec(f'md {self.UNIT} {addr} {count}')
+ if self.RADIX != 16:
+ self.v_exec(f'set output-radix 16')
+
+class UBootMdb(UBootMemoryDisplayCommand):
+ __doc__ = UBootMemoryDisplayCommand.__doc__
+ CMD_INIT = ('mdb', gdb.COMMAND_DATA)
+ UNIT = 'b'
+
+class UBootMdw(UBootMemoryDisplayCommand):
+ __doc__ = UBootMemoryDisplayCommand.__doc__
+ CMD_INIT = ('mdw', gdb.COMMAND_DATA)
+ UNIT = 'h'
+
+class UBootMdl(UBootMemoryDisplayCommand):
+ __doc__ = UBootMemoryDisplayCommand.__doc__
+ CMD_INIT = ('mdl', gdb.COMMAND_DATA)
+ UNIT = 'w'
+
+class UBootMdq(UBootMemoryDisplayCommand):
+ __doc__ = UBootMemoryDisplayCommand.__doc__
+ CMD_INIT = ('mdq', gdb.COMMAND_DATA)
+ UNIT = 'g'
+
+class UBootMdc(UBootMemoryDisplayCommand):
+ __doc__ = UBootMemoryDisplayCommand.__doc__
+ CMD_INIT = ('mdc', gdb.COMMAND_DATA)
+ UNIT = 'c'
+ RADIX = 10
+
+
+class UBootMemoryWriteCommand(VapierCommand):
+ """Write memory.
+Usage: mw[bwlq] <address> <value> <count>
+Set <count> <bytes|words|longs|quads> at <address> to <value>.\
+"""
+
+ UNIT = None
+
+ def v_invoke_argv(self, argv, from_tty):
+ assert self.UNIT
+ self.dont_repeat()
+
+ if len(argv) == 3:
+ addr, val, count = argv
+ else:
+ raise gdb.error('usage: <addr> <val> <count>')
+ count = self.v_parse_int(count)
+
+ offset = 0
+ while count > 0:
+ self.v_exec(f'set *(({self.UNIT}*){addr} + {offset}) = {val}')
+ offset += 1
+ count -= 1
+
+class UBootMwb(UBootMemoryWriteCommand):
+ __doc__ = UBootMemoryWriteCommand.__doc__
+ CMD_INIT = ('mwb', gdb.COMMAND_DATA)
+ UNIT = 'unsigned char'
+
+class UBootMww(UBootMemoryWriteCommand):
+ __doc__ = UBootMemoryWriteCommand.__doc__
+ CMD_INIT = ('mww', gdb.COMMAND_DATA)
+ UNIT = 'unsigned short'
+
+class UBootMwl(UBootMemoryWriteCommand):
+ __doc__ = UBootMemoryWriteCommand.__doc__
+ CMD_INIT = ('mwl', gdb.COMMAND_DATA)
+ UNIT = 'unsigned int'
+
+class UBootMwq(UBootMemoryWriteCommand):
+ __doc__ = UBootMemoryWriteCommand.__doc__
+ CMD_INIT = ('mwq', gdb.COMMAND_DATA)
+ UNIT = 'unsigned long long'
+
+
+#class UBootCompareCommand(VapierCommand):
+# """Compare memory regions.
+#Usage: cmp[bwlq] <address> <address> <count>
+#Compare <count> <bytes|words|longs|quads> between <address> and <address>.\
+#"""
+#
+# UNIT = None
+#
+# def v_invoke_argv(self, argv, from_tty):
+# assert self.UNIT
+# self.dont_repeat()
+#
+# if len(argv) == 3:
+# addr1, addr2, count = argv
+# else:
+# raise gdb.error('usage: <addr1> <addr2> <count>')
+# count = self.v_parse_int(count)
+#
+# set $$addr1 = $arg0
+# set $$addr2 = $arg1
+# set $$count = $arg2
+# while $$count-- > 0
+# if (*$$addr1 != *$$addr2)
+# printf "Data mismatch at %#x units (@%#x != @%#x)\n", $arg2, $$addr1, $$addr2
+# set $$count = -100
+# end
+# set $$addr1 += 1
+# set $$addr2 += 1
+# end
+# if $$count == -1
+# printf "Data matches for %#x units\n", $arg2
+# end
+#
+#class UBootCmpb(UBootCompareCommand):
+# __doc__ = UBootCompareCommand.__doc__
+# CMD_INIT = ('cmpb', gdb.COMMAND_DATA)
+# UNIT = 'unsigned char'
+#
+#class UBootCmpw(UBootCompareCommand):
+# __doc__ = UBootCompareCommand.__doc__
+# CMD_INIT = ('cmpw', gdb.COMMAND_DATA)
+# UNIT = 'unsigned short'
+#
+#class UBootCmpl(UBootCompareCommand):
+# __doc__ = UBootCompareCommand.__doc__
+# CMD_INIT = ('cmpl', gdb.COMMAND_DATA)
+# UNIT = 'unsigned int'
+#
+#class UBootCmpq(UBootCompareCommand):
+# __doc__ = UBootCompareCommand.__doc__
+# CMD_INIT = ('cmpq', gdb.COMMAND_DATA)
+# UNIT = 'unsigned long long'
+#
+#
+#class UBootCopyCommand(VapierCommand):
+# """Copy memory regions.
+#Usage: cp[bwlq] <src> <dst> <count>
+#Copy <count> <bytes|words|longs|quads> from <src> to <dst>.\
+#"""
+#
+# UNIT = None
+#
+# def v_invoke_argv(self, argv, from_tty):
+# assert self.UNIT
+# self.dont_repeat()
+#
+# if len(argv) == 3:
+# src, dst, count = argv
+# else:
+# raise gdb.error('usage: <addr1> <addr2> <count>')
+# count = self.v_parse_int(count)
+#
+# offset = 0
+# while count > 0:
+# self.v_exec(f'set *(({self.UNIT}*){addr} + {offset}) = {val}')
+# count -= 1
+# offset += 1
+# set *$$dst = *$$src
+# set $$src += 1
+# set $$dst += 1
+# print(f'Copied {argv[2]} units from {addr1} to {addr2}')
+#
+#class UBootCpb(UBootCopyCommand):
+# __doc__ = UBootCopyCommand.__doc__
+# CMD_INIT = ('cpb', gdb.COMMAND_DATA)
+# UNIT = 'unsigned char'
+#
+#class UBootCpw(UBootCopyCommand):
+# __doc__ = UBootCopyCommand.__doc__
+# CMD_INIT = ('cpw', gdb.COMMAND_DATA)
+# UNIT = 'unsigned short'
+#
+#class UBootCpl(UBootCopyCommand):
+# __doc__ = UBootCopyCommand.__doc__
+# CMD_INIT = ('cpl', gdb.COMMAND_DATA)
+# UNIT = 'unsigned int'
+#
+#class UBootCpq(UBootCopyCommand):
+# __doc__ = UBootCopyCommand.__doc__
+# CMD_INIT = ('cpq', gdb.COMMAND_DATA)
+# UNIT = 'unsigned long long'
+
+
+# Probe & load all commands registered.
+for cls in list(globals().values()):
+ if (inspect.isclass(cls) and
+ issubclass(cls, VapierCommand) and
+ cls.CMD_INIT):
+ cls()