[kpartx] Add PS3 HDD partition table support
authorPhileas Fogg <phileas-fogg@mail.ru>
Thu, 21 Feb 2013 21:10:18 +0000 (22:10 +0100)
committerChristophe Varoqui <christophe.varoqui@opensvc.com>
Thu, 21 Feb 2013 21:10:18 +0000 (22:10 +0100)
kpartx/Makefile
kpartx/byteorder.h
kpartx/kpartx.c
kpartx/kpartx.h
kpartx/ps3.c [new file with mode: 0644]

index b0d73a3..4ba38ba 100644 (file)
@@ -14,7 +14,7 @@ endif
 
 LDFLAGS = -ldevmapper
 OBJS = bsd.o dos.o kpartx.o solaris.o unixware.o dasd.o sun.o \
-       gpt.o mac.o crc32.o lopart.o xstrncpy.o devmapper.o
+       gpt.o mac.o ps3.o crc32.o lopart.o xstrncpy.o devmapper.o
 EXEC = kpartx
 
 all: $(EXEC)
index 21962d6..199c66b 100644 (file)
 #  define le16_to_cpu(x) (x)
 #  define be16_to_cpu(x) bswap_16(x)
 #  define le32_to_cpu(x) (x)
+#  define le64_to_cpu(x) (x)
 #  define be32_to_cpu(x) bswap_32(x)
+#  define be64_to_cpu(x) bswap_64(x)
 #elif BYTE_ORDER == BIG_ENDIAN
 #  define le16_to_cpu(x) bswap_16(x)
 #  define be16_to_cpu(x) (x)
 #  define le32_to_cpu(x) bswap_32(x)
+#  define le64_to_cpu(x) bswap_64(x)
 #  define be32_to_cpu(x) (x)
+#  define be64_to_cpu(x) (x)
 #else
 #  error unsupported
 #endif
index dd57294..30b3bd9 100644 (file)
@@ -81,6 +81,7 @@ initpts(void)
        addpts("dasd", read_dasd_pt);
        addpts("mac", read_mac_pt);
        addpts("sun", read_sun_pt);
+       addpts("ps3", read_ps3_pt);
 }
 
 static char short_opts[] = "rladfgvp:t:su";
index 43ae3f8..61d31b6 100644 (file)
@@ -39,6 +39,7 @@ extern ptreader read_gpt_pt;
 extern ptreader read_dasd_pt;
 extern ptreader read_mac_pt;
 extern ptreader read_sun_pt;
+extern ptreader read_ps3_pt;
 
 char *getblock(int fd, unsigned int secnr);
 
diff --git a/kpartx/ps3.c b/kpartx/ps3.c
new file mode 100644 (file)
index 0000000..d1e5d64
--- /dev/null
@@ -0,0 +1,77 @@
+#include "kpartx.h"
+#include "byteorder.h"
+#include <sys/types.h>
+#include <string.h>
+
+#define SECTOR_SIZE            512
+#define MAX_ACL_ENTRIES                8
+#define MAX_PARTITIONS         8
+
+#define MAGIC1                 0x0FACE0FFULL
+#define MAGIC2                 0xDEADFACEULL
+
+struct p_acl_entry {
+       u_int64_t laid;
+       u_int64_t rights;
+};
+
+struct d_partition {
+       u_int64_t p_start;
+       u_int64_t p_size;
+       struct p_acl_entry p_acl[MAX_ACL_ENTRIES];
+};
+
+struct disklabel {
+       u_int8_t d_res1[16];
+       u_int64_t d_magic1;
+       u_int64_t d_magic2;
+       u_int64_t d_res2;
+       u_int64_t d_res3;
+       struct d_partition d_partitions[MAX_PARTITIONS];
+       u_int8_t d_pad[0x600 - MAX_PARTITIONS * sizeof(struct d_partition)- 0x30];
+};
+
+static int
+read_disklabel(int fd, struct disklabel *label) {
+       unsigned char *data;
+       int i;
+
+       for (i = 0; i < sizeof(struct disklabel) / SECTOR_SIZE; i++) {
+               data = (unsigned char *) getblock(fd, i);
+               if (!data)
+                       return 0;
+
+               memcpy((unsigned char *) label + i * SECTOR_SIZE, data, SECTOR_SIZE);
+       }
+
+       return 1;
+}
+
+int
+read_ps3_pt(int fd, struct slice all, struct slice *sp, int ns) {
+       struct disklabel label;
+        int n = 0;
+       int i;
+
+       if (!read_disklabel(fd, &label))
+               return -1;
+
+       if ((be64_to_cpu(label.d_magic1) != MAGIC1) ||
+           (be64_to_cpu(label.d_magic2) != MAGIC2))
+               return -1;
+
+       for (i = 0; i < MAX_PARTITIONS; i++) {
+               if (label.d_partitions[i].p_start && label.d_partitions[i].p_size) {
+                       sp[n].start =  be64_to_cpu(label.d_partitions[i].p_start);
+                       sp[n].size =  be64_to_cpu(label.d_partitions[i].p_size);
+                       n++;
+               }
+       }
+
+       return n;
+}
+
+
+
+
+