libpayload: Implement reading from CBMEM console
To support showing CBMEM logs on recovery screen, add a function cbmem_console_snapshot() to copy the CBMEM console to an allocated buffer. Non-printable characters are automatically replaced with '?' to ensure the returned string is printable. BRANCH=none BUG=b:146105976 TEST=emerge-nami libpayload Change-Id: Ie324055f5fd8276f1d833fc9d04f60a792dbb9f6 Signed-off-by: Yu-Ping Wu <yupingso@chromium.org> Reviewed-on: https://review.coreboot.org/c/coreboot/+/37667 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Hung-Te Lin <hungte@chromium.org>
This commit is contained in:
parent
c32ca089c9
commit
41956b5742
|
@ -75,3 +75,49 @@ void cbmem_console_write(const void *buffer, size_t count)
|
||||||
|
|
||||||
do_write(buffer, count);
|
do_write(buffer, count);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char *cbmem_console_snapshot(void)
|
||||||
|
{
|
||||||
|
const struct cbmem_console *console_p = cbmem_console_p;
|
||||||
|
char *console_c;
|
||||||
|
uint32_t size, cursor, overflow;
|
||||||
|
|
||||||
|
if (!console_p) {
|
||||||
|
printf("ERROR: No cbmem console found in coreboot table\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
cursor = console_p->cursor & CURSOR_MASK;
|
||||||
|
overflow = console_p->cursor & OVERFLOW;
|
||||||
|
if (!overflow && cursor < console_p->size)
|
||||||
|
size = cursor;
|
||||||
|
else
|
||||||
|
size = console_p->size;
|
||||||
|
|
||||||
|
console_c = malloc(size + 1);
|
||||||
|
if (!console_c) {
|
||||||
|
printf("ERROR: Not enough memory for console (size = %u)\n",
|
||||||
|
size);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
console_c[size] = '\0';
|
||||||
|
|
||||||
|
if (overflow) {
|
||||||
|
if (cursor >= size) {
|
||||||
|
printf("ERROR: CBMEM console struct is corrupted\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
memcpy(console_c, console_p->body + cursor, size - cursor);
|
||||||
|
memcpy(console_c + size - cursor, console_p->body, cursor);
|
||||||
|
} else {
|
||||||
|
memcpy(console_c, console_p->body, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Slight memory corruption may occur between reboots and give us a few
|
||||||
|
unprintable characters like '\0'. Replace them with '?' on output. */
|
||||||
|
for (cursor = 0; cursor < size; cursor++)
|
||||||
|
if (!isprint(console_c[cursor]) && !isspace(console_c[cursor]))
|
||||||
|
console_c[cursor] = '?';
|
||||||
|
|
||||||
|
return console_c;
|
||||||
|
}
|
||||||
|
|
|
@ -313,6 +313,13 @@ void video_printf(int foreground, int background, enum video_printf_align align,
|
||||||
*/
|
*/
|
||||||
void cbmem_console_init(void);
|
void cbmem_console_init(void);
|
||||||
void cbmem_console_write(const void *buffer, size_t count);
|
void cbmem_console_write(const void *buffer, size_t count);
|
||||||
|
/**
|
||||||
|
* Take a snapshot of the CBMEM memory console. This function will allocate a
|
||||||
|
* range of memory. Callers must free the returned buffer by themselves.
|
||||||
|
*
|
||||||
|
* @return The allocated buffer on success, NULL on failure.
|
||||||
|
*/
|
||||||
|
char *cbmem_console_snapshot(void);
|
||||||
/** @} */
|
/** @} */
|
||||||
|
|
||||||
/* drivers/option.c */
|
/* drivers/option.c */
|
||||||
|
|
Loading…
Reference in New Issue