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:
committed by
Patrick Georgi
parent
2f6d5551b0
commit
14adb7eaa9
@ -110,7 +110,7 @@ static int bootlog_module_init(void)
|
||||
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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
|
@ -31,6 +31,7 @@
|
||||
|
||||
#include <arch/types.h>
|
||||
#include <ipchksum.h>
|
||||
#include <stdint.h>
|
||||
|
||||
enum {
|
||||
CB_TAG_UNUSED = 0x0000,
|
||||
@ -396,4 +397,5 @@ static inline const char *cb_mb_part_string(const struct cb_mainboard *cbm)
|
||||
|
||||
/* Helper functions */
|
||||
void *get_cbmem_ptr(unsigned char *ptr);
|
||||
uintptr_t get_cbmem_addr(const void *cbmem_tab_entry);
|
||||
#endif
|
||||
|
@ -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 @@ struct sysinfo_t {
|
||||
#endif
|
||||
|
||||
void *tstamp_table;
|
||||
void *cbmem_cons;
|
||||
uintptr_t cbmem_cons;
|
||||
void *mrc_cache;
|
||||
void *acpi_gnvs;
|
||||
|
||||
|
@ -47,6 +47,12 @@ void *get_cbmem_ptr(unsigned char *ptr)
|
||||
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_tstamp(unsigned char *ptr, struct sysinfo_t *info)
|
||||
|
||||
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)
|
||||
|
Reference in New Issue
Block a user