This adds support for booting from RAID 1C volumes on amd64.
Only boot-loader changes are needed. Both installboot(8) and
the kernel already do what is required to make this work.

I have tested with biosboot in vmm. The changes involved are trivial,
and I am modifying copies of the same code across all bootloaders.
So I would assume that all boot methods work with this patch.
Additional testing to verify this would be welcome, of course.

In my testing, a fresh install onto a RAID 1C volume succeeds and
the resulting system can be booted as usual. I have tried this on
a volume locked with a keydisk, and a volume locked with a passphrase.

I have also tested booting with one of two disks missing and as
expected the system came up with a degraded volume:

softraid0: not all chunks were provided; attempting to bring volume 0 online
softraid0: trying to bring up sd3 degraded
sd2 at scsibus4 targ 1 lun 0: <OPENBSD, SR RAID 1C, 006>
sd2: 8191MB, 512 bytes/sector, 16776624 sectors
softraid0: volume sd2 is roaming, it used to be sd3, updating metadata
softraid0: roaming device sd1a -> sd0a
root on sd2a (3ee0bf348da5ea75.a) swap on sd2b dump on sd2b

The volume could successfully be rebuilt with bioctl -R, once the
missing disk was added back in.

ok?

diff 43cbe5bff6629c463463325cebb7e87b291b4a73 
20d3307dd4ffcb7fd9baece3386a59b24bbcc8e0
commit - 43cbe5bff6629c463463325cebb7e87b291b4a73
commit + 20d3307dd4ffcb7fd9baece3386a59b24bbcc8e0
blob - c00d17a6628822b649ad4391a3af7c69801631f0
blob + e320f3d143c2d2023f83743be4ef31e82eabe2af
--- share/man/man4/softraid.4
+++ share/man/man4/softraid.4
@@ -118,7 +118,8 @@ may be used to install
 in the boot storage area of the
 .Nm
 volume.
-Boot support is currently limited to the CRYPTO and RAID 1 disciplines
+Boot support is currently limited to the RAID 1C discipline on the
+amd64 platform, and the CRYPTO and RAID 1 disciplines
 on amd64, arm64, i386, and sparc64 platforms.
 On sparc64, bootable chunks must be RAID partitions using the letter
 .Sq a .
blob - 543d9b404ed39512ed693e96d60958d8d467c3e8
blob + bda7e562558bc1cfad1800dac3f93e03439b48f7
--- sys/arch/amd64/stand/boot/conf.c
+++ sys/arch/amd64/stand/boot/conf.c
@@ -41,7 +41,7 @@
 #include <biosdev.h>
 #include <dev/cons.h>
 
-const char version[] = "3.54";
+const char version[] = "3.55";
 int    debug = 1;
 
 
blob - 5b4e78c86c4ea1a1d3491ca2a8f973588a38e7ba
blob + a53be08f763dd8a2069f5646bf266d747f3346a7
--- sys/arch/amd64/stand/cdboot/conf.c
+++ sys/arch/amd64/stand/cdboot/conf.c
@@ -42,7 +42,7 @@
 #include <biosdev.h>
 #include <dev/cons.h>
 
-const char version[] = "3.54";
+const char version[] = "3.55";
 int    debug = 1;
 
 
blob - dcf19e147de5c7c2e8b2e75fc0c47bf97421dd97
blob + ca83d39d7e22d24f86fc328e1a8703c4de8ce056
--- sys/arch/amd64/stand/efi32/conf.c
+++ sys/arch/amd64/stand/efi32/conf.c
@@ -40,7 +40,7 @@
 #include "efidev.h"
 #include "efipxe.h"
 
-const char version[] = "3.53";
+const char version[] = "3.54";
 
 #ifdef EFI_DEBUG
 int    debug = 0;
blob - e55f63529858ee9b98014f1cb1e0105db8e5d7a9
blob + 33b15ed229b1895c04047026193f36deb649866a
--- sys/arch/amd64/stand/efi32/efidev.c
+++ sys/arch/amd64/stand/efi32/efidev.c
@@ -599,9 +599,11 @@ efiopen(struct open_file *f, ...)
                        return EADAPT;
                }
 
-               if (bv->sbv_level == 'C' && bv->sbv_keys == NULL)
+               if ((bv->sbv_level == 'C' || bv->sbv_level == 0x1C) &&
+                   bv->sbv_keys == NULL) {
                        if (sr_crypto_unlock_volume(bv) != 0)
                                return EPERM;
+               }
 
                if (bv->sbv_diskinfo == NULL) {
                        dip = alloc(sizeof(struct diskinfo));
blob - 4eac75be43a98df370691f543dd172b8885dc0a4
blob + 8ef9e04e890c237994cdcacc98b8d78de43d4e37
--- sys/arch/amd64/stand/efi64/conf.c
+++ sys/arch/amd64/stand/efi64/conf.c
@@ -40,7 +40,7 @@
 #include "efidev.h"
 #include "efipxe.h"
 
-const char version[] = "3.53";
+const char version[] = "3.54";
 
 #ifdef EFI_DEBUG
 int    debug = 0;
blob - e55f63529858ee9b98014f1cb1e0105db8e5d7a9
blob + 33b15ed229b1895c04047026193f36deb649866a
--- sys/arch/amd64/stand/efi64/efidev.c
+++ sys/arch/amd64/stand/efi64/efidev.c
@@ -599,9 +599,11 @@ efiopen(struct open_file *f, ...)
                        return EADAPT;
                }
 
