218 lines
11 KiB
Plaintext
218 lines
11 KiB
Plaintext
*** Settings ***
|
|
Test Setup Create Machine
|
|
*** Variables ***
|
|
${CODE_BASE_ADDRESS} 0x8000000
|
|
${TCM_A_VALUE} 0x12121212
|
|
${TCM_B_VALUE} 0x34343434
|
|
${TCM_C_VALUE} 0x56565656
|
|
|
|
${PLAT} SEPARATOR=\n """
|
|
... cpu: CPU.ARMv8R @ sysbus
|
|
... ${SPACE*4}cpuType: "cortex-r52"
|
|
... ${SPACE*4}genericInterruptController: gic
|
|
... ${SPACE*4}init:
|
|
... ${SPACE*4}${SPACE*4}RegisterTCMRegion sysbus.atcm0 0
|
|
... ${SPACE*4}${SPACE*4}RegisterTCMRegion sysbus.btcm0 1
|
|
... ${SPACE*4}${SPACE*4}RegisterTCMRegion sysbus.ctcm0 2
|
|
...
|
|
... timer: Timers.ARM_GenericTimer @ cpu
|
|
... ${SPACE*4}frequency: 1000000000
|
|
... ${SPACE*4}EL1PhysicalTimerIRQ -> gic#0@30
|
|
... ${SPACE*4}EL1VirtualTimerIRQ -> gic#0@27
|
|
... ${SPACE*4}NonSecureEL2PhysicalTimerIRQ -> gic#0@26
|
|
...
|
|
... gic: IRQControllers.ARM_GenericInterruptController @ {
|
|
... ${SPACE*4}${SPACE*4}sysbus new Bus.BusMultiRegistration { address: 0x6E00000; size: 0x10000; region: \"distributor\" };
|
|
... ${SPACE*4}${SPACE*4}sysbus new IRQControllers.ArmGicRedistributorRegistration { attachedCPU: cpu; address: 0x6E10000 }
|
|
... ${SPACE*4}}
|
|
... ${SPACE*4}\[0-1] -> cpu@[0-1]
|
|
... ${SPACE*4}supportsTwoSecurityStates: false
|
|
...
|
|
... code: Memory.MappedMemory @ sysbus ${CODE_BASE_ADDRESS}
|
|
... ${SPACE*4}size: 0x10000
|
|
...
|
|
... atcm0: Memory.MappedMemory @ {sysbus new Bus.BusPointRegistration { address: 0x0; cpu: cpu }}
|
|
... ${SPACE*4}size: 0x10000
|
|
... ${SPACE*4}init:
|
|
... ${SPACE*4}${SPACE*4}FillWithRepeatingData [${TCM_A_VALUE}] // NB. the value gets truncated to a byte here
|
|
...
|
|
... btcm0: Memory.MappedMemory @ {sysbus new Bus.BusPointRegistration { address: 0x20000; cpu: cpu }}
|
|
... ${SPACE*4}size: 0x20000
|
|
... ${SPACE*4}init:
|
|
... ${SPACE*4}${SPACE*4}FillWithRepeatingData [${TCM_B_VALUE}]
|
|
...
|
|
... ctcm0: Memory.MappedMemory @ {sysbus new Bus.BusPointRegistration { address: 0x40000; cpu: cpu }}
|
|
... ${SPACE*4}size: 0x40000
|
|
... ${SPACE*4}init:
|
|
... ${SPACE*4}${SPACE*4}FillWithRepeatingData [${TCM_C_VALUE}]
|
|
... """
|
|
|
|
${NEW_TCM_A_ADDRESS} 0x60000
|
|
${NEW_TCM_B_ADDRESS} 0x00000
|
|
${NEW_TCM_C_ADDRESS} 0x20000
|
|
|
|
${TCM_TEST_ASSEMBLY} SEPARATOR=\n """
|
|
... // Store mask in R2
|
|
... MOV r2, 0x1fff
|
|
...
|
|
... // Move TCM A to ${NEW_TCM_A_ADDRESS}
|
|
... MRC p15, 0, r0, c9, c1, 0
|
|
... AND r0, r2
|
|
... MOV r1, ${NEW_TCM_A_ADDRESS}
|
|
... ORR r0, r1, LSL #13
|
|
... MCR p15, 0, r0, c9, c1, 0
|
|
...
|
|
... // Move TCM B to ${NEW_TCM_B_ADDRESS}
|
|
... MRC p15, 0, r0, c9, c1, 1
|
|
... AND r0, r2
|
|
... MOV r1, ${NEW_TCM_B_ADDRESS}
|
|
... ORR r0, r1, LSL #13
|
|
... MCR p15, 0, r0, c9, c1, 1
|
|
...
|
|
... // Move TCM C to ${NEW_TCM_C_ADDRESS}
|
|
... MRC p15, 0, r0, c9, c1, 2
|
|
... AND r0, r2
|
|
... MOV r1, ${NEW_TCM_C_ADDRESS}
|
|
... ORR r0, r1, LSL #13
|
|
... MCR p15, 0, r0, c9, c1, 2
|
|
...
|
|
... // Read values to registers
|
|
... MOV r0, ${NEW_TCM_A_ADDRESS}
|
|
... LDR r0, [r0] // ${TCM_A_VALUE}
|
|
... MOV r1, ${NEW_TCM_B_ADDRESS}
|
|
... LDR r1, [r1] // ${TCM_B_VALUE}
|
|
... MOV r2, ${NEW_TCM_C_ADDRESS}
|
|
... LDR r2, [r2] // ${TCM_C_VALUE}
|
|
...
|
|
... // Loop indefinitely
|
|
... B .
|
|
... """
|
|
|
|
# This snippet assumes that target EL configuration is in R1
|
|
${TCM_EL_ACCESS_TEST_ASSEMBLY} SEPARATOR=\n """
|
|
... // Store mask in R2
|
|
... MVN r2, 0x3
|
|
...
|
|
... // Enable TCM at given EL
|
|
... MRC p15, 0, r0, c9, c1, 0
|
|
... AND r0, r2
|
|
... ORR r0, r1
|
|
... MCR p15, 0, r0, c9, c1, 0
|
|
...
|
|
... read_label:
|
|
... // Read values to registers
|
|
... MOV r0, 0x0
|
|
... LDR r0, [r0] // ${TCM_A_VALUE}
|
|
...
|
|
... // Loop indefinitely
|
|
... B read_label
|
|
... """
|
|
|
|
${R0_REGISTER_INDEX} 100
|
|
${R1_REGISTER_INDEX} 101
|
|
${R2_REGISTER_INDEX} 102
|
|
|
|
*** Keywords ***
|
|
Get System Register As Int
|
|
[Arguments] ${reg_name}
|
|
${as_str}= Execute Command cpu GetSystemRegisterValue ${reg_name}
|
|
${as_int}= Convert To Integer ${as_str}
|
|
RETURN ${as_int}
|
|
|
|
Get Register Field
|
|
[Arguments] ${int_value} ${start_offset} ${mask}
|
|
${field_val}= Evaluate ((${int_value} >> ${start_offset}) & ${mask})
|
|
RETURN ${field_val}
|
|
|
|
Field Should Have Correct Value
|
|
[Arguments] ${register_name} ${field_offset} ${field_mask} ${expected_value} ${error_message}
|
|
${reg_value}= Get System Register As Int ${register_name}
|
|
${field_value}= Get Register Field ${reg_value} ${field_offset} ${field_mask}
|
|
Should Be Equal As Integers ${field_value} ${expected_value} ${error_message}
|
|
|
|
Create Machine
|
|
Execute Command mach create
|
|
Execute Command machine LoadPlatformDescriptionFromString ${PLAT}
|
|
Execute Command using sysbus
|
|
|
|
*** Test Cases ***
|
|
# TCM tests
|
|
ID_MMFR0 Register Should Have Correct Value
|
|
[Template] Field Should Have Correct Value
|
|
"ID_MMFR0" 16 0b1111 0b0001 ID_MMFR0 TCM bit should be enabled
|
|
|
|
TCMType Register Should Have Correct Value
|
|
[Template] Field Should Have Correct Value
|
|
"TCMTR" 0 0b111 0b111 ABC enabled region bits incorrect
|
|
"TCMTR" 29 0b1111 0b100 TCM bits incorrect
|
|
|
|
IMP_.TCMREGIONR Should Have Correct Value
|
|
[Template] Field Should Have Correct Value
|
|
"IMP_ATCMREGIONR" 2 0b11111 0b00111 TCM A region size mismatch
|
|
"IMP_ATCMREGIONR" 0 0xFFFFF000 0x0 TCM A region base address mismatch
|
|
"IMP_BTCMREGIONR" 2 0b11111 0b01000 TCM B region size mismatch
|
|
"IMP_BTCMREGIONR" 0 0xFFFFF000 0x20000 TCM B region base address mismatch
|
|
"IMP_CTCMREGIONR" 2 0b11111 0b01001 TCM C region size mismatch
|
|
"IMP_CTCMREGIONR" 0 0xFFFFF000 0x40000 TCM C region base address mismatch
|
|
|
|
Should Remap TCM Regions
|
|
Execute Command cpu AssembleBlock ${CODE_BASE_ADDRESS} ${TCM_TEST_ASSEMBLY}
|
|
Execute Command cpu PC ${CODE_BASE_ADDRESS}
|
|
Execute Command emulation RunFor "0.01"
|
|
|
|
Register Should Be Equal ${R0_REGISTER_INDEX} ${TCM_A_VALUE}
|
|
Register Should Be Equal ${R1_REGISTER_INDEX} ${TCM_B_VALUE}
|
|
Register Should Be Equal ${R2_REGISTER_INDEX} ${TCM_C_VALUE}
|
|
|
|
Should Disable TCM Region At EL0 and EL1
|
|
Create Log Tester 0
|
|
|
|
Execute Command cpu PC ${CODE_BASE_ADDRESS}
|
|
Execute Command cpu AssembleBlock `cpu PC` ${TCM_EL_ACCESS_TEST_ASSEMBLY}
|
|
Execute Command cpu SetRegister "R1" 0x2
|
|
|
|
Execute Command allowPrivates true
|
|
|
|
Execute Command cpu Step 5
|
|
|
|
Execute Command cpu ExceptionLevel EL2_HypervisorMode
|
|
Execute Command cpu Step 3
|
|
Should Not Be In Log sysbus: Tried to read 4 bytes at 0x0, with incorrect permissions, returning 0.
|
|
Register Should Be Equal R0 ${TCM_A_VALUE}
|
|
|
|
Execute Command cpu ExceptionLevel EL1_SystemMode
|
|
Execute Command cpu Step 3
|
|
Wait For Log Entry sysbus: Tried to read 4 bytes at 0x0, with incorrect permissions, returning 0.
|
|
Register Should Be Equal R0 0
|
|
|
|
Execute Command cpu ExceptionLevel EL0_UserMode
|
|
Execute Command cpu Step 3
|
|
Wait For Log Entry sysbus: Tried to read 4 bytes at 0x0, with incorrect permissions, returning 0.
|
|
Register Should Be Equal R0 0
|
|
|
|
Should Disable TCM Region At EL2
|
|
Create Log Tester 0
|
|
|
|
Execute Command cpu PC ${CODE_BASE_ADDRESS}
|
|
Execute Command cpu AssembleBlock `cpu PC` ${TCM_EL_ACCESS_TEST_ASSEMBLY}
|
|
Execute Command cpu SetRegister "R1" 0x1
|
|
|
|
Execute Command allowPrivates true
|
|
|
|
Execute Command cpu Step 5
|
|
|
|
Execute Command cpu ExceptionLevel EL2_HypervisorMode
|
|
Execute Command cpu Step 3
|
|
Wait For Log Entry sysbus: Tried to read 4 bytes at 0x0, with incorrect permissions, returning 0.
|
|
Register Should Be Equal R0 0
|
|
|
|
Execute Command cpu ExceptionLevel EL1_SystemMode
|
|
Execute Command cpu Step 3
|
|
Should Not Be In Log sysbus: Tried to read 4 bytes at 0x0, with incorrect permissions, returning 0.
|
|
Register Should Be Equal R0 ${TCM_A_VALUE}
|
|
|
|
Execute Command cpu ExceptionLevel EL0_UserMode
|
|
Execute Command cpu Step 3
|
|
Should Not Be In Log sysbus: Tried to read 4 bytes at 0x0, with incorrect permissions, returning 0.
|
|
Register Should Be Equal R0 ${TCM_A_VALUE}
|