Files
simulation_core/tests/tools/execution_tracer_reader.robot

244 lines
11 KiB
Plaintext
Raw Normal View History

*** Variables ***
${COVERAGE_TEST_BINARY_URL} https://dl.antmicro.com/projects/renode/coverage-tests/coverage-test.elf-s_3603888-0f7cfe992528c2576a9ac6a4dcc3a41b03d1d6eb
${COVERAGE_TEST_CODE_URL} https://dl.antmicro.com/projects/renode/coverage-tests/main.c
${COVERAGE_TEST_PC_LINE_SHORT_URL} https://dl.antmicro.com/projects/renode/coverage-test-long.pclin-s_3793722-41205f1fbb53838ef9e1f22ac5f93da33dd7b819
${COVERAGE_TEST_PC_LINE_LONG_URL} https://dl.antmicro.com/projects/renode/coverage-test-short.pclin-s_798598-efe5d5bbf5738887e0720a5c7673917139bfff76
${COVERAGE_TEST_CODE_FILENAME} main.c
${EXECUTION_TRACER} ${RENODETOOLS}/execution_tracer/execution_tracer_reader.py
${TRACED_CPU} cpu1
&{COVERAGE_REPORT_LINES} # pairs of line number and expected executions
... 6=28
... 7=2828
... 8=2800
... 10=28
... 12=32
... 13=3232
... 14=3200
... 16=32
... 18=2
... 19=202
... 20=200
... 22=2
... 24=1
... 25=1
... 26=101
... 27=100
... 30=1
... 32=101
... 33=100
... 34=32
... 36=100
... 37=28
... 41=1
... 43=1
... 44=1
@{COVERAGE_REPORT_LCOV}
... TN:
... SF:main.c
... DA:6,28
... DA:7,2828
... DA:8,2800
... DA:10,28
... DA:12,32
... DA:13,3232
... DA:14,3200
... DA:16,32
... DA:18,2
... DA:19,202
... DA:20,200
... DA:22,2
... DA:24,1
... DA:25,1
... DA:26,101
... DA:27,100
... DA:30,1
... DA:32,101
... DA:33,100
... DA:34,32
... DA:36,100
... DA:37,28
... DA:41,1
... DA:43,1
... DA:44,1
... end_of_record
${LINUX_32BIT_ROOTFS} https://dl.antmicro.com/projects/renode/zynq--interface-tests-rootfs.ext2-s_16777216-191638e3b3832a81bebd21d555f67bf3a4d7882a
*** Keywords ***
Execute Python Script
[Arguments] ${path} ${args} ${outputPath}=${None}
${all_args}= Create List ${path} @{args}
IF $outputPath
${out}= Evaluate open($outputPath, "w")
ELSE
${out}= Set Variable ${None}
END
Evaluate subprocess.run([sys.executable] + ${all_args}, stdout=$out) sys,subprocess
IF $out
Evaluate $out.close()
END
Download File And Rename
[Arguments] ${url} ${filename}
${temporary_file}= Download File ${url}
${path_fragments}= Split Path ${temporary_file}
${new_path}= Join Path ${path_fragments}[0] ${filename}
Move File ${temporary_file} ${new_path}
RETURN ${new_path}
Create Platform
[Arguments] ${executable}
Execute Command $bin=@${executable}
Execute Command i @scripts/single-node/kendryte_k210.resc
Execute Command cpu2 IsHalted true
Trace Execution
[Arguments] ${cpu} ${mode} ${compress}=False ${synchronous}=False
${trace_file}= Allocate Temporary File
Execute Command ${cpu} CreateExecutionTracing "trace" @${trace_file} ${mode} isBinary=true compress=${compress} isSynchronous=${synchronous}
Execute Command emulation RunFor "0.017"
Execute Command ${cpu} DisableExecutionTracing
RETURN ${trace_file}
Line Should Report Executions
[Arguments] ${line} ${executions}
Should Start With ${line} ${executions}: strip_spaces=True collapse_spaces=True
Should Report Proper Coverage
[Arguments] ${report} ${expected_lines}
FOR ${expected_line} IN &{expected_lines}
${line_index}= Evaluate ${expected_line}[0] - 1
Line Should Report Executions ${report}[${line_index}] ${expected_line}[1]
END
FOR ${line_index} ${report_line} IN ENUMERATE @{report}
${line_number}= Evaluate str(${line_index} + 1)
IF ${{ $line_number not in $COVERAGE_REPORT_LINES }}
Line Should Report Executions ${report_line} 0
END
END
Should Report Proper Coverage LCOV
[Arguments] ${report} ${expected_lines}
Should Be Equal As Strings ${report} ${expected_lines} strip_spaces=True
Trace And Report Coverage
[Arguments] ${is_legacy} ${compress}=False ${use_pc2line}="no"
${coverage_file}= Allocate Temporary File
${binary_file}= Download File ${COVERAGE_TEST_BINARY_URL}
${code_file}= Download File And Rename ${COVERAGE_TEST_CODE_URL} ${COVERAGE_TEST_CODE_FILENAME}
Create Platform ${COVERAGE_TEST_BINARY_URL}
${trace}= Trace Execution ${TRACED_CPU} PC ${compress}
${script_args}= Create List
IF ${compress} == True
Append To List ${script_args} --decompress
END
Append To List ${script_args}
... coverage
... ${trace}
... --sources
... ${code_file}
... --output
... ${coverage_file}
IF ${is_legacy} == True
Append To List ${script_args} --legacy
END
IF $use_pc2line == "short"
${pclin_short_file}= Download File ${COVERAGE_TEST_PC_LINE_SHORT_URL}
Append To List ${script_args}
... --pc2line
... ${pclin_short_file}
ELSE IF $use_pc2line == "long"
${pclin_long_file}= Download File ${COVERAGE_TEST_PC_LINE_LONG_URL}
Append To List ${script_args}
... --pc2line
... ${pclin_long_file}
ELSE
Append To List ${script_args}
... --binary
... ${binary_file}
END
Execute Python Script ${EXECUTION_TRACER} ${script_args}
${coverage_report_content}= Get File ${coverage_file}
${coverage_report}= Split To Lines ${coverage_report_content}
IF ${is_legacy} == True
Should Report Proper Coverage ${coverage_report} ${COVERAGE_REPORT_LINES}
ELSE
# The slice is necessary to omit "filename", which is expected to differ (since the absolute paths are never the same in the temp directory)
Should Report Proper Coverage LCOV ${coverage_report}[2:] ${COVERAGE_REPORT_LCOV}[2:]
END
*** Test Cases ***
Trace And Report Coverage
Trace And Report Coverage False
Trace And Report Coverage In Legacy Format
Trace And Report Coverage True
Trace With Compressed Output And Report Coverage
Trace And Report Coverage False True
Trace With Compressed Output And Report Coverage In Legacy Format
Trace And Report Coverage True True
Trace And Report Coverage Using Short Pc2Line Mappings
Trace And Report Coverage False False short
Trace And Report Coverage Using Long Pc2Line Mappings
Trace And Report Coverage False False long
Trace Mixed A64, A32 and T32 Code
${disassembly_file}= Allocate Temporary File
Execute Command $rootfs=@${LINUX_32BIT_ROOTFS}
Execute Command $bootargs="earlycon console=ttyPS1,115200n8 root=/dev/ram0 rw initrd=0x20000000,64M nr_cpus=1"
Execute Command include @scripts/single-node/zynqmp_linux.resc
Execute Command machine SetSerialExecution True
Create Terminal Tester sysbus.uart1 defaultPauseEmulation=true
Wait For Prompt On Uart buildroot login: timeout=50
Write Line To Uart root
Wait For Prompt On Uart \#
Write Line To Uart uname -a
${trace}= Trace Execution apu0 PCAndOpcode synchronous=True
${script_args}= Create List
Append To List ${script_args}
... inspect
... --disassemble
... ${trace}
Execute Python Script ${EXECUTION_TRACER} ${script_args} outputPath=${disassembly_file}
# Note: The specific opcodes and PCs don't really matter, we only want to ensure that each of the
# instruction categories was disassembled correctly.
# A64
${x}= Grep File ${disassembly_file} 0x0000000010011FE4:*0xD69F03E0*eret
Should Not Be Empty ${x}
# A32
${x}= Grep File ${disassembly_file} 0x000000087F052D0C:*0xE92D40F0*push*{r4,*r5,*r6,*r7,*lr}
Should Not Be Empty ${x}
# T32
${x}= Grep File ${disassembly_file} 0x000000087F07E4D8:*0xBF04*itt*eq
Should Not Be Empty ${x}