arch/x86/smbios: Strip trailing whitespace on DMI 17 part number.

dmidecode used to print

    'HMAA51S6AMR6N-UH  '

it now prints

    'HMAA51S6AMR6N-UH'

BUG=b:65403853
TEST=Verified using dmidecode

Signed-off-by: Raul E Rangel <rrangel@chromium.org>
Change-Id: Ia10ef434a2377e34ae7a8f733c6465c2f8ee8dfa
Reviewed-on: https://review.coreboot.org/25302
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
This commit is contained in:
Raul E Rangel 2018-03-20 12:40:55 -06:00 committed by Aaron Durbin
parent 5041e9b416
commit 50021cdb06
1 changed files with 44 additions and 12 deletions

View File

@ -195,28 +195,60 @@ void smbios_fill_dimm_manufacturer_from_id(uint16_t mod_id,
} }
} }
/* This function will fill the corresponding part number */ static void trim_trailing_whitespace(char *buffer, size_t buffer_size)
static void smbios_fill_dimm_part_number(char *part_number,
struct smbios_type17 *t)
{ {
int i, invalid; size_t len = strnlen(buffer, buffer_size);
if (len == 0)
return;
for (char *p = buffer + len - 1; p >= buffer; --p) {
if (*p == ' ')
*p = 0;
else
break;
}
}
/** This function will fill the corresponding part number */
static void smbios_fill_dimm_part_number(const char *part_number,
struct smbios_type17 *t)
{
const size_t trimmed_buffer_size = DIMM_INFO_PART_NUMBER_SIZE;
int invalid;
size_t i, len;
char trimmed_part_number[trimmed_buffer_size];
strncpy(trimmed_part_number, part_number, trimmed_buffer_size);
trimmed_part_number[trimmed_buffer_size - 1] = '\0';
/*
* SPD mandates that unused characters be represented with a ' '.
* We don't want to publish the whitespace in the SMBIOS tables.
*/
trim_trailing_whitespace(trimmed_part_number, trimmed_buffer_size);
len = strlen(trimmed_part_number);
invalid = 0; /* assume valid */ invalid = 0; /* assume valid */
for (i = 0; i < DIMM_INFO_PART_NUMBER_SIZE - 1; i++) { for (i = 0; i < len - 1; i++) {
if (part_number[i] < ' ') { if (trimmed_part_number[i] < ' ') {
invalid = 1; invalid = 1;
part_number[i] = '*'; trimmed_part_number[i] = '*';
} }
} }
if (invalid) { if (invalid) {
char string_buffer[64]; char string_buffer[trimmed_buffer_size +
10 /* strlen("Invalid ()") */];
snprintf(string_buffer, sizeof(string_buffer), "Invalid (%s)", snprintf(string_buffer, sizeof(string_buffer), "Invalid (%s)",
part_number); trimmed_part_number);
t->part_number = smbios_add_string(t->eos, string_buffer); t->part_number = smbios_add_string(t->eos, string_buffer);
} else } else {
t->part_number = smbios_add_string(t->eos, part_number); t->part_number = smbios_add_string(t->eos, trimmed_part_number);
}
} }
static int create_smbios_type17_for_dimm(struct dimm_info *dimm, static int create_smbios_type17_for_dimm(struct dimm_info *dimm,