Hi Julien,

On 21/02/2022 19:13, Julien Grall wrote:


On 21/02/2022 19:05, Ayan Kumar Halder wrote:
If we (ie Xen) didn't decode the instruction manually, then check_p2m() has not been invoked yet.  This is because of the following (info.dabt.valid == True) :-

         if ( !is_data || !info.dabt.valid )
         {

                 ...

                 if ( check_p2m(is_data, gpa) )
                     return;

                 ...

         }

So, in this scenario ( !info.dabt.valid), it would not be necessary to invoke check_p2m() after try_handle_mmio().

However, if we havenot decoded the instruction manually (ie info.dabt.valid == True), and try_handle_mmio() returns IO_UNHANDLED, then it will be necessary to invoke "check_p2m(is_data, gpa)"

Hmmm you are right. But this doesn't seem to match the code you wrote below. What did I miss?

My code was not correct.  I have rectified it as below. Please let me know if it looks sane.

<snip>

    case FSC_FLT_TRANS:
    {
        info.gpa = gpa;
        info.dabt = hsr.dabt;

        /*
         * Assumption :- Most of the times when we get a data abort and the ISS          * is invalid or an instruction abort, the underlying cause is that the
         * page tables have not been set up correctly.
         */
        if ( !is_data || !info.dabt.valid )
        {
            if ( check_p2m(is_data, gpa) )
                return;

            /*
             * If the instruction abort could not be resolved by setting the
             * appropriate bits in the translation table, then Xen should
             * forward the abort to the guest.
             */
            if ( !is_data )
                goto inject_abt;

            try_decode_instruction(regs, &info);

            /*
             * If Xen could not decode the instruction or encountered an error              * while decoding, then it should forward the abort to the guest.
             */
            if ( info.dabt_instr.state == INSTR_ERROR )
                goto inject_abt;
        }

        state = try_handle_mmio(regs, &info);

        switch ( state )
        {
            case IO_ABORT:
                goto inject_abt;
            case IO_HANDLED:
                /*
                 * If the instruction was decoded and has executed successfully                  * on the MMIO region, then Xen should execute the next part of
                 * the instruction. (for eg increment the rn if it is a
                 * post-indexing instruction.
                 */
                post_increment_register(&info.dabt_instr);
                advance_pc(regs, hsr);
                return;
            case IO_RETRY:
                /* finish later */
                return;
            case IO_UNHANDLED:
                /* IO unhandled, try another way to handle it. */
                break;
        }

        /*
         * If the instruction was valid but Xen could not emulate the instruction          * then it should configure the page tables to set the correct page table          * entry corresponding to the faulting address. If it was successful, it          * should return to the guest to retry the instruction (hoping that the
         * instruction will not be trapped to Xen again).
         * However, if Xen was not successful in setting the page tables, then
         * it should forward the abort to the guest.
         */
        if ( info.dabt.valid && check_p2m(is_data, gpa) )
            return;

        break;
    }
    default:

<snip>

- Ayan


Cheers,


Reply via email to