blob: 7a5962542bf2d109e80bf3e428300b0705a342ff [file] [log] [blame]
*** Variables ***
${bin_out_signature}= ReTrace\x03
${triple_and_model}= riscv32 rv32imacv
*** Keywords ***
Create Machine Versatile
Execute Command using sysbus
Execute Command include @scripts/single-node/versatile.resc
Execute Command cpu PerformanceInMips 1
# the value of quantum is selected here to generate several blocks
# of multiple instructions to check if the execution tracer can
# disassemble blocks correctly
Execute Command emulation SetGlobalQuantum "0.000004"
Create Machine RISC-V 64-bit
[Arguments] ${pc_hex} ${memory_per_cpu}
Execute Command mach create
Execute Command machine LoadPlatformDescriptionFromString "cpu: CPU.RiscV64 @ sysbus { cpuType: \\"rv64imacv\\"; timeProvider: empty }"
IF ${memory_per_cpu}
Execute Command machine LoadPlatformDescriptionFromString "mem: Memory.MappedMemory @ sysbus new Bus.BusPointRegistration { address: ${pc_hex}; cpu: cpu } { size: 0x40000 }"
ELSE
Execute Command machine LoadPlatformDescriptionFromString "mem: Memory.MappedMemory @ sysbus ${pc_hex} { size: 0x40000 }"
END
Execute Command sysbus.cpu PC ${pc_hex}
Create Machine RISC-V 32-bit
[Arguments] ${pc_hex} ${memory_per_cpu}
Execute Command mach create
Execute Command machine LoadPlatformDescriptionFromString "cpu: CPU.RiscV32 @ sysbus { cpuType: \\"rv32imacv\\"; timeProvider: empty }"
IF ${memory_per_cpu}
Execute Command machine LoadPlatformDescriptionFromString "mem: Memory.MappedMemory @ sysbus new Bus.BusPointRegistration { address: ${pc_hex}; cpu: cpu } { size: 0x40000 }"
ELSE
Execute Command machine LoadPlatformDescriptionFromString "mem: Memory.MappedMemory @ sysbus ${pc_hex} { size: 0x40000 }"
END
Trace The Execution On The Versatile Platform
[Arguments] ${trace_format}
Create Machine Versatile
${trace_file}= Allocate Temporary File
Execute Command cpu CreateExecutionTracing "tracer" @${trace_file} ${trace_format}
# exactly the amount of virtual time to execute 16 instructions
Execute Command emulation RunFor "0.000016"
Execute Command cpu DisableExecutionTracing
${output}= Get File ${trace_file}
${output_lines}= Split To Lines ${output}
RETURN ${output_lines}
Run And Trace Simple Program On RISC-V
[Arguments] ${pc_start_hex} ${trace_format} ${is_binary}
${trace_file}= Allocate Temporary File
Execute Command sysbus.cpu CreateExecutionTracing "tracer" "${trace_file}" ${trace_format} ${is_binary}
${pc}= Convert To Integer ${pc_start_hex}
Execute Command sysbus.cpu PC ${pc}
Execute Command sysbus WriteDoubleWord ${pc+0} 0x00000013 cpu # nop
Execute Command sysbus WriteWord ${pc+4} 0x0001 cpu # nop
Execute Command sysbus WriteDoubleWord ${pc+6} 0x00310093 cpu # addi x1, x2, 003
Execute Command sysbus.cpu Step 3
Execute Command sysbus.cpu DisableExecutionTracing
IF ${is_binary}
${output}= Get Binary File ${trace_file}
RETURN ${output}
ELSE
${output}= Get File ${trace_file}
${output_lines}= Split To Lines ${output}
RETURN ${output_lines}
END
Run RISC-V Program With Vcfg Instruction
[Arguments] ${pc_hex}
Execute Command sysbus.cpu MSTATUS 0x600
${pc}= Convert To Integer ${pc_hex}
Execute Command sysbus.cpu PC ${pc}
Execute Command sysbus WriteDoubleWord ${pc+0} 0x00000013 # nop
Execute Command sysbus WriteWord ${pc+4} 0x0001 # nop
Execute Command sysbus WriteDoubleWord ${pc+6} 0x04007057 # vsetvli zero, zero, e8, m1, ta, mu
Execute Command sysbus.cpu Step 3
Run RISC-V Program With Memory Access
[Arguments] ${pc_hex}
${pc}= Convert To Integer ${pc_hex}
Execute Command sysbus.cpu PC ${pc}
Execute Command sysbus WriteDoubleWord ${pc+0} 0x305B7 cpu # lui a1, 48
Execute Command sysbus WriteWord ${pc+4} 0xe537 cpu # lui a0, 14
Execute Command sysbus WriteDoubleWord ${pc+8} 0xb52023 cpu # sw a1, 0(a0)
Execute Command sysbus.cpu Step 3
Should Be Equal As Bytes
[Arguments] ${bytes} ${str}
${str_bytes} Convert To Bytes ${str}
Should Be Equal ${bytes} ${str_bytes} formatter=repr
Should Dump 64-bit PCs On RISC-V
[Arguments] ${memory_per_cpu}
Create Machine RISC-V 64-bit 0x2000000000 ${memory_per_cpu}
${pcs}= Run And Trace Simple Program On RISC-V 0x2000000000 PC False
Should Contain ${pcs}[0] 0x2000000000
Should Contain ${pcs}[1] 0x2000000004
Should Contain ${pcs}[2] 0x2000000006
Should Dump Disassembly On RISC-V
[Arguments] ${memory_per_cpu}
Create Machine RISC-V 32-bit 0x2000 ${memory_per_cpu}
${trace}= Run And Trace Simple Program On RISC-V 0x2000 Disassembly False
Should Contain ${trace}[0] nop
Should Contain ${trace}[1] nop
Should Contain ${trace}[2] addi
Should Be Able To Add Memory Accesses To The Trace On RISC-V
[Arguments] ${memory_per_cpu}
Create Machine RISC-V 32-bit 0x2000 ${memory_per_cpu}
${trace_filepath}= Allocate Temporary File
Execute Command sysbus.cpu CreateExecutionTracing "tracer" "${trace_filepath}" Disassembly
Execute Command tracer TrackMemoryAccesses
Run RISC-V Program With Memory Access 0x2000
Execute Command sysbus.cpu DisableExecutionTracing
${output_file}= Get File ${trace_filepath}
${output_lines}= Split To Lines ${output_file}
Should Contain ${output_lines}[0] lui a1, 48
Should Contain ${output_lines}[1] lui a0, 14
Should Contain ${output_lines}[2] sw a1, 0(a0)
Should Contain ${output_lines}[3] MemoryWrite with address 0xE000
Should Be Able To Add Memory Accesses To The Trace In Binary Format On RISC-V
[Arguments] ${memory_per_cpu}
Create Machine RISC-V 32-bit 0x2000 ${memory_per_cpu}
${trace_filepath}= Allocate Temporary File
Execute Command sysbus.cpu CreateExecutionTracing "tracer" "${trace_filepath}" PCAndOpcode True
Execute Command tracer TrackMemoryAccesses
Run RISC-V Program With Memory Access 0x2000
Execute Command sysbus.cpu DisableExecutionTracing
${output_file}= Get Binary File ${trace_filepath}
Length Should Be ${output_file} 77
Should Be Equal As Bytes ${output_file}[00:08] ${bin_out_signature}
# [0]: pc_width; [1]: include_opcode
Should Be Equal As Bytes ${output_file}[08:10] \x04\x01
# [0]: uses_thumb_flag; [1]: triple_and_model_length;
Should Be Equal As Bytes ${output_file}[10:12] \x00\x11
Should Be Equal As Bytes ${output_file}[12:29] ${triple_and_model}
# [0:4]: pc; [4]: opcode_length; [5:9]: opcode; [10]: additional_data_type = None
Should Be Equal As Bytes ${output_file}[29:39] \x00\x20\x00\x00\x04\xb7\x05\x03\x00\x00
Should Be Equal As Bytes ${output_file}[39:49] \x04\x20\x00\x00\x04\x37\xe5\x00\x00\x00
# [0:4]: pc; [4]: opcode_length; [5:9]: opcode; [10]: additional_data_type = MemoryAccess
Should Be Equal As Bytes ${output_file}[49:59] \x08\x20\x00\x00\x04\x23\x20\xb5\x00\x01
# [0]: access_type; [1-9]: access_address
Should Be Equal As Bytes ${output_file}[59:69] \x03\x00\xe0\x00\x00\x00\x00\x00\x00\x00
# [0-7]: access_value
Should Be Equal As Bytes ${output_file}[69:77] \x00\x03\x00\x00\x00\x00\x00\x00
Should Dump 64-bit PCs As Binary On RISC-V
[Arguments] ${memory_per_cpu}
Create Machine RISC-V 64-bit 0x2000000000 ${memory_per_cpu}
${trace}= Run And Trace Simple Program On RISC-V 0x2000000000 PC True
Length Should Be ${trace} 37
Should Be Equal As Bytes ${trace}[00:08] ${bin_out_signature}
Should Be Equal As Bytes ${trace}[08:10] \x08\x00
Should Be Equal As Bytes ${trace}[10:19] \x00\x00\x00\x00\x20\x00\x00\x00\x00
Should Be Equal As Bytes ${trace}[19:28] \x04\x00\x00\x00\x20\x00\x00\x00\x00
Should Be Equal As Bytes ${trace}[28:37] \x06\x00\x00\x00\x20\x00\x00\x00\x00
Should Dump 32-bit PCs As Binary On RISC-V
[Arguments] ${memory_per_cpu}
Create Machine RISC-V 32-bit 0x2000 ${memory_per_cpu}
${trace}= Run And Trace Simple Program On RISC-V 0x2000 PC True
Length Should Be ${trace} 25
Should Be Equal As Bytes ${trace}[00:08] ${bin_out_signature}
Should Be Equal As Bytes ${trace}[08:10] \x04\x00
Should Be Equal As Bytes ${trace}[10:15] \x00\x20\x00\x00\x00
Should Be Equal As Bytes ${trace}[15:20] \x04\x20\x00\x00\x00
Should Be Equal As Bytes ${trace}[20:25] \x06\x20\x00\x00\x00
Should Dump Opcodes As Binary On RISC-V
[Arguments] ${memory_per_cpu}
Create Machine RISC-V 32-bit 0x2000 ${memory_per_cpu}
${trace}= Run And Trace Simple Program On RISC-V 0x2000 Opcode True
Length Should Be ${trace} 45
Should Be Equal As Bytes ${trace}[00:08] ${bin_out_signature}
Should Be Equal As Bytes ${trace}[08:10] \x00\x01
# [0]: uses_thumb_flag; [1]: triple_and_model_length;
Should Be Equal As Bytes ${trace}[10:12] \x00\x11
Should Be Equal As Bytes ${trace}[12:29] ${triple_and_model}
Should Be Equal As Bytes ${trace}[29:35] \x04\x13\x00\x00\x00\x00
Should Be Equal As Bytes ${trace}[35:39] \x02\x01\x00\x00
Should Be Equal As Bytes ${trace}[39:45] \x04\x93\x00\x31\x00\x00
Should Dump PCs And Opcodes As Binary On RISC-V
[Arguments] ${memory_per_cpu}
Create Machine RISC-V 32-bit 0x2000 ${memory_per_cpu}
${trace}= Run And Trace Simple Program On RISC-V 0x2000 PCAndOpcode True
Length Should Be ${trace} 57
Should Be Equal As Bytes ${trace}[00:08] ${bin_out_signature}
Should Be Equal As Bytes ${trace}[08:10] \x04\x01
# [0]: uses_thumb_flag; [1]: triple_and_model_length;
Should Be Equal As Bytes ${trace}[10:12] \x00\x11
Should Be Equal As Bytes ${trace}[12:29] ${triple_and_model}
Should Be Equal As Bytes ${trace}[29:33] \x00\x20\x00\x00
Should Be Equal As Bytes ${trace}[33:39] \x04\x13\x00\x00\x00\x00
Should Be Equal As Bytes ${trace}[39:43] \x04\x20\x00\x00
Should Be Equal As Bytes ${trace}[43:47] \x02\x01\x00\x00
Should Be Equal As Bytes ${trace}[47:51] \x06\x20\x00\x00
Should Be Equal As Bytes ${trace}[51:57] \x04\x93\x00\x31\x00\x00
Should Trace Consecutive Blocks On RISC-V
[Arguments] ${memory_per_cpu}
Create Machine RISC-V 32-bit 0x0 ${memory_per_cpu}
Execute Command sysbus.cpu ExecutionMode Continuous
# "li x1, 0"
Execute Command sysbus WriteDoubleWord 0x200 0x93 cpu
# "li x2, 10"
Execute Command sysbus WriteDoubleWord 0x204 0x00a00113 cpu
# "addi x1, x1, 1"
Execute Command sysbus WriteDoubleWord 0x208 0x00108093 cpu
# "bne x1, x2, 0x214"
Execute Command sysbus WriteDoubleWord 0x20C 0x00209463 cpu
# "j 0x300"
Execute Command sysbus WriteDoubleWord 0x210 0x0f00006f cpu
# "c.nop"s (compressed)
Execute Command sysbus WriteDoubleWord 0x214 0x01 cpu
Execute Command sysbus WriteDoubleWord 0x216 0x01 cpu
# "nop"s
Execute Command sysbus WriteDoubleWord 0x218 0x13 cpu
Execute Command sysbus WriteDoubleWord 0x21C 0x13 cpu
Execute Command sysbus WriteDoubleWord 0x220 0x13 cpu
Execute Command sysbus WriteDoubleWord 0x224 0x13 cpu
Execute Command sysbus WriteDoubleWord 0x228 0x13 cpu
Execute Command sysbus WriteDoubleWord 0x22C 0x13 cpu
Execute Command sysbus WriteDoubleWord 0x230 0x13 cpu
Execute Command sysbus WriteDoubleWord 0x234 0x13 cpu
Execute Command sysbus WriteDoubleWord 0x238 0x13 cpu
Execute Command sysbus WriteDoubleWord 0x23C 0x13 cpu
# "j +4" - just to break the block
# this is to test the block chaining mechanism
Execute Command sysbus WriteDoubleWord 0x240 0x0040006f cpu
# "nop"s
Execute Command sysbus WriteDoubleWord 0x244 0x13 cpu
Execute Command sysbus WriteDoubleWord 0x248 0x13 cpu
Execute Command sysbus WriteDoubleWord 0x24C 0x13 cpu
Execute Command sysbus WriteDoubleWord 0x250 0x13 cpu
Execute Command sysbus WriteDoubleWord 0x254 0x13 cpu
Execute Command sysbus WriteDoubleWord 0x258 0x13 cpu
Execute Command sysbus WriteDoubleWord 0x25C 0x13 cpu
Execute Command sysbus WriteDoubleWord 0x260 0x13 cpu
Execute Command sysbus WriteDoubleWord 0x264 0x13 cpu
Execute Command sysbus WriteDoubleWord 0x268 0x13 cpu
Execute Command sysbus WriteDoubleWord 0x26C 0x13 cpu
# "j +4" - just to break the block
Execute Command sysbus WriteDoubleWord 0x270 0x0040006f cpu
# "nop"s
Execute Command sysbus WriteDoubleWord 0x274 0x13 cpu
Execute Command sysbus WriteDoubleWord 0x278 0x13 cpu
Execute Command sysbus WriteDoubleWord 0x27C 0x13 cpu
Execute Command sysbus WriteDoubleWord 0x280 0x13 cpu
Execute Command sysbus WriteDoubleWord 0x284 0x13 cpu
Execute Command sysbus WriteDoubleWord 0x288 0x13 cpu
Execute Command sysbus WriteDoubleWord 0x28C 0x13 cpu
Execute Command sysbus WriteDoubleWord 0x290 0x13 cpu
Execute Command sysbus WriteDoubleWord 0x294 0x13 cpu
Execute Command sysbus WriteDoubleWord 0x298 0x13 cpu
Execute Command sysbus WriteDoubleWord 0x29C 0x13 cpu
# "j 0x208"
Execute Command sysbus WriteDoubleWord 0x2A0 0xf69ff06f cpu
# "j 0x300"
Execute Command sysbus WriteDoubleWord 0x300 0x6f cpu
Execute Command sysbus.cpu PC 0x200
${FILE}= Allocate Temporary File
Execute Command sysbus.cpu CreateExecutionTracing "tracer" @${FILE} PC
# run for 400 instructions
Execute Command sysbus.cpu PerformanceInMips 1
Execute Command emulation RunFor "0.000400"
# should reach the end of the execution
${pc}= Execute Command sysbus.cpu PC
Should Contain ${pc} 0x300
Execute Command sysbus.cpu DisableExecutionTracing
${content}= Get File ${FILE}
@{pcs}= Split To Lines ${content}
Length Should Be ${pcs} 400
Should Be Equal ${pcs[0]} 0x200
Should Be Equal ${pcs[1]} 0x204
Should Be Equal ${pcs[2]} 0x208
Should Be Equal ${pcs[3]} 0x20C
# here we skip a jump to 0x300 (it should fire at the very end)
Should Be Equal ${pcs[4]} 0x214
Should Be Equal ${pcs[5]} 0x216
Should Be Equal ${pcs[6]} 0x218
Should Be Equal ${pcs[7]} 0x21C
# first iteration of the loop
Should Be Equal ${pcs[40]} 0x2A0
Should Be Equal ${pcs[41]} 0x208
# another iteration of the loop
Should Be Equal ${pcs[79]} 0x2A0
Should Be Equal ${pcs[80]} 0x208
# and another
Should Be Equal ${pcs[118]} 0x2A0
Should Be Equal ${pcs[119]} 0x208
# and the last one
Should Be Equal ${pcs[352]} 0x2A0
Should Be Equal ${pcs[353]} 0x208
Should Be Equal ${pcs[354]} 0x20C
Should Be Equal ${pcs[355]} 0x210
Should Be Equal ${pcs[356]} 0x300
Should Trace In ARM and Thumb State
[Arguments] ${memory_per_cpu}
Execute Command mach create
Execute Command machine LoadPlatformDescriptionFromString "cpu: CPU.ARMv7A @ sysbus { cpuType: \\"cortex-a9\\" }"
IF ${memory_per_cpu}
Execute Command machine LoadPlatformDescriptionFromString "mem: Memory.MappedMemory @ sysbus new Bus.BusPointRegistration { address: 0x0; cpu: cpu } { size: 0x1000 }"
ELSE
Execute Command machine LoadPlatformDescriptionFromString "mem: Memory.MappedMemory @ sysbus 0x0 { size: 0x1000 }"
END
# nop (ARM)
Execute Command sysbus WriteDoubleWord 0x00000000 0xe1a00000 cpu
# blx 0x10 (ARM)
Execute Command sysbus WriteDoubleWord 0x00000004 0xfa000001 cpu
# nop (ARM)
Execute Command sysbus WriteDoubleWord 0x00000008 0xe1a00000 cpu
# wfi (ARM)
Execute Command sysbus WriteDoubleWord 0x0000000c 0xe320f003 cpu
# 2x nop (Thumb)
Execute Command sysbus WriteDoubleWord 0x00000010 0x46c046c0 cpu
# bx lr; nop (Thumb)
Execute Command sysbus WriteDoubleWord 0x00000014 0x46c04770 cpu
Execute Command sysbus.cpu PC 0x0
${FILE}= Allocate Temporary File
Execute Command sysbus.cpu CreateExecutionTracing "tracer" @${FILE} PC
Execute Command emulation RunFor "0.0001"
# should reach the end of the execution
PC Should Be Equal 0x10
Execute Command sysbus.cpu DisableExecutionTracing
${content}= Get File ${FILE}
@{pcs}= Split To Lines ${content}
Length Should Be ${pcs} 7
Should Be Equal ${pcs[0]} 0x0
Should Be Equal ${pcs[1]} 0x4
Should Be Equal ${pcs[2]} 0x10
Should Be Equal ${pcs[3]} 0x12
Should Be Equal ${pcs[4]} 0x14
Should Be Equal ${pcs[5]} 0x8
Should Be Equal ${pcs[6]} 0xC
*** Test Cases ***
Should Dump PCs
${pcs}= Trace The Execution On The Versatile Platform PC
Length Should Be ${pcs} 16
Should Be Equal ${pcs[0]} 0x8000
Should Be Equal ${pcs[1]} 0x8004
Should Be Equal ${pcs[2]} 0x8008
Should Be Equal ${pcs[3]} 0x359C08
Should Be Equal ${pcs[14]} 0x8010
Should Be Equal ${pcs[15]} 0x8014
Should Dump Opcodes
${opcodes}= Trace The Execution On The Versatile Platform Opcode
Length Should Be ${opcodes} 16
Should Be Equal ${opcodes[0]} 0xE321F0D3
Should Be Equal ${opcodes[1]} 0xEE109F10
Should Be Equal ${opcodes[2]} 0xEB0D46FE
Should Be Equal ${opcodes[3]} 0xE28F3030
Should Be Equal ${opcodes[14]} 0x0A0D470D
Should Be Equal ${opcodes[15]} 0xE28F302C
Should Dump Opcodes For Isolated Memory
Create Machine RISC-V 32-bit 0x2000 memory_per_cpu=True
${trace}= Run And Trace Simple Program On RISC-V 0x2000 Opcode False
Should Contain ${trace}[0] 0x00000013
Should Contain ${trace}[1] 0x0001
Should Contain ${trace}[2] 0x00310093
Should Dump PCs And Opcodes
${trace}= Trace The Execution On The Versatile Platform PCAndOpcode
Length Should Be ${trace} 16
Should Be Equal ${trace[0]} 0x8000: 0xE321F0D3
Should Be Equal ${trace[1]} 0x8004: 0xEE109F10
Should Be Equal ${trace[2]} 0x8008: 0xEB0D46FE
Should Be Equal ${trace[3]} 0x359C08: 0xE28F3030
Should Be Equal ${trace[14]} 0x8010: 0x0A0D470D
Should Be Equal ${trace[15]} 0x8014: 0xE28F302C
Should Dump PCs And Opcodes For Isolated Memory
Create Machine RISC-V 32-bit 0x2000 memory_per_cpu=True
${trace}= Run And Trace Simple Program On RISC-V 0x2000 PCAndOpcode False
Should Contain ${trace}[0] 0x2000: 0x00000013
Should Contain ${trace}[1] 0x2004: 0x0001
Should Contain ${trace}[2] 0x2006: 0x00310093
Should Dump 64-bit PCs
Should Dump 64-bit PCs On RISC-V memory_per_cpu=False
Should Dump 64-bit PCs For Isolated Memory
Should Dump 64-bit PCs On RISC-V memory_per_cpu=True
Should Dump Disassembly
Should Dump Disassembly On RISC-V memory_per_cpu=False
Should Dump Disassembly For Isolated Memory
Should Dump Disassembly On RISC-V memory_per_cpu=True
Should Be Able To Add Accesses To The Memory To The Trace
Should Be Able To Add Memory Accesses To The Trace On RISC-V memory_per_cpu=False
Should Be Able To Add Accesses To The Isolated Memory To The Trace
Should Be Able To Add Memory Accesses To The Trace On RISC-V memory_per_cpu=True
Should Be Able To Add Accesses To The Memory To The Trace In Binary Format
Should Be Able To Add Memory Accesses To The Trace In Binary Format On RISC-V memory_per_cpu=False
Should Be Able To Add Accesses To The Isolated Memory To The Trace In Binary Format
Should Be Able To Add Memory Accesses To The Trace In Binary Format On RISC-V memory_per_cpu=True
Should Dump 64-bit PCs As Binary
Should Dump 64-bit PCs As Binary On RISC-V memory_per_cpu=False
Should Dump 64-bit PCs As Binary For Isolated Memory
Should Dump 64-bit PCs As Binary On RISC-V memory_per_cpu=True
Should Dump 32-bit PCs As Binary
Should Dump 32-bit PCs As Binary On RISC-V memory_per_cpu=False
Should Dump 32-bit PCs As Binary For Isolated Memory
Should Dump 32-bit PCs As Binary On RISC-V memory_per_cpu=True
Should Dump Opcodes As Binary
Should Dump Opcodes As Binary On RISC-V memory_per_cpu=False
Should Dump Opcodes As Binary For Isolated Memory
Should Dump Opcodes As Binary On RISC-V memory_per_cpu=True
Should Dump PCs And Opcodes As Binary
Should Dump PCs And Opcodes As Binary On RISC-V memory_per_cpu=False
Should Dump PCs And Opcodes As Binary For Isolated Memory
Should Dump PCs And Opcodes As Binary On RISC-V memory_per_cpu=True
Should Trace Consecutive Blocks
Should Trace Consecutive Blocks On RISC-V memory_per_cpu=False
Should Trace Consecutive Blocks For Isolated Memory
Should Trace Consecutive Blocks On RISC-V memory_per_cpu=True
Should Trace ARM Core
Should Trace In ARM and Thumb State memory_per_cpu=False
Should Trace ARM Core With Isolated Memory
Should Trace In ARM and Thumb State memory_per_cpu=True
Should Trace The RISC-V Vector Configuration
Create Machine RISC-V 32-bit 0x2000 memory_per_cpu=False
${trace_filepath}= Allocate Temporary File
Execute Command sysbus.cpu CreateExecutionTracing "trace_name" "${trace_filepath}" Disassembly
Execute Command trace_name TrackVectorConfiguration
Run RISC-V Program With Vcfg Instruction 0x2000
Execute Command sysbus.cpu DisableExecutionTracing
${output_file}= Get File ${trace_filepath}
Log ${output_file}
${output_lines}= Split To Lines ${output_file}
Length Should Be ${output_lines} 4
Should Contain ${output_lines}[0] nop
Should Contain ${output_lines}[1] nop
Should Contain ${output_lines}[2] vsetvli zero, zero, e8, m1, ta, mu
Should Contain ${output_lines}[3] Vector configured to VL: 0x0, VTYPE: 0x40
Should Be Able To Add Vector Configuration To The Trace In Binary Format
Create Machine RISC-V 32-bit 0x2000 memory_per_cpu=False
${trace_filepath}= Allocate Temporary File
Execute Command sysbus.cpu CreateExecutionTracing "trace_name" "${trace_filepath}" PCAndOpcode true
Execute Command trace_name TrackVectorConfiguration
Run RISC-V Program With Vcfg Instruction 0x2000
Execute Command sysbus.cpu DisableExecutionTracing
${output_file}= Get Binary File ${trace_filepath}
Length Should Be ${output_file} 74
Should Be Equal As Bytes ${output_file}[00:08] ${bin_out_signature}
Should Be Equal As Bytes ${output_file}[08:10] \x04\x01
# [0]: uses_thumb_flag; [1]: triple_and_model_length;
Should Be Equal As Bytes ${output_file}[10:12] \x00\x11
Should Be Equal As Bytes ${output_file}[12:29] ${triple_and_model}
# [0:4]: pc; [4]: opcode_length; [5:9]: opcode; [10]: additional_data_type = None
Should Be Equal As Bytes ${output_file}[29:39] \x00\x20\x00\x00\x04\x13\x00\x00\x00\x00
# [0:4]: pc; [4]: opcode_length; [5:7]: opcode; [8]: additional_data_type = None
Should Be Equal As Bytes ${output_file}[39:47] \x04\x20\x00\x00\x02\x01\x00\x00
# [0:4]: pc; [4]: opcode_length; [5:9]: opcode; [10]: additional_data_type = VectorConfiguration
Should Be Equal As Bytes ${output_file}[47:57] \x06\x20\x00\x00\x04\x57\x70\x00\x04\x02
# [0:8]: vl; [8:16]: vtype; [16]: additional_data_type = None
Should Be Equal As Bytes ${output_file}[57:74] \x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00
Should Show Error When Format Is Incorrect
Create Machine RISC-V 32-bit 0x2000 memory_per_cpu=False
${trace_filepath}= Allocate Temporary File
Run Keyword And Expect Error *don't support binary output file with the*formatting* Execute Command sysbus.cpu CreateExecutionTracing "tracer" "${trace_filepath}" Disassembly true