summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/arch/x86/car.ld3
-rw-r--r--src/arch/x86/include/arch/symbols.h3
-rw-r--r--src/drivers/usb/ehci_debug.c19
3 files changed, 17 insertions, 8 deletions
diff --git a/src/arch/x86/car.ld b/src/arch/x86/car.ld
index 7b10f4313b..1b0d996b8a 100644
--- a/src/arch/x86/car.ld
+++ b/src/arch/x86/car.ld
@@ -67,7 +67,8 @@
_car_drivers_storage_end = .;
#endif
_car_ehci_dbg_info_start = .;
- . += 64;
+ /* Reserve sizeof(struct ehci_dbg_info). */
+ . += 88;
_car_ehci_dbg_info_end = .;
/* _car_global_start and _car_global_end provide symbols to per-stage
* variables that are not shared like the timestamp and the pre-ram
diff --git a/src/arch/x86/include/arch/symbols.h b/src/arch/x86/include/arch/symbols.h
index 9ef6a3b89e..97a07c0746 100644
--- a/src/arch/x86/include/arch/symbols.h
+++ b/src/arch/x86/include/arch/symbols.h
@@ -35,6 +35,9 @@ extern char _car_stack_end[];
#define _car_stack_size (_car_stack_end - _car_stack_start)
extern char _car_ehci_dbg_info_start[];
+extern char _car_ehci_dbg_info_end[];
+#define _car_ehci_dbg_info_size \
+ (_car_ehci_dbg_info_end - _car_ehci_dbg_info_start)
/*
* The _car_relocatable_data_[start|end] symbols cover CAR data which is
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);
}