Patrick Georgi submitted this change.

View Change

Approvals: build bot (Jenkins): Verified Julius Werner: Looks good to me, approved Angel Pons: Looks good to me, approved
libpayload: Cache physical cbmem console address

Same as with other consoles and drivers that cache an address
outside the payload (e.g. video/corebootfb), we should store the
physical address, so we can derive the virtual address on demand.
This makes it save to use the address across relocations.

As a first step in migrating `libsysinfo` to `uintptr_t`, we
also switch to the physical address there.

Fixes the default build of FILO, tested with Qemu/i440FX and Qemu/Q35.

Change-Id: I4b8434af69e0526f78523ae61981a15abb1295b0
Signed-off-by: Nico Huber <nico.h@gmx.de>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/37478
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Julius Werner <jwerner@chromium.org>
Reviewed-by: Angel Pons <th3fanbus@gmail.com>
---
M payloads/coreinfo/bootlog_module.c
M payloads/libpayload/drivers/cbmem_console.c
M payloads/libpayload/include/coreboot_tables.h
M payloads/libpayload/include/sysinfo.h
M payloads/libpayload/libc/coreboot.c
5 files changed, 30 insertions(+), 15 deletions(-)

diff --git a/payloads/coreinfo/bootlog_module.c b/payloads/coreinfo/bootlog_module.c
index 1502a55..da9860a 100644
--- a/payloads/coreinfo/bootlog_module.c
+++ b/payloads/coreinfo/bootlog_module.c
@@ -110,7 +110,7 @@
return -1;
}

- struct cbmem_console *console = lib_sysinfo.cbmem_cons;
+ struct cbmem_console *console = phys_to_virt(lib_sysinfo.cbmem_cons);
if (console == NULL) {
return -1;
}
diff --git a/payloads/libpayload/drivers/cbmem_console.c b/payloads/libpayload/drivers/cbmem_console.c
index 053802c..22d5312 100644
--- a/payloads/libpayload/drivers/cbmem_console.c
+++ b/payloads/libpayload/drivers/cbmem_console.c
@@ -38,7 +38,7 @@
#define CURSOR_MASK ((1 << 28) - 1)
#define OVERFLOW (1 << 31)

-static struct cbmem_console *cbmem_console_p;
+static uintptr_t cbmem_console_p;

