|
@@ -120,3 +120,81 @@ static int riscix_partition(struct parsed_partitions *state,
|
|
|
#define LINUX_NATIVE_MAGIC 0xdeafa1de
|
|
|
#define LINUX_SWAP_MAGIC 0xdeafab1e
|
|
|
|
|
|
+struct linux_part {
|
|
|
+ __le32 magic;
|
|
|
+ __le32 start_sect;
|
|
|
+ __le32 nr_sects;
|
|
|
+};
|
|
|
+
|
|
|
+#if defined(CONFIG_ACORN_PARTITION_CUMANA) || \
|
|
|
+ defined(CONFIG_ACORN_PARTITION_ADFS)
|
|
|
+static int linux_partition(struct parsed_partitions *state,
|
|
|
+ unsigned long first_sect, int slot,
|
|
|
+ unsigned long nr_sects)
|
|
|
+{
|
|
|
+ Sector sect;
|
|
|
+ struct linux_part *linuxp;
|
|
|
+ unsigned long size = nr_sects > 2 ? 2 : nr_sects;
|
|
|
+
|
|
|
+ strlcat(state->pp_buf, " [Linux]", PAGE_SIZE);
|
|
|
+
|
|
|
+ put_partition(state, slot++, first_sect, size);
|
|
|
+
|
|
|
+ linuxp = read_part_sector(state, first_sect, §);
|
|
|
+ if (!linuxp)
|
|
|
+ return -1;
|
|
|
+
|
|
|
+ strlcat(state->pp_buf, " <", PAGE_SIZE);
|
|
|
+ while (linuxp->magic == cpu_to_le32(LINUX_NATIVE_MAGIC) ||
|
|
|
+ linuxp->magic == cpu_to_le32(LINUX_SWAP_MAGIC)) {
|
|
|
+ if (slot == state->limit)
|
|
|
+ break;
|
|
|
+ put_partition(state, slot++, first_sect +
|
|
|
+ le32_to_cpu(linuxp->start_sect),
|
|
|
+ le32_to_cpu(linuxp->nr_sects));
|
|
|
+ linuxp ++;
|
|
|
+ }
|
|
|
+ strlcat(state->pp_buf, " >", PAGE_SIZE);
|
|
|
+
|
|
|
+ put_dev_sector(sect);
|
|
|
+ return slot;
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifdef CONFIG_ACORN_PARTITION_CUMANA
|
|
|
+int adfspart_check_CUMANA(struct parsed_partitions *state)
|
|
|
+{
|
|
|
+ unsigned long first_sector = 0;
|
|
|
+ unsigned int start_blk = 0;
|
|
|
+ Sector sect;
|
|
|
+ unsigned char *data;
|
|
|
+ char *name = "CUMANA/ADFS";
|
|
|
+ int first = 1;
|
|
|
+ int slot = 1;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Try Cumana style partitions - sector 6 contains ADFS boot block
|
|
|
+ * with pointer to next 'drive'.
|
|
|
+ *
|
|
|
+ * There are unknowns in this code - is the 'cylinder number' of the
|
|
|
+ * next partition relative to the start of this one - I'm assuming
|
|
|
+ * it is.
|
|
|
+ *
|
|
|
+ * Also, which ID did Cumana use?
|
|
|
+ *
|
|
|
+ * This is totally unfinished, and will require more work to get it
|
|
|
+ * going. Hence it is totally untested.
|
|
|
+ */
|
|
|
+ do {
|
|
|
+ struct adfs_discrecord *dr;
|
|
|
+ unsigned int nr_sects;
|
|
|
+
|
|
|
+ data = read_part_sector(state, start_blk * 2 + 6, §);
|
|
|
+ if (!data)
|
|
|
+ return -1;
|
|
|
+
|
|
|
+ if (slot == state->limit)
|
|
|
+ break;
|
|
|
+
|
|
|
+ dr = adfs_partition(state, name, data, first_sector, slot++);
|
|
|
+ if (!dr)
|