Philipp Hug has uploaded this change for review. ( https://review.coreboot.org/27397
Change subject: riscv: add trampoline in MBR block to support boot mode 1 ......................................................................
riscv: add trampoline in MBR block to support boot mode 1
Add "J pc + 0x1000" at the beginning of the MBR to jump to bootlock. Changed first usable lba to 4 (0x1000) as prevent stack alignment issues.
Change-Id: I16e762d9f027346b124412f1f7ee6ff37f431d86 --- M util/riscv/sifive-gpt.py 1 file changed, 9 insertions(+), 7 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/97/27397/1
diff --git a/util/riscv/sifive-gpt.py b/util/riscv/sifive-gpt.py index cb77302..2619a21 100755 --- a/util/riscv/sifive-gpt.py +++ b/util/riscv/sifive-gpt.py @@ -25,6 +25,12 @@ # Size of the bootcode part of the MBR MBR_BOOTCODE_SIZE = 0x1be
+# MBR trampoline to bootblock +MBR_BOOTCODE = bytes([ + # j pc + 0x1000 + 0x6f, 0x10, 0x00, 0x00, +]) + # A protecive MBR, without the bootcode part PROTECTIVE_MBR_FOOTER = bytes([ 0x00, 0x00, 0x02, 0x00, 0xee, 0xff, 0xff, 0xff, @@ -43,7 +49,7 @@ # [1]: https://en.wikipedia.org/wiki/GUID_Partition_Table#PROTECTIVE-MBR class ProtectiveMBR: def __init__(self): - self.bootcode = bytes(MBR_BOOTCODE_SIZE) + self.bootcode = MBR_BOOTCODE + bytes(MBR_BOOTCODE_SIZE - len(MBR_BOOTCODE))
def generate(self, stream): assert len(self.bootcode) == MBR_BOOTCODE_SIZE @@ -71,7 +77,7 @@ def __init__(self): self.current_lba = 1 self.backup_lba = 1 - self.first_usable_lba = 2 + self.first_usable_lba = 8 # hard-coded to match jump self.last_usable_lba = 0xff # dummy value self.uniq = DUMMY_GUID_DISK_UNIQUE self.part_entries_lba = 2 @@ -126,7 +132,7 @@ def __init__(self): self.mbr = ProtectiveMBR() self.header = GPTHeader() - self.partitions = [ GPTPartition() for i in range(8) ] + self.partitions = [ GPTPartition() for i in range(24) ] self.bootblock = b''
@@ -137,10 +143,6 @@ bootblock_size = (len(self.bootblock) + BLOCK_SIZE - 1) & ~BLOCK_MASK self.bootblock = self.bootblock.ljust(bootblock_size)
- # Propagate the number of partition entries - self.header.part_entries_number = len(self.partitions) - self.header.first_usable_lba = 2 + self.header.part_entries_number // 4 - # Create a partition entry for the bootblock self.partitions[0].type = GUID_TYPE_FSBL self.partitions[0].uniq = DUMMY_GUID_PART_UNIQUE