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>
This commit is contained in:
Nico Huber
2020-07-18 14:23:41 +02:00
committed by Patrick Georgi
parent 2f6d5551b0
commit 14adb7eaa9
5 changed files with 30 additions and 15 deletions

View File

@@ -38,7 +38,7 @@ struct cbmem_console {
#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 struct console_output_driver cbmem_console_driver =
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 @@ void cbmem_console_write(const void *buffer, size_t count)
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;