static struct console_output_driver cbmem_console_driver =
{
@@ -47,27 +47,32 @@

static void do_write(const void *buffer, size_t count)
{
- memcpy(cbmem_console_p->body + (cbmem_console_p->cursor & CURSOR_MASK),
- buffer, count);
- cbmem_console_p->cursor += count;
+ struct cbmem_console *const cbmem_cons = phys_to_virt(cbmem_console_p);
+
+ memcpy(cbmem_cons->body + (cbmem_cons->cursor & CURSOR_MASK), buffer, count);
+ cbmem_cons->cursor += count;
}

void cbmem_console_init(void)
{
+ const struct cbmem_console *const cbmem_cons = phys_to_virt(lib_sysinfo.cbmem_cons);
+
cbmem_console_p = lib_sysinfo.cbmem_cons;
- if (cbmem_console_p && cbmem_console_p->size)
+
+ if (cbmem_console_p && cbmem_cons->size)
console_add_output_driver(&cbmem_console_driver);
}

void cbmem_console_write(const void *buffer, size_t count)
{
- while ((cbmem_console_p->cursor & CURSOR_MASK) + count >=
- cbmem_console_p->size) {
- size_t still_fits = cbmem_console_p->size -
- (cbmem_console_p->cursor & CURSOR_MASK);
+ struct cbmem_console *const cbmem_cons = phys_to_virt(cbmem_console_p);
+
+ while ((cbmem_cons->cursor & CURSOR_MASK) + count >=
+ cbmem_cons->size) {
+ size_t still_fits = cbmem_cons->size - (cbmem_cons->cursor & CURSOR_MASK);
do_write(buffer, still_fits);
- cbmem_console_p->cursor &= ~CURSOR_MASK;
- cbmem_console_p->cursor |= OVERFLOW;
+ cbmem_cons->cursor &= ~CURSOR_MASK;
+ cbmem_cons->cursor |= OVERFLOW;
buffer += still_fits;
count -= still_fits;
}
@@ -77,7 +82,7 @@

char *cbmem_console_snapshot(void)
{
- const struct cbmem_console *console_p = cbmem_console_p;
+ const struct cbmem_console *const console_p = phys_to_virt(cbmem_console_p);
char *console_c;
uint32_t size, cursor, overflow;

diff --git a/payloads/libpayload/include/coreboot_tables.h b/payloads/libpayload/include/coreboot_tables.h
index 91d3520..c281417 100644
--- a/payloads/libpayload/include/coreboot_tables.h
+++ b/payloads/libpayload/include/coreboot_tables.h
@@ -31,6 +31,7 @@

#include <arch/types.h>
#include <ipchksum.h>
+#include <stdint.h>

enum {
CB_TAG_UNUSED = 0x0000,
@@ -396,4 +397,5 @@

/* Helper functions */
void *get_cbmem_ptr(unsigned char *ptr);
+uintptr_t get_cbmem_addr(const void *cbmem_tab_entry);
#endif
diff --git a/payloads/libpayload/include/sysinfo.h b/payloads/libpayload/include/sysinfo.h
index 6e83f68..3b1b9c9 100644
--- a/payloads/libpayload/include/sysinfo.h
+++ b/payloads/libpayload/include/sysinfo.h
@@ -29,6 +29,8 @@
#ifndef _SYSINFO_H
#define _SYSINFO_H

+#include <stdint.h>
+
/* Maximum number of memory range definitions. */
#define SYSINFO_MAX_MEM_RANGES 32
/* Allow a maximum of 8 GPIOs */
@@ -101,7 +103,7 @@
#endif

void *tstamp_table;
- void *cbmem_cons;
+ uintptr_t cbmem_cons;
void *mrc_cache;
void *acpi_gnvs;

diff --git a/payloads/libpayload/libc/coreboot.c b/payloads/libpayload/libc/coreboot.c
index c6fb57f..25812e5 100644
--- a/payloads/libpayload/libc/coreboot.c
+++ b/payloads/libpayload/libc/coreboot.c
@@ -47,6 +47,12 @@
return phys_to_virt(cbmem->cbmem_tab);
}

+uintptr_t get_cbmem_addr(const void *const cbmem_tab_entry)
+{
+ const struct cb_cbmem_tab *const cbmem = cbmem_tab_entry;
+ return cbmem->cbmem_tab;
+}
+
static void cb_parse_memory(void *ptr, struct sysinfo_t *info)
{
struct cb_memory *mem = ptr;
@@ -135,7 +141,7 @@

static void cb_parse_cbmem_cons(unsigned char *ptr, struct sysinfo_t *info)
{
- info->cbmem_cons = get_cbmem_ptr(ptr);
+ info->cbmem_cons = get_cbmem_addr(ptr);
}

static void cb_parse_acpi_gnvs(unsigned char *ptr, struct sysinfo_t *info)

To view, visit change 37478. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-Project: coreboot
Gerrit-Branch: master
Gerrit-Change-Id: I4b8434af69e0526f78523ae61981a15abb1295b0
Gerrit-Change-Number: 37478
Gerrit-PatchSet: 4
Gerrit-Owner: Nico Huber <nico.h@gmx.de>
Gerrit-Reviewer: Felix Singer <felixsinger@posteo.net>
Gerrit-Reviewer: Angel Pons <th3fanbus@gmail.com>
Gerrit-Reviewer: Julius Werner <jwerner@chromium.org>
Gerrit-Reviewer: Nico Huber <nico.h@gmx.de>
Gerrit-Reviewer: Patrick Georgi <pgeorgi@google.com>
Gerrit-Reviewer: Reto Buerki <reet@codelabs.ch>
Gerrit-Reviewer: build bot (Jenkins) <no-reply@coreboot.org>
Gerrit-CC: Paul Menzel <paulepanter@users.sourceforge.net>
Gerrit-MessageType: merged