Module Name:    src
Committed By:   mrg
Date:           Wed May 26 09:42:36 UTC 2021

Modified Files:
        src/sys/stand/efiboot: efiblock.c version

Log Message:
add basic raidframe support to efiboot.

if raid disklabel or gpt is found, add this partition with
the offset/size adjusted by RF_PROTECTED_SECTORS.  note

don't le32toh() the disklabel.  if it was wrong-endian, then
getdisklabel() will have swapped it.

ok jmcneill thorpej.


To generate a diff of this commit:
cvs rdiff -u -r1.10 -r1.11 src/sys/stand/efiboot/efiblock.c
cvs rdiff -u -r1.23 -r1.24 src/sys/stand/efiboot/version

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/stand/efiboot/efiblock.c
diff -u src/sys/stand/efiboot/efiblock.c:1.10 src/sys/stand/efiboot/efiblock.c:1.11
--- src/sys/stand/efiboot/efiblock.c:1.10	Sat Nov 28 15:24:05 2020
+++ src/sys/stand/efiboot/efiblock.c	Wed May 26 09:42:36 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: efiblock.c,v 1.10 2020/11/28 15:24:05 jmcneill Exp $ */
+/* $NetBSD: efiblock.c,v 1.11 2021/05/26 09:42:36 mrg Exp $ */
 
 /*-
  * Copyright (c) 2016 Kimihiro Nonaka <non...@netbsd.org>
@@ -38,6 +38,13 @@
 #include "efiboot.h"
 #include "efiblock.h"
 
+/*
+ * The raidframe support is basic.  Ideally, it should be expanded to
+ * consider raid volumes a first-class citizen like the x86 efiboot does,
+ * but for now, we simply assume each RAID is potentially bootable.
+ */
+#define	RF_PROTECTED_SECTORS	64	/* XXX refer to <.../rf_optnames.h> */
+
 static EFI_HANDLE *efi_block;
 static UINTN efi_nblock;
 static struct efi_block_part *efi_block_booted = NULL;
@@ -217,6 +224,10 @@ efi_block_find_partitions_disklabel(stru
 		case FS_MSDOS:
 		case FS_BSDLFS:
 			break;
+		case FS_RAID:
+			p->p_size -= RF_PROTECTED_SECTORS;
+			p->p_offset += RF_PROTECTED_SECTORS;
+			break;
 		default:
 			continue;
 		}
@@ -225,7 +236,7 @@ efi_block_find_partitions_disklabel(stru
 		bpart->index = n;
 		bpart->bdev = bdev;
 		bpart->type = EFI_BLOCK_PART_DISKLABEL;
-		bpart->disklabel.secsize = le32toh(d.d_secsize);
+		bpart->disklabel.secsize = d.d_secsize;
 		bpart->disklabel.part = *p;
 		efi_block_generate_hash_mbr(bpart, mbr);
 		TAILQ_INSERT_TAIL(&bdev->partitions, bpart, entries);
@@ -310,6 +321,10 @@ efi_block_find_partitions_gpt_entry(stru
 	bpart->type = EFI_BLOCK_PART_GPT;
 	bpart->gpt.fstype = fstype;
 	bpart->gpt.ent = *ent;
+	if (fstype == FS_RAID) {
+		bpart->gpt.ent.ent_lba_start += RF_PROTECTED_SECTORS;
+		bpart->gpt.ent.ent_lba_end -= RF_PROTECTED_SECTORS;
+	}
 	memcpy(bpart->hash, ent->ent_guid, sizeof(bpart->hash));
 	TAILQ_INSERT_TAIL(&bdev->partitions, bpart, entries);
 
@@ -436,7 +451,7 @@ efi_block_probe(void)
 					fstype = FS_ISO9660;
 					break;
 				}
-				if (fstype == FS_BSDFFS || fstype == FS_ISO9660) {
+				if (fstype == FS_BSDFFS || fstype == FS_ISO9660 || fstype == FS_RAID) {
 					char devname[9];
 					snprintf(devname, sizeof(devname), "hd%u%c", bdev->index, bpart->index + 'a');
 					set_default_device(devname);

Index: src/sys/stand/efiboot/version
diff -u src/sys/stand/efiboot/version:1.23 src/sys/stand/efiboot/version:1.24
--- src/sys/stand/efiboot/version:1.23	Fri May 21 21:53:15 2021
+++ src/sys/stand/efiboot/version	Wed May 26 09:42:36 2021
@@ -1,4 +1,4 @@
-$NetBSD: version,v 1.23 2021/05/21 21:53:15 jmcneill Exp $
+$NetBSD: version,v 1.24 2021/05/26 09:42:36 mrg Exp $
 
 NOTE ANY CHANGES YOU MAKE TO THE EFI BOOTLOADER HERE.  The format of this
 file is important - make sure the entries are appended on end, last item
@@ -27,3 +27,4 @@ is taken as the current.
 2.4:	Add ISO9660 support.
 2.5:	Recognize the EFI system partion as fstype MSDOS.
 2.6:	Disable ACPI support when booting big endian kernels.
+2.7:	Add basic support for booting from RAID1 volumes.

Reply via email to