| *** 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 |