• Ming Huang's avatar
    services: Fix pmr_el1 rewrote issue in sdei_disaptch_event() · d21f1ddb
    Ming Huang authored
    Consider a RAS scenario:
    Enter EL3 by sync exception, then call spm_mm_sp_call() enter
    EL0s to handle this error, then call sdei_dispatch_event() to
    inform OS. Finally, return back to OS from sync exception flow.
    Similar flow is sgi_ras_intr_handler() in sgi_ras.c.
    
    The icc_pmr_el1 register will be change in above flow:
    1 cm_el1_sysregs_context_save(NON_SECURE);
      -> ehf_exited_normal_world();
        ##icc_pmr_el1: 0xf8 => 0x80
    2 spm_mm_sp_call();
    3 sdei_dispatch_event();
    4 ehf_activate_priority(sdei_event_priority(map));
        ##icc_pmr_el1: 0x80 => 0x60
    5 restore_and_resume_ns_context();
      -> ehf_exited_normal_world();
         ##return due to has_valid_pri_activations(pe_data) == 1
    6 ehf_deactivate_priority(sdei_event_priority(map));
        ##icc_pmr_el1: 0x60 => 0x80
    The icc_pmr_el1 was rewrote from 0xf8 to 0x80. This issue will
    result in OS hang when eret to OS from RAS flow.
    
    Move ehf_activate_priority(sdei_event_priority(map)) after
    restore_and_resum...
    d21f1ddb
sdei_intr_mgmt.c 20.7 KB