*** Keywords *** Prepare Machine [Arguments] ${architecture} ${memoryType} Execute Command using sysbus Execute Command mach create "Leon3" Execute Command machine LoadPlatformDescriptionFromString "sysbus: { Endianess: Endianess.BigEndian }" IF "${architecture}" == "Sparc" Execute Command machine LoadPlatformDescriptionFromString "cpu: CPU.Sparc @ sysbus { cpuType: \\"leon3\\" }" ELSE IF "${architecture}" == "PowerPC" Execute Command machine LoadPlatformDescriptionFromString "cpu: CPU.PowerPc @ sysbus { cpuType: \\"e200z6\\" }" ELSE Fail Unknown architecture ${architecture} END Execute Command machine LoadPlatformDescriptionFromString "rom: Memory.MappedMemory @ sysbus 0x0 { size: 0x40000000 }" Execute Command machine LoadPlatformDescriptionFromString "ddr: Memory.${memoryType} @ sysbus 0x40000000 { size: 0x20000000 }" Execute Command cpu PC 0x0 Load Sparc Reader Program # Note that these writes to memory are in the emulation target's endianness (which is big-endian here), NOT the host's. # For example, after `sysbus WriteDoubleWord 0x00000000 0x03100000`, the memory content as a byte array is `[0x03, 0x10, 0x00, 0x00]`. # sethi %hi(0x40000000), %g1 Execute Command sysbus WriteDoubleWord 0x00000000 0x03100000 # or %g1, 0x104, %g1 Execute Command sysbus WriteDoubleWord 0x00000004 0x82106104 # ld [ %g1 ], %g2 Execute Command sysbus WriteDoubleWord 0x00000008 0xc4004000 # b . Execute Command sysbus WriteDoubleWord 0x0000000c 0x10800000 # nop Execute Command sysbus WriteDoubleWord 0x00000010 0x01000000 Load Sparc Writer Program # sethi %hi(0x40000000), %g1 Execute Command sysbus WriteDoubleWord 0x00000000 0x03100000 # or %g1, 0x104, %g1 Execute Command sysbus WriteDoubleWord 0x00000004 0x82106104 # sethi %hi(0x12345400), %g2 Execute Command sysbus WriteDoubleWord 0x00000008 0x05048d15 # or %g2, 0x278, %g2 Execute Command sysbus WriteDoubleWord 0x0000000c 0x8410a278 # st %g2, [ %g1 ] Execute Command sysbus WriteDoubleWord 0x00000010 0xc4204000 # b .-4 # We jump back to the st instruction to be able to test watchpoints multiple times Execute Command sysbus WriteDoubleWord 0x00000014 0x10bfffff # nop Execute Command sysbus WriteDoubleWord 0x00000018 0x01000000 Load PowerPC Reader Program # lis r1, 0x4000 Execute Command sysbus WriteDoubleWord 0x00000000 0x3c204000 # ori r1, r1, 0x104 Execute Command sysbus WriteDoubleWord 0x00000004 0x60210104 # lwz r2, 0(r1) Execute Command sysbus WriteDoubleWord 0x00000008 0x80410000 # b . Execute Command sysbus WriteDoubleWord 0x0000000c 0x48000000 # nop Execute Command sysbus WriteDoubleWord 0x00000010 0x60000000 Load PowerPC Writer Program # lis r1, 0x4000 Execute Command sysbus WriteDoubleWord 0x00000000 0x3c204000 # ori r1, r1, 0x104 Execute Command sysbus WriteDoubleWord 0x00000004 0x60210104 # lis r2, 0x1234 Execute Command sysbus WriteDoubleWord 0x00000008 0x3c401234 # ori r2, r2, 0x5678 Execute Command sysbus WriteDoubleWord 0x0000000c 0x60425678 # stw r2, 0(r1) Execute Command sysbus WriteDoubleWord 0x00000010 0x90410000 # b .-4 Execute Command sysbus WriteDoubleWord 0x00000014 0x4bfffffc # nop Execute Command sysbus WriteDoubleWord 0x00000018 0x60000000 Load Program [Arguments] ${architecture} ${type} Run Keyword Load ${architecture} ${type} Program Memory Should Be Equal [Arguments] ${address} ${value} ${width}=DoubleWord ${res}= Execute Command sysbus Read${width} ${address} Should Be Equal As Numbers ${res} ${value} Should Read Big-Endian Value With Watchpoint [Arguments] ${architecture} ${memoryType} Prepare Machine ${architecture} ${memoryType} Load Program ${architecture} Reader # Target-endian write Execute Command sysbus WriteDoubleWord 0x40000104 0x12345678 # Same page as the value that gets accessed, not same address Execute Command sysbus AddWatchpointHook 0x40000200 4 2 "pass" PC Should Be Equal 0x00000000 Execute Command cpu Step 3 PC Should Be Equal 0x0000000c Register Should Be Equal 2 0x12345678 Should Write Big-Endian Value With Watchpoint [Arguments] ${architecture} ${memoryType} Prepare Machine ${architecture} ${memoryType} Load Program ${architecture} Writer # Same page as the value that gets accessed, not same address Execute Command sysbus AddWatchpointHook 0x40000200 4 2 "pass" PC Should Be Equal 0x00000000 Memory Should Be Equal 0x40000104 0x00000000 Execute Command cpu Step 5 PC Should Be Equal 0x00000014 Memory Should Be Equal 0x40000104 0x12345678 # Also verify that reading parts of the value separately works as expected Memory Should Be Equal 0x40000104 0x1234 Word Memory Should Be Equal 0x40000106 0x5678 Word Memory Should Be Equal 0x40000104 0x12 Byte Write Watchpoint Should See Correct Value [Arguments] ${architecture} ${memoryType} Prepare Machine ${architecture} ${memoryType} Create Log Tester 0 Load Program ${architecture} Writer # Watch the address that gets accessed # Watchpoints see the value as the CPU sees it, so BE here. Execute Command sysbus AddWatchpointHook 0x40000104 4 2 "self.DebugLog('Watchpoint saw ' + hex(value))" Execute Command logLevel 0 PC Should Be Equal 0x00000000 Memory Should Be Equal 0x40000104 0x00000000 Execute Command cpu Step 6 IF "${architecture}" == "Sparc" PC Should Be Equal 0x00000018 ELSE PC Should Be Equal 0x00000010 END Wait For Log Entry Watchpoint saw 0x12345678L Write Watchpoint Should Work Multiple Times [Arguments] ${architecture} ${memoryType} Prepare Machine ${architecture} ${memoryType} Create Log Tester 0 Load Program ${architecture} Writer # Watch the address that gets accessed Execute Command sysbus AddWatchpointHook 0x40000104 4 2 "self.DebugLog('Watchpoint saw ' + hex(value))" Execute Command logLevel 0 PC Should Be Equal 0x00000000 Memory Should Be Equal 0x40000104 0x00000000 Execute Command cpu ExecutionMode Continuous Execute Command start FOR ${i} IN RANGE 32 Wait For Log Entry Watchpoint saw 0x12345678L timeout=1 END Abort Should Work After Watchpoint Hit [Arguments] ${memoryType} Prepare Machine Sparc ${memoryType} Create Log Tester 0 Load Program Sparc Writer # Overwrite branch with illegal instruction Execute Command rom WriteDoubleWord 0x00000014 0xffffffff # Watch the address that gets accessed Execute Command sysbus AddWatchpointHook 0x40000104 4 2 "self.DebugLog('Watchpoint saw ' + hex(value))" Execute Command logLevel 0 PC Should Be Equal 0x00000000 Memory Should Be Equal 0x40000104 0x00000000 Execute Command cpu ExecutionMode Continuous Execute Command start Wait For Log Entry Watchpoint saw 0x12345678L timeout=1 Wait For Log Entry CPU abort [PC=0x14]: Trap 0x02 while interrupts disabled timeout=1 Should Read Big-Endian Value Without Watchpoint [Arguments] ${architecture} Prepare Machine ${architecture} MappedMemory Load Program ${architecture} Reader # Target-endian write Execute Command sysbus WriteDoubleWord 0x40000104 0x12345678 PC Should Be Equal 0x00000000 Execute Command cpu Step 3 PC Should Be Equal 0x0000000c Register Should Be Equal 2 0x12345678 Should Write Big-Endian Value Without Watchpoint [Arguments] ${architecture} Prepare Machine ${architecture} MappedMemory Load Program ${architecture} Writer PC Should Be Equal 0x00000000 Memory Should Be Equal 0x40000104 0x00000000 Execute Command cpu Step 5 PC Should Be Equal 0x00000014 Memory Should Be Equal 0x40000104 0x12345678 *** Test Cases *** Should Read Big-Endian Value Without Watchpoint On Sparc Should Read Big-Endian Value Without Watchpoint Sparc Should Write Big-Endian Value Without Watchpoint On Sparc Should Write Big-Endian Value Without Watchpoint Sparc Should Read Big-Endian Value With Watchpoint On MappedMemory On Sparc Should Read Big-Endian Value With Watchpoint Sparc MappedMemory Should Read Big-Endian Value With Watchpoint On ArrayMemory On Sparc Should Read Big-Endian Value With Watchpoint Sparc ArrayMemory Should Write Big-Endian Value With Watchpoint On MappedMemory On Sparc Should Write Big-Endian Value With Watchpoint Sparc MappedMemory Should Write Big-Endian Value With Watchpoint On ArrayMemory On Sparc Should Write Big-Endian Value With Watchpoint Sparc ArrayMemory Write Watchpoint Should See Correct Value On MappedMemory On Sparc Write Watchpoint Should See Correct Value Sparc MappedMemory Write Watchpoint Should See Correct Value On ArrayMemory On Sparc Write Watchpoint Should See Correct Value Sparc ArrayMemory Write Watchpoint Should Work Multiple Times On MappedMemory On Sparc Write Watchpoint Should Work Multiple Times Sparc MappedMemory Write Watchpoint Should Work Multiple Times On ArrayMemory On Sparc Write Watchpoint Should Work Multiple Times Sparc ArrayMemory Should Read Big-Endian Value With Watchpoint On MappedMemory On PowerPC Should Read Big-Endian Value With Watchpoint PowerPC MappedMemory Should Read Big-Endian Value With Watchpoint On ArrayMemory On PowerPC Should Read Big-Endian Value With Watchpoint PowerPC ArrayMemory Should Write Big-Endian Value With Watchpoint On MappedMemory On PowerPC Should Write Big-Endian Value With Watchpoint PowerPC MappedMemory Should Write Big-Endian Value With Watchpoint On ArrayMemory On PowerPC Should Write Big-Endian Value With Watchpoint PowerPC ArrayMemory Write Watchpoint Should See Correct Value On MappedMemory On PowerPC Write Watchpoint Should See Correct Value PowerPC MappedMemory Write Watchpoint Should See Correct Value On ArrayMemory On PowerPC Write Watchpoint Should See Correct Value PowerPC ArrayMemory Write Watchpoint Should Work Multiple Times On MappedMemory On PowerPC Write Watchpoint Should Work Multiple Times PowerPC MappedMemory Write Watchpoint Should Work Multiple Times On ArrayMemory On PowerPC Write Watchpoint Should Work Multiple Times PowerPC ArrayMemory Abort Should Work After Watchpoint Hit On MappedMemory Abort Should Work After Watchpoint Hit MappedMemory Abort Should Work After Watchpoint Hit On ArrayMemory Abort Should Work After Watchpoint Hit ArrayMemory Watchpoint Should Not Affect Execution On MPC5567 # This is a big-endian PowerPC platform Execute Script ${CURDIR}/../../scripts/single-node/mpc5567.resc Create Terminal Tester sysbus.uart Create Log Tester 0 # This address has been chosen to cause a failure to boot if the presence of the watchpoint # causes an access endianness mismatch Execute Command sysbus AddWatchpointHook 0x40002ccc 4 3 "cpu.WarningLog('Watchpoint hit')" Wait For Prompt On Uart QR5567> pauseEmulation=true Wait For Log Entry Watchpoint hit # Ensure that access translation works as expected for big-endian peripherals by reading the # UART status register, because the MPC5567_UART has ByteToDoubleWord Memory Should Be Equal 0xfffb0008 0xc0000000 Memory Should Be Equal 0xfffb0008 0xc0 Byte Memory Should Be Equal 0xfffb0009 0x00 Byte Memory Should Be Equal 0xfffb000a 0x00 Byte Memory Should Be Equal 0xfffb000b 0x00 Byte Watchpoint Should Not Affect Execution On Microwatt # This is a little-endian PowerPC platform Execute Script ${CURDIR}/../../scripts/single-node/microwatt.resc Create Terminal Tester sysbus.uart Create Log Tester 0 # This address has been chosen to cause a failure to boot if the presence of the watchpoint # causes an access endianness mismatch Execute Command sysbus AddWatchpointHook 0x5fee0 8 3 "cpu.WarningLog('Watchpoint hit')" Wait For Prompt On Uart >>> pauseEmulation=true Wait For Log Entry Watchpoint hit