[coreboot-gerrit] New patch to review for coreboot: riscv: fix up issues related to M-mode misalign traps

Ronald G. Minnich (rminnich@gmail.com) gerrit at coreboot.org
Sat Jan 14 05:03:21 CET 2017


Ronald G. Minnich (rminnich at gmail.com) just uploaded a new patch set to gerrit, which you can find at https://review.coreboot.org/18139

-gerrit

commit ee7d3b858c50b4c930250c1442759003947c1267
Author: Ronald G. Minnich <rminnich at gmail.com>
Date:   Fri Jan 13 18:27:34 2017 -0800

    riscv: fix up issues related to M-mode misalign traps
    
    First, make sure that the lb_record allocator allocates
    128-bit-aligned pointers. This ensures safety up to rv128.
    
    Second, if we take an interrupt in M-mode, panic. We have
    no plans to support that. If you have alignment issues
    in M-mode it's a sign you need to fix your firmware.
    
    This gets me back up to a shell prompt on harvey, where
    before we would fail with an alignment trap in
    coreboot.
    
    Change-Id: Id683fe2baa8cbea9abfccab72cf66a44fc04429e
    Signed-off-by: Ronald G. Minnich <rminnich at gmail.com>
---
 src/arch/riscv/trap_handler.c | 6 ++++++
 src/lib/coreboot_table.c      | 8 ++++++++
 2 files changed, 14 insertions(+)

diff --git a/src/arch/riscv/trap_handler.c b/src/arch/riscv/trap_handler.c
index 9a8947c..272622c 100644
--- a/src/arch/riscv/trap_handler.c
+++ b/src/arch/riscv/trap_handler.c
@@ -150,6 +150,12 @@ static void interrupt_handler(trapframe *tf)
 {
 	uint64_t cause = tf->cause & ~0x8000000000000000ULL;
 	uint32_t msip, ssie;
+	bool mprv = !!(tf->status & MSTATUS_MPRV);
+
+	if (mprv) {
+		print_trap_information(tf);
+		die("Interrupt in M-mode. Fix your firmware");
+	}
 
 	switch (cause) {
 	case IRQ_M_TIMER:
diff --git a/src/lib/coreboot_table.c b/src/lib/coreboot_table.c
index f8da658..dadedc8 100644
--- a/src/lib/coreboot_table.c
+++ b/src/lib/coreboot_table.c
@@ -88,6 +88,14 @@ struct lb_record *lb_new_record(struct lb_header *header)
 	rec = lb_last_record(header);
 	if (header->table_entries) {
 		header->table_bytes += rec->size;
+		// If the rec->size is not aligned to something reasonable,
+		// some architectures can take alignment traps.
+		// Round up table_bytes to something that is future-proof,
+		// namely 128 bits (16 bytes). This will ensure that even
+		// the 128-bit RISCV won't get traps.
+		// We have roundup macros all over the tree; we need to
+		// clean that up at some point.
+		header->table_bytes = (header->table_bytes + 15) & ~0xf;
 	}
 	rec = lb_last_record(header);
 	header->table_entries++;



More information about the coreboot-gerrit mailing list