-               if (bv->sbv_level == 'C' && bv->sbv_keys == NULL)
+               if ((bv->sbv_level == 'C' || bv->sbv_level == 0x1C) &&
+                   bv->sbv_keys == NULL) {
                        if (sr_crypto_unlock_volume(bv) != 0)
                                return EPERM;
+               }
 
                if (bv->sbv_diskinfo == NULL) {
                        dip = alloc(sizeof(struct diskinfo));
blob - 2096ee66f3d2908bf2b462211f8ba7aa5b6a83a0
blob + b202cb05372802682f84d370c1e33dee21259938
--- sys/arch/amd64/stand/efiboot/conf.c
+++ sys/arch/amd64/stand/efiboot/conf.c
@@ -40,7 +40,7 @@
 #include "efidev.h"
 #include "efipxe.h"
 
-const char version[] = "3.61";
+const char version[] = "3.62";
 
 #ifdef EFI_DEBUG
 int    debug = 0;
blob - 8fd81511be2a9308df7f65431007e1512f93530d
blob + e35011973c13556a08b207e33bd95d617f50f57d
--- sys/arch/amd64/stand/efiboot/efidev.c
+++ sys/arch/amd64/stand/efiboot/efidev.c
@@ -580,9 +580,11 @@ efiopen(struct open_file *f, ...)
                        return EADAPT;
                }
 
-               if (bv->sbv_level == 'C' && bv->sbv_keys == NULL)
+               if ((bv->sbv_level == 'C' || bv->sbv_level == 0x1C) &&
+                   bv->sbv_keys == NULL) {
                        if (sr_crypto_unlock_volume(bv) != 0)
                                return EPERM;
+               }
 
                if (bv->sbv_diskinfo == NULL) {
                        dip = alloc(sizeof(struct diskinfo));
blob - b64714b20e05d1179b579707ab21693856c51320
blob + d7420753924189713400ac47eb679694cdda5cd5
--- sys/arch/amd64/stand/libsa/biosdev.c
+++ sys/arch/amd64/stand/libsa/biosdev.c
@@ -543,9 +543,11 @@ biosopen(struct open_file *f, ...)
                        return EADAPT;
                }
 
-               if (bv->sbv_level == 'C' && bv->sbv_keys == NULL)
+               if ((bv->sbv_level == 'C' || bv->sbv_level == 0x1C) &&
+                   bv->sbv_keys == NULL) {
                        if (sr_crypto_unlock_volume(bv) != 0)
                                return EPERM;
+               }
 
                if (bv->sbv_diskinfo == NULL) {
                        dip = alloc(sizeof(struct diskinfo));
blob - 4c6099d83de61ff101f7dea8aadce815f2b4bba7
blob + 294d307ea2da3d908e5cab75c63114a82e8ad346
--- sys/arch/amd64/stand/libsa/softraid_amd64.c
+++ sys/arch/amd64/stand/libsa/softraid_amd64.c
@@ -291,6 +291,7 @@ srprobe(void)
                        break;
 
                case 1:
+               case 0x1C:
                        if (bv->sbv_chunk_no == bv->sbv_chunks_found)
                                bv->sbv_state = BIOC_SVONLINE;
                        else if (bv->sbv_chunks_found > 0)
@@ -348,7 +349,7 @@ sr_strategy(struct sr_boot_volume *bv, int rw, daddr_t
                /* XXX - If I/O failed we should try another chunk... */
                return dip->strategy(dip, rw, blk, size, buf, rsize);
 
-       } else if (bv->sbv_level == 'C') {
+       } else if (bv->sbv_level == 'C' || bv->sbv_level == 0x1C) {
 
                /* Select first online chunk. */
                SLIST_FOREACH(bc, &bv->sbv_chunks, sbc_link)
blob - f80304065d7843fb3d7ab61e904357c2d40a071b
blob + 09212e51497c9e6ffacd755d9a2f1a6f37057532
--- sys/arch/amd64/stand/pxeboot/conf.c
+++ sys/arch/amd64/stand/pxeboot/conf.c
@@ -44,7 +44,7 @@
 #include "pxeboot.h"
 #include "pxe_net.h"
 
-const char version[] = "3.54";
+const char version[] = "3.55";
 int    debug = 0;
 
 void (*sa_cleanup)(void) = pxe_shutdown;
blob - 41e964f879e42a663f46889219c3253cb2fbbfbb
blob + b283b2a96dcd96f74eee4a9f36532f4e6e6684e6
--- sys/lib/libsa/softraid.c
+++ sys/lib/libsa/softraid.c
@@ -66,7 +66,7 @@ sr_clear_keys(void)
        struct sr_boot_keydisk *kd;
 
        SLIST_FOREACH(bv, &sr_volumes, sbv_link) {
-               if (bv->sbv_level != 'C')
+               if (bv->sbv_level != 'C' && bv->sbv_level != 0x1C)
                        continue;
                if (bv->sbv_keys != NULL) {
                        explicit_bzero(bv->sbv_keys, SR_CRYPTO_KEYBLOCK_BYTES);


Reply via email to