Home > front end >  UEFI function running wrong part in if else
UEFI function running wrong part in if else

Time:05-09

I am writing a UEFI function which used to show status.

But when I give it a EFI_STATUS type "2" as "state" argument, it execute "else" part, instead of "state == 2" part.

I don't know which detail I missed.

EFI_STATUS ShowState(const CHAR16 * name, UINTN state) {
    if (state == 0) {
        Print(L"[ INFO ] %s success.\n", name);
    } else {
        CHAR16 * code;

        if (state == 1) {
            code = L"EFI_LOAD_ERROR";
        } else if (state == 2) {
            code = L"EFI_INVALID_PARAMETER";
        } else {
            code = L"Unknown";
        }
    
        if (code[0] == 'U') {
            Print(L"[ ERRO ] %s failed with [%d].\n", name, state);
        } else { // (code[0] == 'E')
            Print(L"[ ERRO ] %s failed with %s.\n", name, code);
        }
    }
    return EFI_SUCCESS;
}

CodePudding user response:

There are 2 possible errors here - either the state you send is wrong, or the test you made is wrong. To test the state - add a print to show the state to test your test - just always print the code. so just add this line before the if:

Print(L"[ ERRO ] %s failed with [%d][%s].\n", name, state, code);

Also note that you're getting a UINTN for input, but talking about it as EFI_STATUS. an EFI_STATUS is a UINTN, but you need to make sure you passed the correct variable.

Or just post here the function the passes information to ShowState, plus the output you got

CodePudding user response:

I read UEFI spec again, and as prl said, EFI_STATUS is a hex value, so we have some resolution:

  • Use EFIERR(2) instead of 2
  • Directly use EFI_INVALID_PARAMETER marco

And when I use Print() to print the status value, it only prints decimal "2", that is the main reason which making I confusing.

Finally, thanks everyone who answered or commented this question.

  • Related