From 7dd5bbd712e2f1a387043299d835b5ccf2189a70 Mon Sep 17 00:00:00 2001 From: Julius Werner Date: Mon, 1 Dec 2014 18:08:03 -0800 Subject: [PATCH] cbmem: Unify random on-CBMEM-init tasks under common CBMEM_INIT_HOOK() API There are several use cases for performing a certain task when CBMEM is first set up (usually to migrate some data into it that was previously kept in BSS/SRAM/hammerspace), and unfortunately we handle each of them differently: timestamp migration is called explicitly from cbmem_initialize(), certain x86-chipset-specific tasks use the CAR_MIGRATION() macro to register a hook, and the CBMEM console is migrated through a direct call from romstage (on non-x86 and SandyBridge boards). This patch decouples the CAR_MIGRATION() hook mechanism from cache-as-RAM and rechristens it to CBMEM_INIT_HOOK(), which is a clearer description of what it really does. All of the above use cases are ported to this new, consistent model, allowing us to have one less line of boilerplate in non-CAR romstages. BRANCH=None BUG=None TEST=Built and booted on Nyan_Blaze and Falco with and without CONFIG_CBMEM_CONSOLE. Confirmed that 'cbmem -c' shows the full log after boot (and the resume log after S3 resume on Falco). Compiled for Parrot, Stout and Lumpy. Change-Id: I1681b372664f5a1f15c3733cbd32b9b11f55f8ea Signed-off-by: Julius Werner Reviewed-on: https://chromium-review.googlesource.com/232612 Reviewed-by: Aaron Durbin --- src/arch/arm/include/arch/early_variables.h | 1 - src/arch/arm64/include/arch/early_variables.h | 1 - src/arch/mips/include/arch/early_variables.h | 1 - src/arch/x86/include/arch/early_variables.h | 7 ------- src/arch/x86/init/romstage.ld | 8 ++++---- src/cpu/x86/car.c | 13 ------------- src/include/cbmem.h | 6 ++++++ src/include/timestamp.h | 5 ----- src/lib/Makefile.inc | 3 ++- src/lib/cbmem.c | 7 +++---- src/lib/{cbmem_info.c => cbmem_common.c} | 18 ++++++++++++++++++ src/lib/cbmem_console.c | 4 ++-- src/lib/dynamic_cbmem.c | 10 ++-------- src/lib/romstage.ld | 4 ++++ src/lib/timestamp.c | 3 ++- src/mainboard/emulation/qemu-x86/romstage.c | 6 ------ src/mainboard/google/butterfly/romstage.c | 5 ----- src/mainboard/google/link/romstage.c | 5 ----- src/mainboard/google/nyan/romstage.c | 4 ---- src/mainboard/google/nyan_big/romstage.c | 4 ---- src/mainboard/google/nyan_blaze/romstage.c | 4 ---- src/mainboard/google/parrot/romstage.c | 5 ----- src/mainboard/google/stout/romstage.c | 5 ----- src/mainboard/intel/emeraldlake2/romstage.c | 5 ----- src/mainboard/samsung/lumpy/romstage.c | 5 ----- src/mainboard/samsung/stumpy/romstage.c | 5 ----- src/northbridge/intel/sandybridge/raminit.c | 3 +++ src/soc/intel/baytrail/romstage/romstage.c | 2 +- src/soc/intel/broadwell/romstage/power_state.c | 2 +- src/soc/nvidia/tegra132/romstage.c | 2 -- 30 files changed, 48 insertions(+), 105 deletions(-) rename src/lib/{cbmem_info.c => cbmem_common.c} (79%) diff --git a/src/arch/arm/include/arch/early_variables.h b/src/arch/arm/include/arch/early_variables.h index 3d9fa26397..31b26c739a 100644 --- a/src/arch/arm/include/arch/early_variables.h +++ b/src/arch/arm/include/arch/early_variables.h @@ -26,7 +26,6 @@ #define CAR_GLOBAL -#define CAR_MIGRATE(migrate_fn_) static inline void *car_get_var_ptr(void *var) { return var; } #define car_get_var(var) (var) #define car_set_var(var, val) do { (var) = (val); } while (0) diff --git a/src/arch/arm64/include/arch/early_variables.h b/src/arch/arm64/include/arch/early_variables.h index 3d9fa26397..31b26c739a 100644 --- a/src/arch/arm64/include/arch/early_variables.h +++ b/src/arch/arm64/include/arch/early_variables.h @@ -26,7 +26,6 @@ #define CAR_GLOBAL -#define CAR_MIGRATE(migrate_fn_) static inline void *car_get_var_ptr(void *var) { return var; } #define car_get_var(var) (var) #define car_set_var(var, val) do { (var) = (val); } while (0) diff --git a/src/arch/mips/include/arch/early_variables.h b/src/arch/mips/include/arch/early_variables.h index a81a6b4037..4365cedd92 100644 --- a/src/arch/mips/include/arch/early_variables.h +++ b/src/arch/mips/include/arch/early_variables.h @@ -21,7 +21,6 @@ #define __MIPS_ARCH_EARLY_VARIABLES_H #define CAR_GLOBAL -#define CAR_MIGRATE(migrate_fn_) static inline void car_migrate_variables(void) {} #define car_get_var(var) (var) diff --git a/src/arch/x86/include/arch/early_variables.h b/src/arch/x86/include/arch/early_variables.h index 9ee13124ef..830212def9 100644 --- a/src/arch/x86/include/arch/early_variables.h +++ b/src/arch/x86/include/arch/early_variables.h @@ -27,12 +27,6 @@ #endif #if CONFIG_CAR_MIGRATION && defined(__PRE_RAM__) -#define CAR_MIGRATE_ATTR __attribute__ ((used,section (".car.migrate"))) - -/* Call migrate_fn_() when CAR globals are migrated. */ -#define CAR_MIGRATE(migrate_fn_) \ - static void (* const migrate_fn_ ## _ptr)(void) CAR_MIGRATE_ATTR = \ - migrate_fn_; /* Get the correct pointer for the CAR global variable. */ void *car_get_var_ptr(void *var); @@ -47,7 +41,6 @@ void *car_get_var_ptr(void *var); void car_migrate_variables(void); #else -#define CAR_MIGRATE(migrate_fn_) static inline void *car_get_var_ptr(void *var) { return var; } #define car_get_var(var) (var) #define car_set_var(var, val) do { (var) = (val); } while (0) diff --git a/src/arch/x86/init/romstage.ld b/src/arch/x86/init/romstage.ld index 3fbadbb7aa..0c178c6e0d 100644 --- a/src/arch/x86/init/romstage.ld +++ b/src/arch/x86/init/romstage.ld @@ -31,14 +31,14 @@ SECTIONS _rom = .; *(.rom.text); *(.rom.data); + . = ALIGN(4); + _cbmem_init_hooks = .; + KEEP(*(.rodata.cbmem_init_hooks)); + _ecbmem_init_hooks = .; *(.rodata); *(.rodata.*); *(.rom.data.*); . = ALIGN(16); - _car_migrate_start = .; - *(.car.migrate); - _car_migrate_end = .; - . = ALIGN(16); _erom = .; } diff --git a/src/cpu/x86/car.c b/src/cpu/x86/car.c index 23282cd89c..cdcfec1f40 100644 --- a/src/cpu/x86/car.c +++ b/src/cpu/x86/car.c @@ -23,11 +23,6 @@ #include #include -typedef void (* const car_migration_func_t)(void); - -extern car_migration_func_t _car_migrate_start; -extern car_migration_func_t _car_migrate_end; - extern char _car_data_start[]; extern char _car_data_end[]; @@ -77,7 +72,6 @@ void *car_get_var_ptr(void *var) void car_migrate_variables(void) { void *migrated_base; - car_migration_func_t *migrate_func; size_t car_data_size = &_car_data_end[0] - &_car_data_start[0]; migrated_base = cbmem_add(CBMEM_ID_CAR_GLOBALS, car_data_size); @@ -91,11 +85,4 @@ void car_migrate_variables(void) /* Mark that the data has been moved. */ car_migrated = ~0; - - /* Call all the migration functions. */ - migrate_func = &_car_migrate_start; - while (migrate_func != &_car_migrate_end) { - (*migrate_func)(); - migrate_func++; - } } diff --git a/src/include/cbmem.h b/src/include/cbmem.h index 783c70f137..058fb64e88 100644 --- a/src/include/cbmem.h +++ b/src/include/cbmem.h @@ -203,13 +203,19 @@ void *cbmem_add(u32 id, u64 size); /* Find a cbmem entry of a given id. These return NULL on failure. */ void *cbmem_find(u32 id); +typedef void (* const cbmem_init_hook_t)(void); +#define CBMEM_INIT_HOOK(init_fn_) static cbmem_init_hook_t init_fn_ ## _ptr \ + __attribute__((used, section(".rodata.cbmem_init_hooks"))) = init_fn_; + #ifndef __PRE_RAM__ /* Ramstage only functions. */ void cbmem_list(void); void cbmem_arch_init(void); void cbmem_print_entry(int n, u32 id, u64 start, u64 size); +static inline void cbmem_run_init_hooks(void) {} #else static inline void cbmem_arch_init(void) {} +void cbmem_run_init_hooks(void); #endif /* __PRE_RAM__ */ #endif /* __ASSEMBLER__ */ diff --git a/src/include/timestamp.h b/src/include/timestamp.h index cf376f6ea6..33fb83058a 100644 --- a/src/include/timestamp.h +++ b/src/include/timestamp.h @@ -90,11 +90,6 @@ void timestamp_init(uint64_t base); void timestamp_add(enum timestamp_id id, uint64_t ts_time); /* Calls timestamp_add with current timestamp. */ void timestamp_add_now(enum timestamp_id id); -/* - * Sync all timestamps from timestamp_cache to cbmem area. Called by - * cbmem_initialize. - */ -void timestamp_sync(void); /* Implemented by the architecture code */ uint64_t timestamp_get(void); #else diff --git a/src/lib/Makefile.inc b/src/lib/Makefile.inc index 91b16ee070..2fc3cd33d8 100644 --- a/src/lib/Makefile.inc +++ b/src/lib/Makefile.inc @@ -116,7 +116,8 @@ else ramstage-y += cbmem.c romstage-$(CONFIG_HAVE_ACPI_RESUME) += cbmem.c endif # CONFIG_DYNAMIC_CBMEM -ramstage-y += cbmem_info.c +romstage-y += cbmem_common.c +ramstage-y += cbmem_common.c ramstage-y += hexdump.c romstage-y += hexdump.c diff --git a/src/lib/cbmem.c b/src/lib/cbmem.c index a2cf8e3839..85908c9453 100644 --- a/src/lib/cbmem.c +++ b/src/lib/cbmem.c @@ -230,12 +230,11 @@ int cbmem_initialize(void) #ifndef __PRE_RAM__ cbmem_arch_init(); #endif + cbmem_run_init_hooks(); + /* Migrate cache-as-ram variables. */ car_migrate_variables(); - /* Pull in all timestamps from timestamp cache into cbmem area */ - timestamp_sync(); - return rv; } #endif @@ -271,6 +270,6 @@ void cbmem_list(void) cbmem_toc[i].size); } } -#endif +#endif /* ! __PRE_RAM__ */ diff --git a/src/lib/cbmem_info.c b/src/lib/cbmem_common.c similarity index 79% rename from src/lib/cbmem_info.c rename to src/lib/cbmem_common.c index 7b1168dc4e..467bc7c529 100644 --- a/src/lib/cbmem_info.c +++ b/src/lib/cbmem_common.c @@ -20,6 +20,8 @@ #include #include +#ifndef __PRE_RAM__ + static const struct cbmem_id_to_name cbmem_ids[] = { CBMEM_ID_TO_NAME_TABLE }; void cbmem_print_entry(int n, u32 id, u64 base, u64 size) @@ -43,3 +45,19 @@ void cbmem_print_entry(int n, u32 id, u64 base, u64 size) printk(BIOS_DEBUG, "%08llx ", base); printk(BIOS_DEBUG, "%08llx\n", size); } + +#else /* __PRE_RAM__ */ + +extern cbmem_init_hook_t _cbmem_init_hooks; +extern cbmem_init_hook_t _ecbmem_init_hooks; + +void cbmem_run_init_hooks(void) +{ + cbmem_init_hook_t *init_hook_ptr = &_cbmem_init_hooks; + while (init_hook_ptr != &_ecbmem_init_hooks) { + (*init_hook_ptr)(); + init_hook_ptr++; + } +} + +#endif /* __PRE_RAM__ */ diff --git a/src/lib/cbmem_console.c b/src/lib/cbmem_console.c index d3188670dd..0238f2eae1 100644 --- a/src/lib/cbmem_console.c +++ b/src/lib/cbmem_console.c @@ -233,5 +233,5 @@ void cbmemc_reinit(void) current_console_set(cbm_cons_p); } -/* Call cbmemc_reinit() at CAR migration time. */ -CAR_MIGRATE(cbmemc_reinit) +/* Call cbmemc_reinit() at cbmem_initialize() time. */ +CBMEM_INIT_HOOK(cbmemc_reinit) diff --git a/src/lib/dynamic_cbmem.c b/src/lib/dynamic_cbmem.c index a613596242..842c95bde2 100644 --- a/src/lib/dynamic_cbmem.c +++ b/src/lib/dynamic_cbmem.c @@ -184,20 +184,16 @@ void cbmem_initialize_empty(void) root, root->max_entries); cbmem_arch_init(); + cbmem_run_init_hooks(); /* Migrate cache-as-ram variables. */ car_migrate_variables(); - - /* Pull in all timestamps from timestamp cache into cbmem area */ - timestamp_sync(); } static inline int cbmem_fail_recovery(void) { cbmem_initialize_empty(); cbmem_handle_acpi_resume(); - /* Migrate cache-as-ram variables. */ - car_migrate_variables(); return 1; } @@ -265,13 +261,11 @@ int cbmem_initialize(void) #endif cbmem_arch_init(); + cbmem_run_init_hooks(); /* Migrate cache-as-ram variables. */ car_migrate_variables(); - /* Pull in all timestamps from timestamp cache into cbmem area */ - timestamp_sync(); - /* Recovery successful. */ return 0; } diff --git a/src/lib/romstage.ld b/src/lib/romstage.ld index c3a2643787..bbad333adf 100644 --- a/src/lib/romstage.ld +++ b/src/lib/romstage.ld @@ -29,6 +29,10 @@ } : to_load .data . : { + . = ALIGN(8); + _cbmem_init_hooks = .; + KEEP(*(.rodata.cbmem_init_hooks)); + _ecbmem_init_hooks = .; *(.rodata); *(.rodata.*); *(.data); diff --git a/src/lib/timestamp.c b/src/lib/timestamp.c index 1af491dc48..d3404021b7 100644 --- a/src/lib/timestamp.c +++ b/src/lib/timestamp.c @@ -155,7 +155,7 @@ static void timestamp_add_table_entry(struct timestamp_table *ts_table, tse->entry_stamp = ts_time - ts_table->base_time; } -void timestamp_sync(void) +static void timestamp_sync(void) { uint32_t i; @@ -214,6 +214,7 @@ void timestamp_sync(void) if (ts_cbmem_table->base_time == 0) ts_cbmem_table->base_time = ts_cache_table->base_time; } +CBMEM_INIT_HOOK(timestamp_sync) void timestamp_early_init(uint64_t base) { diff --git a/src/mainboard/emulation/qemu-x86/romstage.c b/src/mainboard/emulation/qemu-x86/romstage.c index c80a25de91..74e9e8a50f 100644 --- a/src/mainboard/emulation/qemu-x86/romstage.c +++ b/src/mainboard/emulation/qemu-x86/romstage.c @@ -52,10 +52,4 @@ void main(unsigned long bist) timestamp_init(rdtsc()); timestamp_add_now(TS_START_ROMSTAGE); - -#if CONFIG_CONSOLE_CBMEM - /* Keep this the last thing this function does. */ - cbmemc_reinit(); -#endif - } diff --git a/src/mainboard/google/butterfly/romstage.c b/src/mainboard/google/butterfly/romstage.c index e33415ef54..02040d2c74 100644 --- a/src/mainboard/google/butterfly/romstage.c +++ b/src/mainboard/google/butterfly/romstage.c @@ -289,9 +289,4 @@ void main(unsigned long bist) timestamp_add(TS_BEFORE_INITRAM, before_dram_time ); timestamp_add(TS_AFTER_INITRAM, after_dram_time ); timestamp_add_now(TS_END_ROMSTAGE); - -#if CONFIG_CONSOLE_CBMEM - /* Keep this the last thing this function does. */ - cbmemc_reinit(); -#endif } diff --git a/src/mainboard/google/link/romstage.c b/src/mainboard/google/link/romstage.c index 6e07ee0843..a122b10d78 100644 --- a/src/mainboard/google/link/romstage.c +++ b/src/mainboard/google/link/romstage.c @@ -331,9 +331,4 @@ void main(unsigned long bist) timestamp_add(TS_BEFORE_INITRAM, before_dram_time ); timestamp_add(TS_AFTER_INITRAM, after_dram_time ); timestamp_add_now(TS_END_ROMSTAGE); - -#if CONFIG_CONSOLE_CBMEM - /* Keep this the last thing this function does. */ - cbmemc_reinit(); -#endif } diff --git a/src/mainboard/google/nyan/romstage.c b/src/mainboard/google/nyan/romstage.c index e05ee5fa0d..a65d7f6ce4 100644 --- a/src/mainboard/google/nyan/romstage.c +++ b/src/mainboard/google/nyan/romstage.c @@ -89,10 +89,6 @@ static void __attribute__((noinline)) romstage(void) early_mainboard_init(); -#if CONFIG_CONSOLE_CBMEM - cbmemc_reinit(); -#endif - vboot_verify_firmware(romstage_handoff_find_or_add()); timestamp_add_now(TS_START_COPYRAM); diff --git a/src/mainboard/google/nyan_big/romstage.c b/src/mainboard/google/nyan_big/romstage.c index e05ee5fa0d..a65d7f6ce4 100644 --- a/src/mainboard/google/nyan_big/romstage.c +++ b/src/mainboard/google/nyan_big/romstage.c @@ -89,10 +89,6 @@ static void __attribute__((noinline)) romstage(void) early_mainboard_init(); -#if CONFIG_CONSOLE_CBMEM - cbmemc_reinit(); -#endif - vboot_verify_firmware(romstage_handoff_find_or_add()); timestamp_add_now(TS_START_COPYRAM); diff --git a/src/mainboard/google/nyan_blaze/romstage.c b/src/mainboard/google/nyan_blaze/romstage.c index 144f4168d2..837b681825 100644 --- a/src/mainboard/google/nyan_blaze/romstage.c +++ b/src/mainboard/google/nyan_blaze/romstage.c @@ -92,10 +92,6 @@ static void __attribute__((noinline)) romstage(void) cbmem_initialize_empty(); -#if CONFIG_CONSOLE_CBMEM - cbmemc_reinit(); -#endif - #if CONFIG_VBOOT2_VERIFY_FIRMWARE entry = vboot2_load_ramstage(); #else diff --git a/src/mainboard/google/parrot/romstage.c b/src/mainboard/google/parrot/romstage.c index f33852b081..78758d5935 100644 --- a/src/mainboard/google/parrot/romstage.c +++ b/src/mainboard/google/parrot/romstage.c @@ -289,9 +289,4 @@ void main(unsigned long bist) timestamp_add(TS_BEFORE_INITRAM, before_dram_time ); timestamp_add(TS_AFTER_INITRAM, after_dram_time ); timestamp_add_now(TS_END_ROMSTAGE); - -#if CONFIG_CONSOLE_CBMEM - /* Keep this the last thing this function does. */ - cbmemc_reinit(); -#endif } diff --git a/src/mainboard/google/stout/romstage.c b/src/mainboard/google/stout/romstage.c index 48ff7b0834..e1d85d7db5 100644 --- a/src/mainboard/google/stout/romstage.c +++ b/src/mainboard/google/stout/romstage.c @@ -346,9 +346,4 @@ void main(unsigned long bist) timestamp_add(TS_BEFORE_INITRAM, before_dram_time ); timestamp_add(TS_AFTER_INITRAM, after_dram_time ); timestamp_add_now(TS_END_ROMSTAGE); - -#if CONFIG_CONSOLE_CBMEM - /* Keep this the last thing this function does. */ - cbmemc_reinit(); -#endif } diff --git a/src/mainboard/intel/emeraldlake2/romstage.c b/src/mainboard/intel/emeraldlake2/romstage.c index 7a1d32ba22..a74358402a 100644 --- a/src/mainboard/intel/emeraldlake2/romstage.c +++ b/src/mainboard/intel/emeraldlake2/romstage.c @@ -343,9 +343,4 @@ void main(unsigned long bist) timestamp_add(TS_BEFORE_INITRAM, before_dram_time ); timestamp_add(TS_AFTER_INITRAM, after_dram_time ); timestamp_add_now(TS_END_ROMSTAGE); - -#if CONFIG_CONSOLE_CBMEM - /* Keep this the last thing this function does. */ - cbmemc_reinit(); -#endif } diff --git a/src/mainboard/samsung/lumpy/romstage.c b/src/mainboard/samsung/lumpy/romstage.c index 0d7802933a..2bc5f34602 100644 --- a/src/mainboard/samsung/lumpy/romstage.c +++ b/src/mainboard/samsung/lumpy/romstage.c @@ -362,9 +362,4 @@ void main(unsigned long bist) timestamp_add(TS_BEFORE_INITRAM, before_dram_time ); timestamp_add(TS_AFTER_INITRAM, after_dram_time ); timestamp_add_now(TS_END_ROMSTAGE); - -#if CONFIG_CONSOLE_CBMEM - /* Keep this the last thing this function does. */ - cbmemc_reinit(); -#endif } diff --git a/src/mainboard/samsung/stumpy/romstage.c b/src/mainboard/samsung/stumpy/romstage.c index 6f138b8c63..523d5c00ab 100644 --- a/src/mainboard/samsung/stumpy/romstage.c +++ b/src/mainboard/samsung/stumpy/romstage.c @@ -367,9 +367,4 @@ void main(unsigned long bist) timestamp_add(TS_BEFORE_INITRAM, before_dram_time ); timestamp_add(TS_AFTER_INITRAM, after_dram_time ); timestamp_add_now(TS_END_ROMSTAGE); - -#if CONFIG_CONSOLE_CBMEM - /* Keep this the last thing this function does. */ - cbmemc_reinit(); -#endif } diff --git a/src/northbridge/intel/sandybridge/raminit.c b/src/northbridge/intel/sandybridge/raminit.c index 78eedb89db..172872d552 100644 --- a/src/northbridge/intel/sandybridge/raminit.c +++ b/src/northbridge/intel/sandybridge/raminit.c @@ -63,6 +63,9 @@ static void save_mrc_data(struct pei_data *pei_data) int output_len = ALIGN(pei_data->mrc_output_len, 16); /* Save the MRC S3 restore data to cbmem */ + /* TODO: cbmem_initialize() must not be called twice! Most sandybridge + * boards call it again from mainboard/romstage.c. Clean up these code + * paths to ensure it is called at most once with every config. */ cbmem_initialize(); mrcdata = cbmem_add (CBMEM_ID_MRCDATA, diff --git a/src/soc/intel/baytrail/romstage/romstage.c b/src/soc/intel/baytrail/romstage/romstage.c index f1ab4dcfbf..6121e8417f 100644 --- a/src/soc/intel/baytrail/romstage/romstage.c +++ b/src/soc/intel/baytrail/romstage/romstage.c @@ -154,7 +154,7 @@ static void migrate_power_state(void) } memcpy(ps_cbmem, ps_car, sizeof(*ps_cbmem)); } -CAR_MIGRATE(migrate_power_state); +CBMEM_INIT_HOOK(migrate_power_state) static struct chipset_power_state *fill_power_state(void) { diff --git a/src/soc/intel/broadwell/romstage/power_state.c b/src/soc/intel/broadwell/romstage/power_state.c index bdb3da9c3b..bc7f15e6c7 100644 --- a/src/soc/intel/broadwell/romstage/power_state.c +++ b/src/soc/intel/broadwell/romstage/power_state.c @@ -50,7 +50,7 @@ static void migrate_power_state(void) } memcpy(ps_cbmem, ps_car, sizeof(*ps_cbmem)); } -CAR_MIGRATE(migrate_power_state); +CBMEM_INIT_HOOK(migrate_power_state) /* Return 0, 3, or 5 to indicate the previous sleep state. */ static int prev_sleep_state(struct chipset_power_state *ps) diff --git a/src/soc/nvidia/tegra132/romstage.c b/src/soc/nvidia/tegra132/romstage.c index 469f1ff7cc..390059d07a 100644 --- a/src/soc/nvidia/tegra132/romstage.c +++ b/src/soc/nvidia/tegra132/romstage.c @@ -123,8 +123,6 @@ void romstage(void) clock_halt_avp(); } - cbmemc_reinit(); - timestamp_add_now(TS_END_ROMSTAGE); ccplex_cpu_start(entry);