summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSamuel Mendoza-Jonas <sam@mendozajonas.com>2017-06-14 12:01:35 +1000
committerSamuel Mendoza-Jonas <sam@mendozajonas.com>2017-06-20 15:35:54 +1000
commit8ed97667e4c602ef37cb2a870a198cfbf008b29a (patch)
tree2c2c64416a4e47e4e8ac94f729427cdb26bbf426
parent722e64564e436a0491563c9f57a49dfee5c50dd9 (diff)
downloadpetitboot-8ed97667e4c602ef37cb2a870a198cfbf008b29a.zip
petitboot-8ed97667e4c602ef37cb2a870a198cfbf008b29a.tar.gz
discover/platform-powerpc: Handle optional Get Device ID section
The 'auxiliary' section of the 'Get Device ID' response is optional, and some platforms exclude it from the response entirely. However Petitboot only recognises the response as valid if it includes the full 16 bytes. Update get_ipmi_bmc_versions() to also handle responses of only 12 bytes. Signed-off-by: Samuel Mendoza-Jonas <sam@mendozajonas.com>
-rw-r--r--discover/platform-powerpc.c26
1 files changed, 18 insertions, 8 deletions
diff --git a/discover/platform-powerpc.c b/discover/platform-powerpc.c
index 3723ebf..a4b955e 100644
--- a/discover/platform-powerpc.c
+++ b/discover/platform-powerpc.c
@@ -1050,7 +1050,7 @@ static void get_ipmi_bmc_versions(struct platform *p, struct system_info *info)
pb_debug("\n");
}
- if (rc == 0 && resp_len == 16) {
+ if (rc == 0 && (resp_len == 12 || resp_len == 16)) {
info->bmc_current = talloc_array(info, char *, 4);
info->n_bmc_current = 4;
@@ -1062,9 +1062,14 @@ static void get_ipmi_bmc_versions(struct platform *p, struct system_info *info)
bcd += 10 * (resp[4] >> 4);
/* rev1.rev2.aux_revision */
info->bmc_current[2] = talloc_asprintf(info,
- "Firmware version: %u.%02u.%02x%02x%02x%02x",
- resp[3], bcd, resp[12],
- resp[13], resp[14], resp[15]);
+ "Firmware version: %u.%02u",
+ resp[3], bcd);
+ if (resp_len == 16) {
+ info->bmc_current[2] = talloc_asprintf_append(
+ info->bmc_current[2],
+ ".%02x%02x%02x%02x",
+ resp[12], resp[13], resp[14], resp[15]);
+ }
bcd = resp[5] & 0x0f;
bcd += 10 * (resp[5] >> 4);
info->bmc_current[3] = talloc_asprintf(info, "IPMI version: %u",
@@ -1089,7 +1094,7 @@ static void get_ipmi_bmc_versions(struct platform *p, struct system_info *info)
pb_debug("\n");
}
- if (rc == 0 && resp_len == 16) {
+ if (rc == 0 && (resp_len == 12 || resp_len == 16)) {
info->bmc_golden = talloc_array(info, char *, 4);
info->n_bmc_golden = 4;
@@ -1101,9 +1106,14 @@ static void get_ipmi_bmc_versions(struct platform *p, struct system_info *info)
bcd += 10 * (resp[4] >> 4);
/* rev1.rev2.aux_revision */
info->bmc_golden[2] = talloc_asprintf(info,
- "Firmware version: %u.%02u.%02x%02x%02x%02x",
- resp[3], bcd, resp[12],
- resp[13], resp[14], resp[15]);
+ "Firmware version: %u.%02u",
+ resp[3], bcd);
+ if (resp_len == 16) {
+ info->bmc_golden[2] = talloc_asprintf_append(
+ info->bmc_golden[2],
+ ".%02x%02x%02x%02x",
+ resp[12], resp[13], resp[14], resp[15]);
+ }
bcd = resp[5] & 0x0f;
bcd += 10 * (resp[5] >> 4);
info->bmc_golden[3] = talloc_asprintf(info, "IPMI version: %u",
OpenPOWER on IntegriCloud