Patrick Rudolph has uploaded this change for review. ( https://review.coreboot.org/c/coreboot/+/78240?usp=email )
Change subject: [WIP]drivers/option/cfr: Collect CFR forms generated at compile time ......................................................................
[WIP]drivers/option/cfr: Collect CFR forms generated at compile time
Add CFR forms not passed as argument, but those present in ramstage.
Change-Id: Ia5bcc42b5098a019bdf1c28cb5ebdfba2a3ff3f0 Signed-off-by: Patrick Rudolph patrick.rudolph@9elements.com --- M src/drivers/option/cfr.c M src/drivers/option/cfr.h M src/lib/program.ld 3 files changed, 25 insertions(+), 1 deletion(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/40/78240/1
diff --git a/src/drivers/option/cfr.c b/src/drivers/option/cfr.c index 4803116..c3e1aab 100644 --- a/src/drivers/option/cfr.c +++ b/src/drivers/option/cfr.c @@ -301,8 +301,10 @@
void cfr_write_setup_menu(struct lb_cfr *cfr_root, struct sm_obj_form *sm_root[]) { - size_t i = 0; void *current = cfr_root; + struct sm_object *obj; + size_t i = 0; + assert(sm_root); assert(cfr_root);
@@ -313,6 +315,12 @@ while (sm_root[i]) current += sm_write_form(current, sm_root[i++], 0, 0);
+ /* + * Add generic forms. + */ + for (obj = &_cfr_forms[0]; obj != &_ecfr_forms[0]; obj++) + current += sm_write_form(current, &obj->sm_form, 0, 0); + cfr_root->size = cfr_record_size((char *)cfr_root, current);
cfr_root->checksum = CRC(cfr_root + 1, cfr_root->size - sizeof(*cfr_root), crc32_byte); diff --git a/src/drivers/option/cfr.h b/src/drivers/option/cfr.h index 93bc96c..8550574 100644 --- a/src/drivers/option/cfr.h +++ b/src/drivers/option/cfr.h @@ -99,4 +99,15 @@
void cfr_write_setup_menu(struct lb_cfr *cfr_root, struct sm_obj_form *sm_root[]);
+#if ENV_RAMSTAGE +#define __cfr_form const __attribute__((used, __section__(".rodata.cfr_forms"))) +#else +#define __cfr_form const __attribute__((unused)) +#endif + +/** start of compile time generated cfr form array */ +extern struct sm_object _cfr_forms[]; +/** end of compile time generated cfr form array */ +extern struct sm_object _ecfr_forms[]; + #endif /* DRIVERS_OPTION_CFR_H */ diff --git a/src/lib/program.ld b/src/lib/program.ld index f406f9f..7db3015 100644 --- a/src/lib/program.ld +++ b/src/lib/program.ld @@ -50,6 +50,11 @@ KEEP(*(.rodata.cpu_driver)); _ecpu_drivers = .; RECORD_SIZE(cpu_drivers) + . = ALIGN(ARCH_POINTER_ALIGN_SIZE); + _cfr_forms = .; + KEEP(*(.rodata.cfr_forms)); + _ecfr_forms = .; + RECORD_SIZE(cfr_forms) #endif
. = ALIGN(ARCH_POINTER_ALIGN_SIZE);