[haiku-commits] haiku: hrev54293 - src/add-ons/kernel/partitioning_systems/sun docs/develop/partitioning_systems

  • From: Adrien Destugues <pulkomandy@xxxxxxxxx>
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Wed, 3 Jun 2020 07:24:29 -0400 (EDT)

hrev54293 adds 1 changeset to branch 'master'
old head: c1cd7f063340334c5d0a57a0edbf7a4ee0c5ba28
new head: 68ea01249e1e2088933cb12f9c28d4e5c5d1c9ef
overview: 
https://git.haiku-os.org/haiku/log/?qt=range&q=68ea01249e1e+%5Ec1cd7f063340

----------------------------------------------------------------------------

68ea01249e1e: Add a partitioning system for Sun disklabel/vtoc
  
  This is the partitioning system used on sparc machines.
  Confirmed working with a Solaris install iso image.
  Added to the haiku package for sparc and to haiku_extras for other
  architectures.
  
  Fixes #15638
  
  Change-Id: I0584bef5e6a66eff9a33eb6675d5533cc9a45d1e
  Reviewed-on: https://review.haiku-os.org/c/haiku/+/2709
  Reviewed-by: Adrien Destugues <pulkomandy@xxxxxxxxx>

                             [ Adrien Destugues <pulkomandy@xxxxxxxxxxxxx> ]

----------------------------------------------------------------------------

Revision:    hrev54293
Commit:      68ea01249e1e2088933cb12f9c28d4e5c5d1c9ef
URL:         https://git.haiku-os.org/haiku/commit/?id=68ea01249e1e
Author:      Adrien Destugues <pulkomandy@xxxxxxxxxxxxx>
Date:        Sat May 16 13:04:32 2020 UTC
Committer:   Adrien Destugues <pulkomandy@xxxxxxxxx>
Commit-Date: Wed Jun  3 11:24:25 2020 UTC

Ticket:      https://dev.haiku-os.org/ticket/15638

----------------------------------------------------------------------------

6 files changed, 294 insertions(+), 2 deletions(-)
build/jam/packages/Haiku                         |   2 +-
build/jam/packages/HaikuExtras                   |   2 +-
docs/develop/partitioning_systems/sun.txt        |  72 +++++++
src/add-ons/kernel/partitioning_systems/Jamfile  |   1 +
.../kernel/partitioning_systems/sun/Jamfile      |  10 +
.../kernel/partitioning_systems/sun/sun.cpp      | 209 +++++++++++++++++++

----------------------------------------------------------------------------

diff --git a/build/jam/packages/Haiku b/build/jam/packages/Haiku
index ab98697e6b..275557bec3 100644
--- a/build/jam/packages/Haiku
+++ b/build/jam/packages/Haiku
@@ -49,7 +49,7 @@ AddFilesToPackage add-ons kernel generic
        : ata_adapter bios@x86,x86_64 dpc
                locked_pool mpu401 scsi_periph smbios@x86,x86_64 <module>tty ;
 AddFilesToPackage add-ons kernel partitioning_systems
-       : amiga_rdb@m68k apple@ppc efi_gpt intel session ;
+       : amiga_rdb@m68k apple@ppc sun@sparc efi_gpt intel session ;
 AddFilesToPackage add-ons kernel interrupt_controllers : openpic@ppc ;
 AddFilesToPackage add-ons kernel power cpufreq : intel_pstates@x86,x86_64 ;
 AddFilesToPackage add-ons kernel power cpuidle : intel_cstates@x86,x86_64 ;
diff --git a/build/jam/packages/HaikuExtras b/build/jam/packages/HaikuExtras
index 2468b347eb..0d5ccd257d 100644
--- a/build/jam/packages/HaikuExtras
+++ b/build/jam/packages/HaikuExtras
@@ -5,7 +5,7 @@ HaikuPackage $(extrasPackage) ;
 
 # kernel modules
 AddFilesToPackage add-ons kernel partitioning_systems
