UEFI 函数 运行 if else 中的错误部分

UEFI function running wrong part in if else

我正在编写一个用于显示状态的 UEFI 函数。

但是当我给它一个EFI_STATUS类型“2”作为“state”参数时,它执行“else”部分,而不是“state == 2”部分。

不知道漏掉了哪个细节

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;
}

这里可能有2个错误——要么你发送的状态有误,要么你做的测试有误。 测试状态 - 添加打印以显示状态 测试你的测试 - 总是打印代码。 所以只需在 if:

之前添加这一行
Print(L"[ ERRO ] %s failed with [%d][%s].\n", name, state, code);

另请注意,您将获得一个 UINTN 用于输入,但将其称为 EFI_STATUS。 EFI_STATUS 是 UINTN,但您需要确保传递了正确的变量。

或者只是 post 这里的函数将信息传递给 ShowState,加上你得到的输出

我再次阅读了 UEFI 规范,正如 prl 所说,EFI_STATUS 是一个十六进制值,所以我们有一些解决方案:

  • 使用 EFIERR(2) 而不是 2
  • 直接使用EFI_INVALID_PARAMETER marco

而当我使用Print()打印状态值时,它只打印十进制“2”, 这是造成混乱的主要原因。

编辑:感谢 MiSimon,现在我知道应该使用 %r 打印状态代码。