diff --git a/headers/private/kernel/boot/platform.h b/headers/private/kernel/boot/platform.h index 7d3afda1a3..f343c94659 100644 --- a/headers/private/kernel/boot/platform.h +++ b/headers/private/kernel/boot/platform.h @@ -58,8 +58,8 @@ namespace boot { extern status_t platform_add_boot_device(struct stage2_args *args, NodeList *devicesList); extern status_t platform_add_block_devices(struct stage2_args *args, NodeList *devicesList); -extern status_t platform_get_boot_partition(struct stage2_args *args, Node *bootDevice, - NodeList *partitions, boot::Partition **_partition); +extern status_t platform_get_boot_partitions(struct stage2_args *args, Node *bootDevice, + NodeList *partitions, NodeList *bootPartitions); extern status_t platform_register_boot_device(Node *device); /* menu functions */ diff --git a/src/system/boot/loader/vfs.cpp b/src/system/boot/loader/vfs.cpp index 2a57686bde..88a3ba6a07 100644 --- a/src/system/boot/loader/vfs.cpp +++ b/src/system/boot/loader/vfs.cpp @@ -659,28 +659,33 @@ get_boot_file_system(stage2_args* args, BootVolume& _bootVolume) if (error != B_OK) continue; - Partition *partition; - error = platform_get_boot_partition(args, device, &gPartitions, &partition); + NodeList bootPartitions; + error = platform_get_boot_partitions(args, device, &gPartitions, &bootPartitions); if (error != B_OK) continue; - Directory *fileSystem; - error = partition->Mount(&fileSystem, true); - if (error != B_OK) { - // this partition doesn't contain any known file system; we - // don't need it anymore - gPartitions.Remove(partition); - delete partition; - continue; + NodeIterator partitionIterator = bootPartitions.GetIterator(); + while (partitionIterator.HasNext()) { + Partition *partition = (Partition*)partitionIterator.Next(); + + Directory *fileSystem; + error = partition->Mount(&fileSystem, true); + if (error != B_OK) { + // this partition doesn't contain any known file system; we + // don't need it anymore + gPartitions.Remove(partition); + delete partition; + continue; + } + + // init the BootVolume + error = _bootVolume.SetTo(fileSystem); + if (error != B_OK) + continue; + + sBootDevice = device; + return B_OK; } - - // init the BootVolume - error = _bootVolume.SetTo(fileSystem); - if (error != B_OK) - continue; - - sBootDevice = device; - return B_OK; } return B_ERROR; diff --git a/src/system/boot/platform/amiga_m68k/devices.cpp b/src/system/boot/platform/amiga_m68k/devices.cpp index 4030f0242b..621a8034bc 100644 --- a/src/system/boot/platform/amiga_m68k/devices.cpp +++ b/src/system/boot/platform/amiga_m68k/devices.cpp @@ -168,8 +168,8 @@ platform_add_boot_device(struct stage2_args *args, NodeList *devicesList) status_t -platform_get_boot_partition(struct stage2_args *args, Node *bootDevice, - NodeList *list, boot::Partition **_partition) +platform_get_boot_partitions(struct stage2_args *args, Node *bootDevice, + NodeList *list, NodeList *partitions) { //TODO diff --git a/src/system/boot/platform/atari_m68k/devices.cpp b/src/system/boot/platform/atari_m68k/devices.cpp index 002467c7e8..cc9fcef808 100644 --- a/src/system/boot/platform/atari_m68k/devices.cpp +++ b/src/system/boot/platform/atari_m68k/devices.cpp @@ -1189,8 +1189,8 @@ platform_add_boot_device(struct stage2_args *args, NodeList *devicesList) status_t -platform_get_boot_partition(struct stage2_args *args, Node *bootDevice, - NodeList *list, boot::Partition **_partition) +platform_get_boot_partitions(struct stage2_args *args, Node *bootDevice, + NodeList *list, NodeList *partitionList) { BlockHandle *drive = static_cast(bootDevice); off_t offset = (off_t)gBootPartitionOffset * drive->BlockSize(); @@ -1205,7 +1205,7 @@ platform_get_boot_partition(struct stage2_args *args, Node *bootDevice, // offset as reported by the BFS boot block if (offset >= partition->offset && offset < partition->offset + partition->size) { - *_partition = partition; + partitionList->Insert(partition); return B_OK; } } diff --git a/src/system/boot/platform/bios_ia32/devices.cpp b/src/system/boot/platform/bios_ia32/devices.cpp index cdb6cc9e91..7a86f41e6f 100644 --- a/src/system/boot/platform/bios_ia32/devices.cpp +++ b/src/system/boot/platform/bios_ia32/devices.cpp @@ -878,8 +878,8 @@ platform_add_boot_device(struct stage2_args *args, NodeList *devicesList) status_t -platform_get_boot_partition(struct stage2_args *args, Node *bootDevice, - NodeList *list, boot::Partition **_partition) +platform_get_boot_partitions(struct stage2_args *args, Node *bootDevice, + NodeList *list, NodeList *bootList) { BIOSDrive *drive = static_cast(bootDevice); off_t offset = (off_t)gBootPartitionOffset * drive->BlockSize(); @@ -894,7 +894,7 @@ platform_get_boot_partition(struct stage2_args *args, Node *bootDevice, // offset as reported by the BFS boot block if (offset >= partition->offset && offset < partition->offset + partition->size) { - *_partition = partition; + bootList->Insert(partition); return B_OK; } } diff --git a/src/system/boot/platform/cfe/devices.cpp b/src/system/boot/platform/cfe/devices.cpp index 13e7e6c0f1..36cf258012 100644 --- a/src/system/boot/platform/cfe/devices.cpp +++ b/src/system/boot/platform/cfe/devices.cpp @@ -34,14 +34,14 @@ platform_add_boot_device(struct stage2_args *args, NodeList *devicesList) status_t -platform_get_boot_partition(struct stage2_args *args, Node *device, - NodeList *list, boot::Partition **_partition) +platform_get_boot_partitions(struct stage2_args *args, Node *device, + NodeList *list, NodeList *partitionList) { NodeIterator iterator = list->GetIterator(); boot::Partition *partition = NULL; while ((partition = (boot::Partition *)iterator.Next()) != NULL) { // ToDo: just take the first partition for now - *_partition = partition; + partitionList->Insert(partition); return B_OK; } diff --git a/src/system/boot/platform/efi/devices.cpp b/src/system/boot/platform/efi/devices.cpp index 848db37945..bc9876b134 100644 --- a/src/system/boot/platform/efi/devices.cpp +++ b/src/system/boot/platform/efi/devices.cpp @@ -440,7 +440,7 @@ device_contains_partition(EfiDevice *device, boot::Partition *partition) } if ((partition->offset + partition->size) <= device->Size()) - return true; + return true; return false; } @@ -482,19 +482,17 @@ platform_add_block_devices(struct stage2_args *args, NodeList *devicesList) status_t -platform_get_boot_partition(struct stage2_args *args, Node *bootDevice, - NodeList *partitions, boot::Partition **_partition) +platform_get_boot_partitions(struct stage2_args *args, Node *bootDevice, + NodeList *partitions, NodeList *bootPartitions) { NodeIterator iterator = partitions->GetIterator(); boot::Partition *partition = NULL; - while ((partition = (boot::Partition *)iterator.Next()) != NULL) { - if (device_contains_partition((EfiDevice*)bootDevice, partition)) { - *_partition = partition; - return B_OK; - } + while ((partition = (boot::Partition*)iterator.Next()) != NULL) { + if (device_contains_partition((EfiDevice*)bootDevice, partition)) + bootPartitions->Insert(partition); } - return B_ENTRY_NOT_FOUND; + return bootPartitions->Count() > 0 ? B_OK : B_ENTRY_NOT_FOUND; } diff --git a/src/system/boot/platform/openfirmware/devices.cpp b/src/system/boot/platform/openfirmware/devices.cpp index b58e30fe05..85da5d6d65 100644 --- a/src/system/boot/platform/openfirmware/devices.cpp +++ b/src/system/boot/platform/openfirmware/devices.cpp @@ -125,14 +125,14 @@ platform_add_boot_device(struct stage2_args *args, NodeList *devicesList) status_t -platform_get_boot_partition(struct stage2_args *args, Node *device, - NodeList *list, boot::Partition **_partition) +platform_get_boot_partitions(struct stage2_args *args, Node *device, + NodeList *list, NodeList *partitionList) { NodeIterator iterator = list->GetIterator(); boot::Partition *partition = NULL; while ((partition = (boot::Partition *)iterator.Next()) != NULL) { // ToDo: just take the first partition for now - *_partition = partition; + partitionList->Insert(partition); return B_OK; } diff --git a/src/system/boot/platform/pxe_ia32/devices.cpp b/src/system/boot/platform/pxe_ia32/devices.cpp index 73a7c8f505..8fa1d4d66c 100644 --- a/src/system/boot/platform/pxe_ia32/devices.cpp +++ b/src/system/boot/platform/pxe_ia32/devices.cpp @@ -117,15 +117,15 @@ platform_add_boot_device(struct stage2_args *args, NodeList *devicesList) status_t -platform_get_boot_partition(struct stage2_args *args, Node *device, - NodeList *list, boot::Partition **_partition) +platform_get_boot_partitions(struct stage2_args *args, Node *device, + NodeList *list, NodeList *partitionList) { TRACE("platform_get_boot_partition\n"); NodeIterator iterator = list->GetIterator(); boot::Partition *partition = NULL; while ((partition = (boot::Partition *)iterator.Next()) != NULL) { // ToDo: just take the first partition for now - *_partition = partition; + partitionList->Insert(partition); return B_OK; } diff --git a/src/system/boot/platform/u-boot/devices.cpp b/src/system/boot/platform/u-boot/devices.cpp index a1a6916038..c9d79fb56d 100644 --- a/src/system/boot/platform/u-boot/devices.cpp +++ b/src/system/boot/platform/u-boot/devices.cpp @@ -47,8 +47,8 @@ platform_add_boot_device(struct stage2_args *args, NodeList *devicesList) status_t -platform_get_boot_partition(struct stage2_args *args, Node *device, - NodeList *list, boot::Partition **_partition) +platform_get_boot_partitions(struct stage2_args *args, Node *device, + NodeList *list, NodeList *partitionList) { TRACE("platform_get_boot_partition\n"); @@ -56,7 +56,7 @@ platform_get_boot_partition(struct stage2_args *args, Node *device, boot::Partition *partition = NULL; while ((partition = (boot::Partition *)iterator.Next()) != NULL) { // ToDo: just take the first partition for now - *_partition = partition; + partitionList->Insert(partition); return B_OK; }