All of lore.kernel.org
 help / color / mirror / Atom feed
From: Phileas Fogg <phileas-fogg@mail.ru>
To: dm-devel@redhat.com
Subject: [PATCH] Add PS3 HDD partition table support
Date: Sat, 16 Feb 2013 13:52:37 +0100	[thread overview]
Message-ID: <511F8115.5000501@mail.ru> (raw)

Hi,

i would like to submit a patch which adds the PS3 HDD partition table support to 
kpartx.

--- a/kpartx/Makefile    2012-09-07 00:15:06.163999993 -0800
+++ b/kpartx/Makefile    2012-09-07 00:15:25.935999993 -0800
@@ -14,7 +14,7 @@

  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)
--- a/kpartx/byteorder.h    2012-09-07 00:30:30.679999971 -0800
+++ b/kpartx/byteorder.h    2012-09-07 00:31:08.075999971 -0800
@@ -12,12 +12,16 @@
  #  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
--- a/kpartx/kpartx.h    2012-09-07 00:17:56.503999989 -0800
+++ b/kpartx/kpartx.h    2012-09-07 00:18:08.495999989 -0800
@@ -39,6 +39,7 @@
  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);

--- a/kpartx/kpartx.c    2012-09-07 00:15:37.567999993 -0800
+++ b/kpartx/kpartx.c    2012-09-07 00:16:05.635999993 -0800
@@ -80,6 +80,7 @@
      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";
--- /dev/null    2012-09-07 00:07:55.900000003 -0800
+++ b/kpartx/ps3.c    2012-09-07 00:29:52.987999973 -0800
@@ -0,0 +1,72 @@
+#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;
+}

             reply	other threads:[~2013-02-16 12:52 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-02-16 12:52 Phileas Fogg [this message]
2013-02-20  6:28 ` [PATCH] Add PS3 HDD partition table support Christophe Varoqui
2013-02-20 17:47   ` Phileas Fogg

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=511F8115.5000501@mail.ru \
    --to=phileas-fogg@mail.ru \
    --cc=dm-devel@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.