130 lines
4.0 KiB
Diff
130 lines
4.0 KiB
Diff
From 3d350d1496f7af631e1a38d36f539b82488f0d35 Mon Sep 17 00:00:00 2001
|
|
From: jinlun <jinlun@huawei.com>
|
|
Date: Thu, 15 Jun 2023 21:17:00 +0800
|
|
Subject: [PATCH] add control switch to optimized exception handling
|
|
|
|
---
|
|
tpcm.c | 50 +++++++++++++++++++++++++++++++++++++-------------
|
|
tpcm.h | 5 +++--
|
|
2 files changed, 40 insertions(+), 15 deletions(-)
|
|
|
|
diff --git a/tpcm.c b/tpcm.c
|
|
index ae8cb33..8a78bca 100644
|
|
--- a/tpcm.c
|
|
+++ b/tpcm.c
|
|
@@ -293,7 +293,7 @@ out:
|
|
return efi_status;
|
|
}
|
|
|
|
-static BOOLEAN tpcm_get_switch(void)
|
|
+static void tpcm_get_switch(int *control_flag, int *measure_flag)
|
|
{
|
|
UINT8 response_length;
|
|
EFI_STATUS efi_status = EFI_SUCCESS;
|
|
@@ -314,21 +314,38 @@ static BOOLEAN tpcm_get_switch(void)
|
|
|
|
if (!tpcm_ipmi->excute_ipmi_cmd) {
|
|
console_print(L"tpcm_ipmi->excute_ipmi_cmd is NULL, some error may occur below shim!\n");
|
|
- return FALSE;
|
|
+ *control_flag = 0;
|
|
+ *measure_flag = 0;
|
|
+ return;
|
|
}
|
|
efi_status = tpcm_ipmi->excute_ipmi_cmd(tpcm_ipmi, request, &get_tpcm_request_value, sizeof(get_tpcm_request_value),
|
|
&get_tpcm_response_value, &response_length, NULL);
|
|
if (efi_status != EFI_SUCCESS) {
|
|
console_print(L"ipmi get tpcm switch failed.\n");
|
|
- return FALSE;
|
|
+ *control_flag = 0;
|
|
+ *measure_flag = 0;
|
|
+ return;
|
|
}
|
|
|
|
- if (get_tpcm_response_value.ControlResult != IPMI_SWITCH_OPEN) {
|
|
- console_print(L"tpcm switch close, skip measure.\n");
|
|
- return FALSE;
|
|
+ switch (get_tpcm_response_value.ControlResult) {
|
|
+ case IPMI_SWITCH_MEASURE_ENABLE_CONTROL_ENABLE:
|
|
+ *control_flag = 1;
|
|
+ *measure_flag = 1;
|
|
+ break;
|
|
+ case IPMI_SWITCH_MEASURE_ENABLE_CONTROL_DISABLE:
|
|
+ *control_flag = 0;
|
|
+ *measure_flag = 1;
|
|
+ break;
|
|
+ case IPMI_SWITCH_CLOSE:
|
|
+ case IPMI_SWITCH_UNKNOW:
|
|
+ default:
|
|
+ console_print(L"tpcm switch close, skip measure.\n");
|
|
+ *control_flag = 0;
|
|
+ *measure_flag = 0;
|
|
+ break;
|
|
}
|
|
|
|
- return TRUE;
|
|
+ return;
|
|
}
|
|
|
|
static EFI_STATUS tpcm_check_ipmi(void)
|
|
@@ -351,7 +368,7 @@ static EFI_STATUS tpcm_check_ipmi(void)
|
|
static EFI_STATUS tpcm_ipmi_measure(unsigned char *buf, size_t size, void *description, EFI_HANDLE image_handle)
|
|
{
|
|
EFI_STATUS efi_status;
|
|
- BOOLEAN switch_flag = FALSE;
|
|
+ int control_flag, measure_flag;
|
|
|
|
/* step1: check if the tpcm chips is existed. */
|
|
efi_status = tpcm_check_ipmi();
|
|
@@ -360,14 +377,20 @@ static EFI_STATUS tpcm_ipmi_measure(unsigned char *buf, size_t size, void *descr
|
|
}
|
|
|
|
/* step2: check if the tpcm switch is on. */
|
|
- switch_flag = tpcm_get_switch();
|
|
+ efi_status = EFI_SUCCESS;
|
|
+ tpcm_get_switch(&control_flag, &measure_flag);
|
|
|
|
/* step3: do measure if the tpcm switch is on. */
|
|
- if (switch_flag == TRUE) {
|
|
- return tpcm_do_measure(buf, size, description, image_handle);
|
|
+ if (measure_flag) {
|
|
+ efi_status = tpcm_do_measure(buf, size, description, image_handle);
|
|
+ }
|
|
+ // If the control switch is not turned on, the communication failure does not affect the startup.
|
|
+ if (!control_flag && EFI_ERROR(efi_status)) {
|
|
+ console_print(L"WORNING: control switch disable, The tpcm_do_measure() fail doesn't affect the startup.\n");
|
|
+ efi_status = EFI_SUCCESS;
|
|
}
|
|
|
|
- return EFI_SUCCESS;
|
|
+ return efi_status;
|
|
}
|
|
|
|
EFI_STATUS
|
|
@@ -384,4 +407,5 @@ tpcm_measure_grub(void *context, unsigned char *buf, size_t size, EFI_HANDLE ima
|
|
}
|
|
|
|
return tpcm_ipmi_measure(buf, size, context, image_handle);
|
|
-}
|
|
\ No newline at end of file
|
|
+}
|
|
+
|
|
diff --git a/tpcm.h b/tpcm.h
|
|
index b0679f0..c1df010 100644
|
|
--- a/tpcm.h
|
|
+++ b/tpcm.h
|
|
@@ -154,8 +154,9 @@ typedef enum {
|
|
|
|
typedef enum {
|
|
IPMI_SWITCH_UNKNOW,
|
|
- IPMI_SWITCH_OPEN,
|
|
- IPMI_SWITCH_CLOSE
|
|
+ IPMI_SWITCH_MEASURE_ENABLE_CONTROL_ENABLE,
|
|
+ IPMI_SWITCH_CLOSE,
|
|
+ IPMI_SWITCH_MEASURE_ENABLE_CONTROL_DISABLE
|
|
} shim_ipmi_get_switch_result_type;
|
|
|
|
typedef union {
|
|
--
|
|
2.27.0
|
|
|