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 打印状态代码。
我正在编写一个用于显示状态的 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 打印状态代码。