Changed to coreboot patch to not measure relocated modules

This commit is contained in:
Francis Lam 2017-08-27 15:39:22 -04:00
parent 1a34bd9d6f
commit 87251fd1b1
No known key found for this signature in database
GPG Key ID: 0A59C698920806EB

View File

@ -24,6 +24,19 @@ index 49f8672..4ca811d 100644
endmenu endmenu
menu "Mainboard" menu "Mainboard"
diff --git ./src/include/program_loading.h ./src/include/program_loading.h
index 416e2e9..40486cd 100644
--- ./src/include/program_loading.h
+++ ./src/include/program_loading.h
@@ -24,6 +24,8 @@ enum {
/* Last segment of program. Can be used to take different actions for
* cache maintenance of a program load. */
SEG_FINAL = 1 << 0,
+ /* Indicate that the program segment should not be measured */
+ SEG_NO_MEASURE = 1 << 1,
};
enum prog_type {
diff --git ./src/include/sha1.h ./src/include/sha1.h diff --git ./src/include/sha1.h ./src/include/sha1.h
new file mode 100644 new file mode 100644
index 0000000..e7e28e6 index 0000000..e7e28e6
@ -97,7 +110,7 @@ index 8f92b29..1822daf 100644
romstage-$(CONFIG_TPM2) += tpm2_tlcl.c romstage-$(CONFIG_TPM2) += tpm2_tlcl.c
endif # CONFIG_VBOOT_SEPARATE_VERSTAGE endif # CONFIG_VBOOT_SEPARATE_VERSTAGE
diff --git ./src/lib/cbfs.c ./src/lib/cbfs.c diff --git ./src/lib/cbfs.c ./src/lib/cbfs.c
index 11bce2c..c1024f9 100644 index 11bce2c..8428245 100644
--- ./src/lib/cbfs.c --- ./src/lib/cbfs.c
+++ ./src/lib/cbfs.c +++ ./src/lib/cbfs.c
@@ -69,7 +69,11 @@ void *cbfs_boot_map_with_leak(const char *name, uint32_t type, size_t *size) @@ -69,7 +69,11 @@ void *cbfs_boot_map_with_leak(const char *name, uint32_t type, size_t *size)
@ -107,7 +120,7 @@ index 11bce2c..c1024f9 100644
- return rdev_mmap(&fh.data, 0, fsize); - return rdev_mmap(&fh.data, 0, fsize);
+ void * buffer = rdev_mmap(&fh.data, 0, fsize); + void * buffer = rdev_mmap(&fh.data, 0, fsize);
+ +
+ prog_segment_loaded((uintptr_t)buffer, fsize, SEG_FINAL); + prog_segment_loaded((uintptr_t)buffer, fsize, 0);
+ +
+ return buffer; + return buffer;
} }
@ -143,14 +156,14 @@ index 11bce2c..c1024f9 100644
return 0; return 0;
} }
+ +
+ prog_segment_loaded((uintptr_t)buffer, out_size, SEG_FINAL); + prog_segment_loaded((uintptr_t)buffer, out_size, 0);
+ +
+ return out_size; + return out_size;
} }
static inline int tohex4(unsigned int c) static inline int tohex4(unsigned int c)
diff --git ./src/lib/hardwaremain.c ./src/lib/hardwaremain.c diff --git ./src/lib/hardwaremain.c ./src/lib/hardwaremain.c
index a56d68e..94f7c95 100644 index a56d68e..8c13f5f 100644
--- ./src/lib/hardwaremain.c --- ./src/lib/hardwaremain.c
+++ ./src/lib/hardwaremain.c +++ ./src/lib/hardwaremain.c
@@ -32,6 +32,7 @@ @@ -32,6 +32,7 @@
@ -169,52 +182,25 @@ index a56d68e..94f7c95 100644
+// ramstage measurements go into PCR3 if we are doing measured boot +// ramstage measurements go into PCR3 if we are doing measured boot
+void platform_segment_loaded(uintptr_t start, size_t size, int flags) +void platform_segment_loaded(uintptr_t start, size_t size, int flags)
+{ +{
+ if (IS_ENABLED(CONFIG_MEASURED_BOOT)) + if (IS_ENABLED(CONFIG_MEASURED_BOOT) && !(flags & SEG_NO_MEASURE))
+ { + {
+ tlcl_measure(3, (const void*) start, size); + tlcl_measure(3, (const void*) start, size);
+ } + }
+} +}
+ +
diff --git ./src/lib/rmodule.c ./src/lib/rmodule.c diff --git ./src/lib/rmodule.c ./src/lib/rmodule.c
index a3a74ac..f5c3ad3 100644 index a3a74ac..bb99e5f 100644
--- ./src/lib/rmodule.c --- ./src/lib/rmodule.c
+++ ./src/lib/rmodule.c +++ ./src/lib/rmodule.c
@@ -125,10 +125,21 @@ static inline size_t rmodule_number_relocations(const struct rmodule *module) @@ -198,7 +198,7 @@ int rmodule_load(void *base, struct rmodule *module)
rmodule_clear_bss(module);
static void rmodule_copy_payload(const struct rmodule *module) prog_segment_loaded((uintptr_t)module->location,
{ - rmodule_memory_size(module), SEG_FINAL);
- printk(BIOS_DEBUG, "Loading module at %p with entry %p. " + rmodule_memory_size(module), SEG_FINAL | SEG_NO_MEASURE);
- "filesize: 0x%x memsize: 0x%x\n",
- module->location, rmodule_entry(module),
- module->payload_size, rmodule_memory_size(module));
+ const size_t mem_size = rmodule_memory_size(module);
+
+ printk(BIOS_DEBUG, "Loading module at %p/%p with entry %p. "
+ "filesize: 0x%x memsize: 0x%zx\n",
+ module->location, module->payload, rmodule_entry(module),
+ module->payload_size, mem_size);
+
+ // zero the excess memory if there is any
+ if (mem_size > module->payload_size)
+ {
+ memset((uint8_t*) module->location + module->payload_size,
+ 0,
+ mem_size - module->payload_size
+ );
+ }
/* No need to copy the payload if the load location and the return 0;
* payload location are the same. */ }
@@ -162,7 +173,8 @@ static int rmodule_relocate(const struct rmodule *module)
printk(PK_ADJ_LEVEL, "Adjusting %p: 0x%08lx -> 0x%08lx\n",
adjust_loc, (unsigned long) *adjust_loc,
(unsigned long) (*adjust_loc + adjustment));
- *adjust_loc += adjustment;
+
+ *adjust_loc += adjustment;
reloc++;
num_relocations--;
diff --git ./src/lib/sha1.c ./src/lib/sha1.c diff --git ./src/lib/sha1.c ./src/lib/sha1.c
new file mode 100644 new file mode 100644
index 0000000..506907f index 0000000..506907f
@ -433,7 +419,7 @@ index 49854cb..32eb128 100644
+} +}
+ +
diff --git ./src/northbridge/intel/sandybridge/romstage.c ./src/northbridge/intel/sandybridge/romstage.c diff --git ./src/northbridge/intel/sandybridge/romstage.c ./src/northbridge/intel/sandybridge/romstage.c
index 738e285..2b16657 100644 index 738e285..c7c0c62 100644
--- ./src/northbridge/intel/sandybridge/romstage.c --- ./src/northbridge/intel/sandybridge/romstage.c
+++ ./src/northbridge/intel/sandybridge/romstage.c +++ ./src/northbridge/intel/sandybridge/romstage.c
@@ -29,6 +29,8 @@ @@ -29,6 +29,8 @@
@ -483,7 +469,7 @@ index 738e285..2b16657 100644
+ +
+void platform_segment_loaded(uintptr_t start, size_t size, int flags) +void platform_segment_loaded(uintptr_t start, size_t size, int flags)
+{ +{
+ if (IS_ENABLED(CONFIG_MEASURED_BOOT)) + if (IS_ENABLED(CONFIG_MEASURED_BOOT) && !(flags & SEG_NO_MEASURE))
+ { + {
+ tlcl_measure(2, (const void*) start, size); + tlcl_measure(2, (const void*) start, size);
+ } + }