End of Test (EOT)

Generates EOT code for ending the test. Writes to tohost to indicate a pass or fail.

tohost

The simulators Spike and Whisper use tohost to indicate the end of the test, defined in the io_htif sections. Writing to tohost with lsb=1 will end the test. If [msb:lsb+1] is non zero and lsb=1 the test is marked as a fail. If [msb:lsb+1] is zero and lsb=1 (value of 0x1) the test is marked as a pass.

You can find more information about tohost in this Spike discussion.

Riescue uses tohost in the io_htif sections to indicate the end of the test. Other platforms may have different ways to indicate the end of the test.

Important

This code was written with the assumption that only one hart will execute the end of test code and the test will always write to tohost. Writing to tohost is a requirement to get ISS to end.

Tests currently always write to tohost when using Riescue.

Note

There’s currently no mechanism to stop other tests from executing. Riescue relies on an EOT write to end the test for all harts. If this is a problem, file an issue on the Riescue GitHub repository and request a feature.

API

The EOT code is generated by the riescue.dtest_framework.runtime.eot.Eot class. It generates a few public routines that can be called by other code.

eot__end_test:

eot__passed:

eot__failed:

eot__halt:

eot__end_test

This code is called at the end of the test for failures, passes, and halts. It should be ran in the handler privilege mode and returns to M mode before ending the test.

Passing a value of 1 into gp will mark the test as passed, otherwise any other non-zero value will be marked as a fail

eot__end_test is called by the all routines (except for the loader panic):

        graph LR


    eot[eot__end_test]
    scheduler__finished -->|gp=1| eot
    os_end_test -->|gp=1| eot
    scheduler__panic -->|gp=0| eot
    trap__panic -->|gp=0| eot
    end_test --> os_end_test
    syscall_f0000003 --> os_end_test
    failed --> test_failed
    syscall_f0000002 --> test_failed
    test_failed -->|gp=0| eot




    classDef mMode fill:#5164e0,stroke:#5164e0,stroke-width:3px,color:#fff
    classDef handlerMode fill:#fa512e,stroke:#fa512e,stroke-width:3px,color:#000
    classDef handlerBlock fill:#FEC3A4,stroke:#FEC3A4,stroke-width:3px,color:#0
    classDef testMode fill:#7584e6,stroke:#7584e6,stroke-width:3px,color:#0
    classDef testBlock fill:#C0C0E0,stroke:#C0C0E0,stroke-width:3px,color:#0

    class eot mMode
    class scheduler__finished,trap__panic,test_failed,os_end_test,scheduler__panic handlerMode
    class syscall_f0000002,syscall_f0000003,failed,end_test handlerBlock
    

The exception is a loader panic before the runtime is fully initilaized. Failures in the loader directly call eot__failed.

eot__passed / eot__failed

This code is called by eot__end_test depending on the value of gp.

If gp is 1, the test is marked as passed, any other value is marked as failed.

        graph LR

    loader__panic --> eot__failed
    eot[eot__end_test]
    eot -->|gp == 1| eot__passed
    eot -->|gp != 1| eot__failed


    classDef mMode fill:#5164e0,stroke:#5164e0,stroke-width:3px,color:#fff
    classDef handlerMode fill:#fa512e,stroke:#fa512e,stroke-width:3px,color:#000
    classDef handlerBlock fill:#FEC3A4,stroke:#FEC3A4,stroke-width:3px,color:#0
    classDef testMode fill:#7584e6,stroke:#7584e6,stroke-width:3px,color:#0
    classDef testBlock fill:#C0C0E0,stroke:#C0C0E0,stroke-width:3px,color:#0

    class eot,loader__panic,eot__passed,eot__failed mMode
    

MP EOT

MP code selects a single hart to write to tohost and then halts. The first hart to enter eot__end_test will be the one to write to tohost. All other harts will wait in the eot__halt routine until the first hart writes to tohost.

Overriding EOT Code

EOT hooks are available for inserting additional code at different points in the EOT code. The availabe hooks are:

  • PRE_PASS: Called before the test is marked as passed.

  • POST_PASS: Called after the test is marked as passed.

  • PRE_FAIL: Called before the test is marked as failed.

  • POST_FAIL: Called after the test is marked as failed.

  • PRE_HALT: Called before the test is halted.

See the FeatMgr class for more information on how to use hooks.

Configuration

The tohost write value can be overridden by setting the eot_pass_value and eot_fail_value configuration options.

  • eot_pass_value: Value to write to tohost on test pass

  • eot_fail_value: Value to write to tohost on test fail

The tohost address can be configured by changing the htif section in the CPU configuration file. If no htif section is provided, it will insert the address at the end of the runtime code (after the .section .text section).

Examples

For more information on how to modify the end of test code, see the Modifying End of Test (EOT) Code user guide.