//! Boot one hart and check user termination through production dispatch.
.text;
    call @kernel::boot::initialize;
    call @kernel::dispatchcheck::setup;
    call @kernel::boot::run;
.export @kernel::dispatchcheck::memory;
.export @kernel::dispatchcheck::kernelGp;
.export @kernel::dispatchcheck::completion;
.export @kernel::dispatchcheck::finish;
@kernel::dispatchcheck::memory
    ret;
@kernel::dispatchcheck::kernelGp
    mv %a0 %gp;
    ret;
@kernel::dispatchcheck::completion
    la %a0 @complete;
    ret;
@complete
    call @kernel::dispatchcheck::verify;
    ebreak;
@kernel::dispatchcheck::finish
    li %t0 0x10001000;
    li %t1 0x5555;
    sw %t1 0(%t0);
    ebreak;

.export @kernel::dispatchcheck::put;
@kernel::dispatchcheck::put
    li %t0 0x10000000;
    sb %a0 0(%t0);
    ret;

.export @kernel::dispatchcheck::invoke;
// Preserve kernel state while calling one private instance of shared code.
@kernel::dispatchcheck::invoke
    addi %sp %sp -16;
    sd %ra 8(%sp);
    sd %gp 0(%sp);
    mv %gp %a1;
    jalr %ra %a0 0;
    ld %gp 0(%sp);
    ld %ra 8(%sp);
    addi %sp %sp 16;
    ret;
