diff options
author | Kyösti Mälkki <kyosti.malkki@gmail.com> | 2019-01-31 08:29:32 +0200 |
---|---|---|
committer | Kyösti Mälkki <kyosti.malkki@gmail.com> | 2019-02-02 23:48:23 +0000 |
commit | f88208e0acbcb771fdbf5ef851eb6aec12ccc188 (patch) | |
tree | 2b6d66c5cd918ab7d725239c04a1aaea06580a3f /src/drivers/usb | |
parent | 909be6a7d8ea87e23e4098a97c23e3263a80057d (diff) |
usbdebug: Fix reserve in CAR
We need sizeof(struct ehci_dbg_info) of 88 but only
reserved 64 bytes. If usbdebug_hw_init() was called
late in romstage, for some builds it would corrupt
CAR_GLOBALs like console_inited variable and stop
logging anything.
Also change pointer initialisation such that
glob_dbg_info will hit garbage collection for
PRE_RAM stages.
Change-Id: Ib49fca781e55619179aa8888e2d859560e050876
Signed-off-by: Kyösti Mälkki <kyosti.malkki@gmail.com>
Reviewed-on: https://review.coreboot.org/c/31174
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Arthur Heymans <arthur@aheymans.xyz>
Reviewed-by: Nico Huber <nico.h@gmx.de>
Diffstat (limited to 'src/drivers/usb')
-rw-r--r-- | src/drivers/usb/ehci_debug.c | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/src/drivers/usb/ehci_debug.c b/src/drivers/usb/ehci_debug.c index 18d0491b04..c5fb984d54 100644 --- a/src/drivers/usb/ehci_debug.c +++ b/src/drivers/usb/ehci_debug.c @@ -66,13 +66,18 @@ static struct ehci_debug_info * glob_dbg_info_p CAR_GLOBAL; static inline struct ehci_debug_info *dbgp_ehci_info(void) { - if (IS_ENABLED(CONFIG_USBDEBUG_IN_PRE_RAM) - && (ENV_ROMSTAGE || ENV_BOOTBLOCK || ENV_VERSTAGE)) - glob_dbg_info_p = - (struct ehci_debug_info *)_car_ehci_dbg_info_start; - if (car_get_var(glob_dbg_info_p) == NULL) - car_set_var(glob_dbg_info_p, &glob_dbg_info); - + if (car_get_var(glob_dbg_info_p) == NULL) { + struct ehci_debug_info *info; + if (ENV_BOOTBLOCK || ENV_VERSTAGE || ENV_ROMSTAGE) { + /* The message likely does not show if we hit this. */ + if (sizeof(*info) > _car_ehci_dbg_info_size) + die("BUG: Increase ehci_dbg_info reserve in CAR"); + info = (void *)_car_ehci_dbg_info_start; + } else { + info = &glob_dbg_info; + } + car_set_var(glob_dbg_info_p, info); + } return car_get_var(glob_dbg_info_p); } |