diff options
author | nbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2006-12-07 00:26:26 +0000 |
---|---|---|
committer | nbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2006-12-07 00:26:26 +0000 |
commit | 19021c16ffef5393aebedf009c57a86b11b996c2 (patch) | |
tree | 09f622c2cec8948505435552ac6dddf3d790ee98 /target/linux | |
parent | e225f119a7b136639695da38345d0c4d78abe2ea (diff) |
remove custom partition table hack, add ptgen utility for generating partition tables
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@5704 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'target/linux')
-rw-r--r-- | target/linux/rb532-2.6/config | 1 | ||||
-rw-r--r-- | target/linux/rb532-2.6/image/Makefile | 16 | ||||
-rwxr-xr-x | target/linux/rb532-2.6/image/gen_image.sh | 17 | ||||
-rw-r--r-- | target/linux/rb532-2.6/patches/130-custom_partitions.patch | 311 |
4 files changed, 18 insertions, 327 deletions
diff --git a/target/linux/rb532-2.6/config b/target/linux/rb532-2.6/config index 2d2138261..98474ad71 100644 --- a/target/linux/rb532-2.6/config +++ b/target/linux/rb532-2.6/config @@ -1180,7 +1180,6 @@ CONFIG_CIFS=m # Partition Types # CONFIG_PARTITION_ADVANCED=y -CONFIG_OPENWRT_PARTITION=y # CONFIG_ACORN_PARTITION is not set # CONFIG_OSF_PARTITION is not set # CONFIG_AMIGA_PARTITION is not set diff --git a/target/linux/rb532-2.6/image/Makefile b/target/linux/rb532-2.6/image/Makefile index 490721446..1f3a88ba4 100644 --- a/target/linux/rb532-2.6/image/Makefile +++ b/target/linux/rb532-2.6/image/Makefile @@ -39,9 +39,6 @@ define Image/BuildKernel $(CP) $(KDIR)/loader.elf $(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL)-vmlinux endef -PARTITION1=\x80\x01\x01\x00\x27\x01\x20\x7b\x20\x00\x00\x00\xe0\x1e\x00\x00# 4 MB (kernel part) -PARTITION2=\x00\x00\x01\x7c\x83\x01\xa0\x64\x00\x1f\x00\x00\x40\x7a\x00\x00# 16 MB (rootfs part) - define Image/cmdline/jffs2-64k block2mtd.block2mtd=/dev/cfa2,65536 root=/dev/mtdblock0 rootfstype=jffs2 endef @@ -56,18 +53,7 @@ endef define Image/Build $(STAGING_DIR)/bin/patch-cmdline $(LINUX_DIR)/vmlinux '$(strip $(call Image/cmdline/$(1))) ' - ( \ - echo -ne OWRT | dd bs=$$$$((0x1be)) conv=sync; \ - ( \ - echo -ne '$(strip $(PARTITION1))'; \ - echo -ne '$(strip $(PARTITION2))'; \ - ) | dd bs=$$$$((0x40)) conv=sync; \ - echo -ne '\x55\xaa'; \ - dd if=/dev/zero bs=$$$$((0x3e00)) conv=sync count=1; \ - dd if=$(LINUX_DIR)/vmlinux bs=$$$$((0x3dc000)) conv=sync; \ - cat $(KDIR)/root.$(1); \ - echo -ne '\xde\xad\xc0\xde'; \ - ) > $(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL)-$(1).bin + ./gen_image.sh $(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL)-$(1).bin 4 $(LINUX_DIR)/vmlinux 16 $(KDIR)/root.$(1) endef $(eval $(call BuildImage)) diff --git a/target/linux/rb532-2.6/image/gen_image.sh b/target/linux/rb532-2.6/image/gen_image.sh new file mode 100755 index 000000000..e81285979 --- /dev/null +++ b/target/linux/rb532-2.6/image/gen_image.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +OUTPUT="$1" +KERNELSIZE="$2" +KERNELIMAGE="$3" +ROOTFSSIZE="$4" +ROOTFSIMAGE="$5" + +rm -f "$OUTPUT" + +# create partition table +set `ptgen -o "$OUTPUT" -h 16 -s 32 -t 0x27 -p ${KERNELSIZE}m -t 0x83 -p ${ROOTFSSIZE}m` + +KERNELOFFSET="$(($1 / 512))" +ROOTFSOFFSET="$(($2 / 512))" + +dd if="$KERNELIMAGE" of="$OUTPUT" bs=512 conv=notrunc seek="$KERNELOFFSET" +dd if="$ROOTFSIMAGE" of="$OUTPUT" bs=512 conv=notrunc seek="$ROOTFSOFFSET" diff --git a/target/linux/rb532-2.6/patches/130-custom_partitions.patch b/target/linux/rb532-2.6/patches/130-custom_partitions.patch deleted file mode 100644 index e4b332703..000000000 --- a/target/linux/rb532-2.6/patches/130-custom_partitions.patch +++ /dev/null @@ -1,311 +0,0 @@ -diff -urN linux.old/fs/partitions/check.c linux.dev/fs/partitions/check.c ---- linux.old/fs/partitions/check.c 2006-05-31 02:31:44.000000000 +0200 -+++ linux.dev/fs/partitions/check.c 2006-06-15 01:27:17.000000000 +0200 -@@ -29,6 +29,7 @@ - #include "ldm.h" - #include "mac.h" - #include "msdos.h" -+#include "openwrt.h" - #include "osf.h" - #include "sgi.h" - #include "sun.h" -@@ -48,6 +49,9 @@ - * Probe partition formats with tables at disk address 0 - * that also have an ADFS boot block at 0xdc0. - */ -+#ifdef CONFIG_OPENWRT_PARTITION -+ openwrt_partition, -+#endif - #ifdef CONFIG_ACORN_PARTITION_ICS - adfspart_check_ICS, - #endif -diff -urN linux.old/fs/partitions/Kconfig linux.dev/fs/partitions/Kconfig ---- linux.old/fs/partitions/Kconfig 2006-05-31 02:31:44.000000000 +0200 -+++ linux.dev/fs/partitions/Kconfig 2006-06-15 01:27:17.000000000 +0200 -@@ -14,6 +14,12 @@ - - If unsure, say N. - -+config OPENWRT_PARTITION -+ bool "OpenWrt partition support" if PARTITION_ADVANCED -+ default y -+ help -+ Support the custom OpenWrt partition map -+ - config ACORN_PARTITION - bool "Acorn partition support" if PARTITION_ADVANCED - default y if ARCH_ACORN -diff -urN linux.old/fs/partitions/Makefile linux.dev/fs/partitions/Makefile ---- linux.old/fs/partitions/Makefile 2006-05-31 02:31:44.000000000 +0200 -+++ linux.dev/fs/partitions/Makefile 2006-06-15 01:27:17.000000000 +0200 -@@ -11,6 +11,7 @@ - obj-$(CONFIG_MAC_PARTITION) += mac.o - obj-$(CONFIG_LDM_PARTITION) += ldm.o - obj-$(CONFIG_MSDOS_PARTITION) += msdos.o -+obj-$(CONFIG_OPENWRT_PARTITION) += openwrt.o - obj-$(CONFIG_OSF_PARTITION) += osf.o - obj-$(CONFIG_SGI_PARTITION) += sgi.o - obj-$(CONFIG_SUN_PARTITION) += sun.o -diff -urN linux.old/fs/partitions/openwrt.c linux.dev/fs/partitions/openwrt.c ---- linux.old/fs/partitions/openwrt.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux.dev/fs/partitions/openwrt.c 2006-06-15 01:27:17.000000000 +0200 -@@ -0,0 +1,249 @@ -+/* -+ * fs/partitions/openwrt.c -+ * -+ * Code extracted from drivers/block/genhd.c -+ * and fs/partitions/msdos.c -+ * -+ * Copyright (C) 2006 Felix Fietkau <nbd@openwrt.org> -+ * Copyright (C) 1991-1998 Linus Torvalds -+ * -+ * Thanks to Branko Lankester, lankeste@fwi.uva.nl, who found a bug -+ * in the early extended-partition checks and added DM partitions -+ * -+ * Support for DiskManager v6.0x added by Mark Lord, -+ * with information provided by OnTrack. This now works for linux fdisk -+ * and LILO, as well as loadlin and bootln. Note that disks other than -+ * /dev/hda *must* have a "DOS" type 0x51 partition in the first slot (hda1). -+ * -+ * More flexible handling of extended partitions - aeb, 950831 -+ * -+ * Check partition table on IDE disks for common CHS translations -+ * -+ * Re-organised Feb 1998 Russell King -+ */ -+ -+#include <linux/config.h> -+ -+#include "check.h" -+#include "openwrt.h" -+ -+/* -+ * Many architectures don't like unaligned accesses, while -+ * the nr_sects and start_sect partition table entries are -+ * at a 2 (mod 4) address. -+ */ -+#include <asm/unaligned.h> -+ -+#define SYS_IND(p) (get_unaligned(&p->sys_ind)) -+#define NR_SECTS(p) ({ __typeof__(p->nr_sects) __a = \ -+ get_unaligned(&p->nr_sects); \ -+ le32_to_cpu(__a); \ -+ }) -+ -+#define START_SECT(p) ({ __typeof__(p->start_sect) __a = \ -+ get_unaligned(&p->start_sect); \ -+ le32_to_cpu(__a); \ -+ }) -+ -+static inline int is_extended_partition(struct partition *p) -+{ -+ return (SYS_IND(p) == DOS_EXTENDED_PARTITION || -+ SYS_IND(p) == WIN98_EXTENDED_PARTITION || -+ SYS_IND(p) == LINUX_EXTENDED_PARTITION); -+} -+ -+#define MSDOS_LABEL_MAGIC1 0x55 -+#define MSDOS_LABEL_MAGIC2 0xAA -+ -+static inline int -+msdos_magic_present(unsigned char *p) -+{ -+ return (p[0] == MSDOS_LABEL_MAGIC1 && p[1] == MSDOS_LABEL_MAGIC2); -+} -+ -+static inline int -+openwrt_magic_present(unsigned char *p) -+{ -+ return (p[0] == 'O' && -+ p[1] == 'W' && -+ p[2] == 'R' && -+ p[3] == 'T'); -+} -+ -+/* -+ * Create devices for each logical partition in an extended partition. -+ * The logical partitions form a linked list, with each entry being -+ * a partition table with two entries. The first entry -+ * is the real data partition (with a start relative to the partition -+ * table start). The second is a pointer to the next logical partition -+ * (with a start relative to the entire extended partition). -+ * We do not create a Linux partition for the partition tables, but -+ * only for the actual data partitions. -+ */ -+ -+static void -+parse_extended(struct parsed_partitions *state, struct block_device *bdev, -+ u32 first_sector, u32 first_size) -+{ -+ struct partition *p; -+ Sector sect; -+ unsigned char *data; -+ u32 this_sector, this_size; -+ int sector_size = bdev_hardsect_size(bdev) / 512; -+ int loopct = 0; /* number of links followed -+ without finding a data partition */ -+ int i; -+ -+ this_sector = first_sector; -+ this_size = first_size; -+ -+ while (1) { -+ if (++loopct > 100) -+ return; -+ if (state->next == state->limit) -+ return; -+ data = read_dev_sector(bdev, this_sector, §); -+ if (!data) -+ return; -+ -+ if (!msdos_magic_present(data + 510)) -+ goto done; -+ -+ p = (struct partition *) (data + 0x1be); -+ -+ /* -+ * Usually, the first entry is the real data partition, -+ * the 2nd entry is the next extended partition, or empty, -+ * and the 3rd and 4th entries are unused. -+ * However, DRDOS sometimes has the extended partition as -+ * the first entry (when the data partition is empty), -+ * and OS/2 seems to use all four entries. -+ */ -+ -+ /* -+ * First process the data partition(s) -+ */ -+ for (i=0; i<4; i++, p++) { -+ u32 offs, size, next; -+ if (!NR_SECTS(p) || is_extended_partition(p)) -+ continue; -+ -+ /* Check the 3rd and 4th entries - -+ these sometimes contain random garbage */ -+ offs = START_SECT(p)*sector_size; -+ size = NR_SECTS(p)*sector_size; -+ next = this_sector + offs; -+ if (i >= 2) { -+ if (offs + size > this_size) -+ continue; -+ if (next < first_sector) -+ continue; -+ if (next + size > first_sector + first_size) -+ continue; -+ } -+ -+ put_partition(state, state->next, next, size); -+ if (SYS_IND(p) == LINUX_RAID_PARTITION) -+ state->parts[state->next].flags = 1; -+ loopct = 0; -+ if (++state->next == state->limit) -+ goto done; -+ } -+ /* -+ * Next, process the (first) extended partition, if present. -+ * (So far, there seems to be no reason to make -+ * parse_extended() recursive and allow a tree -+ * of extended partitions.) -+ * It should be a link to the next logical partition. -+ */ -+ p -= 4; -+ for (i=0; i<4; i++, p++) -+ if (NR_SECTS(p) && is_extended_partition(p)) -+ break; -+ if (i == 4) -+ goto done; /* nothing left to do */ -+ -+ this_sector = first_sector + START_SECT(p) * sector_size; -+ this_size = NR_SECTS(p) * sector_size; -+ put_dev_sector(sect); -+ } -+done: -+ put_dev_sector(sect); -+} -+ -+ -+int openwrt_partition(struct parsed_partitions *state, struct block_device *bdev) -+{ -+ int sector_size = bdev_hardsect_size(bdev) / 512; -+ Sector sect; -+ unsigned char *data; -+ struct partition *p; -+ int slot; -+ u32 last_block = 0; -+ u32 size = 0; -+ int firstfree = 5; -+ -+ data = read_dev_sector(bdev, 0, §); -+ if (!data) -+ return -1; -+ if (!openwrt_magic_present(data)) { -+ printk("No OpenWrt partition table detected\n"); -+ put_dev_sector(sect); -+ return 0; -+ } -+ -+ /* -+ * Now that the 55aa signature is present, this is probably -+ * either the boot sector of a FAT filesystem or a DOS-type -+ * partition table. Reject this in case the boot indicator -+ * is not 0 or 0x80. -+ */ -+ p = (struct partition *) (data + 0x1be); -+ for (slot = 1; slot <= 4; slot++, p++) { -+ if (p->boot_ind != 0 && p->boot_ind != 0x80) { -+ put_dev_sector(sect); -+ return 0; -+ } -+ } -+ -+ p = (struct partition *) (data + 0x1be); -+ -+ /* -+ * Look for partitions in two passes: -+ * First find the primary and DOS-type extended partitions. -+ */ -+ -+ state->next = 6; -+ for (slot = 1 ; slot <= 4 ; slot++, p++) { -+ u32 start = START_SECT(p)*sector_size; -+ size = NR_SECTS(p)*sector_size; -+ if (!size) { -+ if (firstfree > slot) -+ firstfree = slot; -+ -+ continue; -+ } -+ if (is_extended_partition(p)) { -+ /* prevent someone doing mkfs or mkswap on an -+ extended partition, but leave room for LILO */ -+ last_block = start + size; -+ put_partition(state, slot, start, size == 1 ? 1 : 2); -+ printk(" <"); -+ parse_extended(state, bdev, start, size); -+ printk(" >"); -+ continue; -+ } -+ if ((start + size) > get_capacity(bdev->bd_disk)) -+ size = get_capacity(bdev->bd_disk) - start; -+ last_block = start + size; -+ put_partition(state, slot, start, size); -+ } -+ if (last_block + 1024 < (size = get_capacity(bdev->bd_disk))) -+ put_partition(state, firstfree, last_block, size - last_block); -+ -+ printk("\n"); -+ -+ put_dev_sector(sect); -+ return 1; -+} -+ -diff -urN linux.old/fs/partitions/openwrt.h linux.dev/fs/partitions/openwrt.h ---- linux.old/fs/partitions/openwrt.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux.dev/fs/partitions/openwrt.h 2006-06-15 01:27:17.000000000 +0200 -@@ -0,0 +1,6 @@ -+/* -+ * fs/partitions/openwrt.h -+ */ -+ -+int openwrt_partition(struct parsed_partitions *state, struct block_device *bdev); -+ |