-       : amiga_rdb@!m68k apple@!ppc ;
+       : amiga_rdb@!m68k apple@!ppc sun@!sparc ;
 
 AddFilesToPackage add-ons control_look : BeControlLook ;
 
diff --git a/docs/develop/partitioning_systems/sun.txt 
b/docs/develop/partitioning_systems/sun.txt
new file mode 100644
index 0000000000..a280c777d5
--- /dev/null
+++ b/docs/develop/partitioning_systems/sun.txt
@@ -0,0 +1,72 @@
+Partitioning system for Sun Sparc machines
+==========================================
+
+Infos extracted from [File System Forensic Analysis, Brian 
Carrier](urn:isbn:0-134-43954-6)
+and in particular the [online copy 
here](https://books.google.fr/books?id=Zpm9CgAAQBAJ&lpg=PT159&ots=6LIQ6blJCF&dq=solaris%20vtoc%20structure&hl=fr&pg=PT159#v=onepage&q=solaris%20vtoc%20structure&f=false),
 tables 6.9 and 6.10.
+
+The format is called VTOC (volume table of contents). It is stored at offset 0
+on-disk. All values are big endian.
+
+Note that the x86 version of Solaris uses a different layout.
+
+Byte offset|Description
+0-127      |ASCII disk label
+128-261    |VTOC *
+262-263    |Sectors to skip when writing
+264-265    |Setors to skip when reading
+266-419    |Reserved
+420-421    |Disk speed
+422-423    |Number of cylinders
+424-425    |Alternates per cylinder
+426-429    |Reserved
+430-431    |Interleave
+432-433    |Number of data cylinders
+434-435    |Number of alternate cylinders
+436-437    |Number of heads
+438-439    |Number of sectors per track
+440-443    |Reserved
+444-451    |Partition 1 disk map
+...        |More partition disk maps
+500-507    |Partition 8 disk map
+508-509    |Signature (0xDABE)
+510-511    |Checksum
+
+The VTOC itself:
+
+0-3   Version
+4-11  Volume name
+12-13 Number of partitions
+14-15 Partition 1 type
+16-17 Partition 1 flags
+...   More partition types and flags
+42-45 Partition 8 type and flags
+46-57 Boot info
+58-59 Reserved
+60-63 Signature 0x600DDEEE
+64-101 Reserved
+102-105 Partition 1 timestamp
+...     More partition timestamps
+130-133 Parittion 8 timestamp
+
+Partition types (informative):
+
+0 unassigned
+1 /boot
+2 /
+3 swap
+4 /usr
+5 entire disk
+6 /stand
+7 /var
+8 /home
+9 alternate sector
+10 cachefs
+
+Partition flags:
+1 Not mountable
+128 read only
+
+Disk maps:
+
+0-3 Starting cylinder
+4-7 Size (in sectors)
diff --git a/src/add-ons/kernel/partitioning_systems/Jamfile 
b/src/add-ons/kernel/partitioning_systems/Jamfile
index 77c050c83e..175954b924 100644
--- a/src/add-ons/kernel/partitioning_systems/Jamfile
+++ b/src/add-ons/kernel/partitioning_systems/Jamfile
@@ -6,4 +6,5 @@ HaikuSubInclude atari ;
 HaikuSubInclude gpt ;
 HaikuSubInclude intel ;
 HaikuSubInclude session ;
+HaikuSubInclude sun ;
 HaikuSubInclude vmdk ;
diff --git a/src/add-ons/kernel/partitioning_systems/sun/Jamfile 
b/src/add-ons/kernel/partitioning_systems/sun/Jamfile
new file mode 100644
index 0000000000..20d9f3804c
--- /dev/null
+++ b/src/add-ons/kernel/partitioning_systems/sun/Jamfile
@@ -0,0 +1,10 @@
+SubDir HAIKU_TOP src add-ons kernel partitioning_systems sun ;
+
+UsePrivateHeaders [ FDirName kernel disk_device_manager ] ;
+UsePrivateHeaders [ FDirName kernel ] ;
+UsePrivateHeaders [ FDirName storage ] ;
+
+KernelAddon sun :
+       sun.cpp
+       ;
+
diff --git a/src/add-ons/kernel/partitioning_systems/sun/sun.cpp 
b/src/add-ons/kernel/partitioning_systems/sun/sun.cpp
new file mode 100644
index 0000000000..9f8bbef516
--- /dev/null
+++ b/src/add-ons/kernel/partitioning_systems/sun/sun.cpp
@@ -0,0 +1,209 @@
+/*
+ * Copyright (C) 2020 Adrien Destugues <pulkomandy@xxxxxxxxxxxxx>
+ *
+ * Distributed under terms of the MIT license.
+ */
+
+
+#ifdef _BOOT_MODE
+#      include <boot/partitions.h>
+#else
+#      include <DiskDeviceTypes.h>
+#endif
+
+#include <ByteOrder.h>
+#include <ddm_modules.h>
+#include <util/kernel_cpp.h>
+#include <KernelExport.h>
+#include <stdint.h>
+#include <string.h>
+
+
+//#define TRACE_SUN_PARTITION
+#ifdef TRACE_SUN_PARTITION
+#      define TRACE(x) dprintf x
+#else
+#      define TRACE(x) ;
+#endif
+
+#define SUN_PARTITION_MODULE_NAME "partitioning_systems/sun/v1"
+#define SUN_PARTITION_NAME "Sun volume table of contents"
+
+
+static uint16_t kMainSignature = 0xDABE;
+static uint32_t kVtocSignature = 0x600DDEEE;
+static uint32_t kVtocVersion = 1;
+static off_t kSectorSize = 512;
+
+
+struct sun_vtoc {
+       char diskName[128];
+       struct {
+               uint32_t version;
+               char volumeName[8];
+               uint16_t partitionCount;
+               struct {
+                       uint16_t type;
+                       uint16_t flags;
+               } partitions[8];
+               uint8_t bootinfo[12];
+               uint8_t reserved[2];
+               uint32_t signature;
+               uint8_t reserved2[38];
+               uint32_t timestamp[8];
+       } __attribute__((packed)) vtoc;
+       uint16_t write_skip;
+       uint16_t read_skip;
+       uint8_t reserved[154];
+       uint16_t diskSpeed;
+       uint16_t cylinders;
+       uint16_t alternates;
+       uint8_t reserved2[4];
+       uint16_t interleave;
+       uint16_t dataCylinders;
+       uint16_t alternateCylinders;
+       uint16_t heads;
+       uint16_t sectorsPerTrack;
+       uint8_t reserved3[4];
+       struct {
+               uint32_t startCylinder;
+               uint32_t sectorCount;
+       } partitions[8];
+       uint16_t signature;
+       uint16_t checksum;
+} __attribute__((packed));
+
+
+//     #pragma mark -
+//     Sun VTOC public module interface
+
+
+static status_t
+sun_std_ops(int32 op, ...)
+{
+       switch (op) {
+               case B_MODULE_INIT:
+               case B_MODULE_UNINIT:
+                       return B_OK;
+       }
+
+       return B_ERROR;
+}
+
+
+static float
+sun_identify_partition(int fd, partition_data *partition, void **_cookie)
+{
+       uint8 buffer[512];
+       ssize_t bytesRead = read_pos(fd, 0, buffer, sizeof(buffer));
+       sun_vtoc *vtoc = (sun_vtoc *)buffer;
+       if (bytesRead < (ssize_t)sizeof(buffer)) {
+               TRACE(("%s: read error: %ld\n", __FUNCTION__, bytesRead));
+               return B_ERROR;
+       }
+
+       if (vtoc->signature == B_HOST_TO_BENDIAN_INT16(kMainSignature)
+               && vtoc->vtoc.signature == 
B_HOST_TO_BENDIAN_INT32(kVtocSignature)
+               && vtoc->vtoc.version == B_HOST_TO_BENDIAN_INT32(kVtocVersion)) 
{
+               // TODO verify the checksum
+
+               uint16_t partitionCount
+                       = B_BENDIAN_TO_HOST_INT16(vtoc->vtoc.partitionCount);
+               TRACE(("Found %d partitions\n", partitionCount));
+
+               if (partitionCount > 8)
+                       return B_ERROR;
+
+               vtoc = new sun_vtoc();
+               memcpy(vtoc, buffer, sizeof(sun_vtoc));
+               *_cookie = (void *)vtoc;
+
+               bool hasParent = (get_parent_partition(partition->id) != NULL);
+               if (!hasParent)
+                       return 0.61; // Larger than iso9660
+               else
+                       return 0.3;
+       }
+
+       return B_ERROR;
+}
+
+
+static status_t
+sun_scan_partition(int fd, partition_data *partition, void *cookie)
+{
+       sun_vtoc *vtoc = (sun_vtoc *)cookie;
+
+       partition->status = B_PARTITION_VALID;
+       partition->flags |= B_PARTITION_PARTITIONING_SYSTEM
+                                               | B_PARTITION_READ_ONLY;
+       partition->content_size = partition->size;
+
+       off_t headCount = B_BENDIAN_TO_HOST_INT16(vtoc->heads);
+       off_t sectorsPerTrack = B_BENDIAN_TO_HOST_INT16(vtoc->sectorsPerTrack);
+       off_t cylinderSize = kSectorSize * headCount * sectorsPerTrack;
+
+       TRACE(("%" B_PRIdOFF " heads, %" B_PRIdOFF " sectors, cylindersize %"
+               B_PRIdOFF "\n", headCount, sectorsPerTrack, cylinderSize));
+
+       for (int i = 0; i < B_BENDIAN_TO_HOST_INT16(vtoc->vtoc.partitionCount);
+               i++) {
+               uint16_t type = 
B_BENDIAN_TO_HOST_INT16(vtoc->vtoc.partitions[i].type);
+               // Ignore unused and "whole disk" entries
+               if (type == 0 || type == 5)
+                       continue;
+
+               off_t start = B_BENDIAN_TO_HOST_INT32(
+                       vtoc->partitions[i].startCylinder) * cylinderSize;
+               off_t size = 
B_BENDIAN_TO_HOST_INT32(vtoc->partitions[i].sectorCount)
+                       * kSectorSize;
+               TRACE(("Part %d type %d start %" B_PRIdOFF " size %" B_PRIdOFF 
"\n", i,
+                       type, start, size));
+               partition_data *child = create_child_partition(partition->id, i,
+                       start, size, -1);
+               if (child == NULL) {
+                       TRACE(("sun: Creating child at index %d failed\n", i));
+                       return B_ERROR;
+               }
+               child->block_size = partition->block_size;
+       }
+
+       return B_OK;
+}
+
+
+static void
+sun_free_identify_partition_cookie(partition_data *partition, void *_cookie)
+{
+       delete (sun_vtoc *)_cookie;
+}
+
+
+#ifndef _BOOT_MODE
+static partition_module_info sSunPartitionModule = {
+#else
+partition_module_info gSunPartitionModule = {
+#endif
+       {
+               SUN_PARTITION_MODULE_NAME,
+               0,
+               sun_std_ops
+       },
+       "sun",                                                  // short_name
+       SUN_PARTITION_NAME,                             // pretty_name
+       0,                                                                      
// flags
+
+       // scanning
+       sun_identify_partition,         // identify_partition
+       sun_scan_partition,                     // scan_partition
+       sun_free_identify_partition_cookie,     // 
free_identify_partition_cookie
+       NULL,
+//     atari_free_partition_content_cookie,    // free_partition_content_cookie
+};
+
+#ifndef _BOOT_MODE
+partition_module_info *modules[] = {
+       &sSunPartitionModule,
+       NULL
+};
+#endif


Other related posts:

  • » [haiku-commits] haiku: hrev54293 - src/add-ons/kernel/partitioning_systems/sun docs/develop/partitioning_systems - Adrien Destugues