From d1e063beb43e595680c65e3804d1f8ddff53373b Mon Sep 17 00:00:00 2001 From: Guido Guenther Date: Sat, 18 Nov 2006 23:48:07 +0100 Subject: Imported Debian version 0.3.8.8 --- tip22/kernel/parse_rd_cmd_line-2.4-2002-05-09.diff | 88 +++++++++++ tip22/kernel/parse_rd_cmd_line-2.6-2004-11-17.diff | 172 +++++++++++++++++++++ 2 files changed, 260 insertions(+) create mode 100644 tip22/kernel/parse_rd_cmd_line-2.4-2002-05-09.diff create mode 100644 tip22/kernel/parse_rd_cmd_line-2.6-2004-11-17.diff (limited to 'tip22/kernel') diff --git a/tip22/kernel/parse_rd_cmd_line-2.4-2002-05-09.diff b/tip22/kernel/parse_rd_cmd_line-2.4-2002-05-09.diff new file mode 100644 index 0000000..c1bd785 --- /dev/null +++ b/tip22/kernel/parse_rd_cmd_line-2.4-2002-05-09.diff @@ -0,0 +1,88 @@ +Index: arch/mips/kernel/setup.c +=================================================================== +RCS file: /cvs/linux/arch/mips/kernel/setup.c,v +retrieving revision 1.96.2.12 +diff -u -u -r1.96.2.12 setup.c +--- arch/mips/kernel/setup.c 2002/02/15 21:05:48 1.96.2.12 ++++ arch/mips/kernel/setup.c 2002/05/09 17:17:59 +@@ -650,6 +650,38 @@ + } + } + ++static inline void parse_rd_cmdline(unsigned long* rd_start, unsigned long* rd_end) ++{ ++ char c = ' ', *to = command_line, *from = saved_command_line; ++ int len = 0; ++ unsigned long rd_size = 0; ++ ++ for (;;) { ++ /* ++ * "rd_start=0xNNNNNNNN" defines the memory address of an initrd ++ * "rd_size=0xNN" it's size ++ */ ++ if (c == ' ' && !memcmp(from, "rd_start=", 9)) { ++ if (to != command_line) ++ to--; ++ (*rd_start) = memparse(from + 9, &from); ++ } ++ if (c == ' ' && !memcmp(from, "rd_size=", 8)) { ++ if (to != command_line) ++ to--; ++ rd_size = memparse(from + 8, &from); ++ } ++ c = *(from++); ++ if (!c) ++ break; ++ if (CL_SIZE <= ++len) ++ break; ++ *(to++) = c; ++ } ++ *to = '\0'; ++ (*rd_end) = (*rd_start) + rd_size; ++} ++ + void __init setup_arch(char **cmdline_p) + { + void atlas_setup(void); +@@ -674,10 +706,7 @@ + + unsigned long bootmap_size; + unsigned long start_pfn, max_pfn, max_low_pfn, first_usable_pfn; +-#ifdef CONFIG_BLK_DEV_INITRD +- unsigned long tmp; +- unsigned long* initrd_header; +-#endif ++ unsigned long end = &_end; + + int i; + +@@ -828,22 +857,18 @@ + #define MAXMEM_PFN PFN_DOWN(MAXMEM) + + #ifdef CONFIG_BLK_DEV_INITRD +- tmp = (((unsigned long)&_end + PAGE_SIZE-1) & PAGE_MASK) - 8; +- if (tmp < (unsigned long)&_end) +- tmp += PAGE_SIZE; +- initrd_header = (unsigned long *)tmp; +- if (initrd_header[0] == 0x494E5244) { +- initrd_start = (unsigned long)&initrd_header[2]; +- initrd_end = initrd_start + initrd_header[1]; ++ parse_rd_cmdline(&initrd_start, &initrd_end); ++ if(initrd_start && initrd_end) ++ end = initrd_end; ++ else { ++ initrd_start = initrd_end = 0; + } +- start_pfn = PFN_UP(__pa((&_end)+(initrd_end - initrd_start) + PAGE_SIZE)); +-#else ++#endif /* CONFIG_BLK_DEV_INITRD */ + /* + * Partially used pages are not usable - thus + * we are rounding upwards. + */ +- start_pfn = PFN_UP(__pa(&_end)); +-#endif /* CONFIG_BLK_DEV_INITRD */ ++ start_pfn = PFN_UP(__pa(end)); + + /* Find the highest page frame number we have available. */ + max_pfn = 0; diff --git a/tip22/kernel/parse_rd_cmd_line-2.6-2004-11-17.diff b/tip22/kernel/parse_rd_cmd_line-2.6-2004-11-17.diff new file mode 100644 index 0000000..504dd66 --- /dev/null +++ b/tip22/kernel/parse_rd_cmd_line-2.6-2004-11-17.diff @@ -0,0 +1,172 @@ +Index: arch/mips/kernel/setup.c +=================================================================== +RCS file: /home/cvs/linux/arch/mips/kernel/setup.c,v +retrieving revision 1.171 +diff -u -p -r1.171 setup.c +--- arch/mips/kernel/setup.c 28 Jun 2004 21:04:12 -0000 1.171 ++++ arch/mips/kernel/setup.c 19 Nov 2004 00:45:23 -0000 +@@ -194,6 +194,68 @@ static inline void parse_cmdline_early(v + } + } + ++static inline int parse_rd_cmdline(unsigned long* rd_start, unsigned long* rd_end) ++{ ++ /* ++ * "rd_start=0xNNNNNNNN" defines the memory address of an initrd ++ * "rd_size=0xNN" it's size ++ */ ++ unsigned long start = 0; ++ unsigned long size = 0; ++ unsigned long end; ++ char cmd_line[CL_SIZE]; ++ char *start_str; ++ char *size_str; ++ char *tmp; ++ ++ strcpy(cmd_line, command_line); ++ *command_line = 0; ++ tmp = cmd_line; ++ /* Ignore "rd_start=" strings in other parameters. */ ++ start_str = strstr(cmd_line, "rd_start="); ++ if (start_str && start_str != cmd_line && *(start_str - 1) != ' ') ++ start_str = strstr(start_str, " rd_start="); ++ while (start_str) { ++ if (start_str != cmd_line) ++ strncat(command_line, tmp, start_str - tmp); ++ start = memparse(start_str + 9, &start_str); ++ tmp = start_str + 1; ++ start_str = strstr(start_str, " rd_start="); ++ } ++ if (*tmp) ++ strcat(command_line, tmp); ++ ++ strcpy(cmd_line, command_line); ++ *command_line = 0; ++ tmp = cmd_line; ++ /* Ignore "rd_size" strings in other parameters. */ ++ size_str = strstr(cmd_line, "rd_size="); ++ if (size_str && size_str != cmd_line && *(size_str - 1) != ' ') ++ size_str = strstr(size_str, " rd_size="); ++ while (size_str) { ++ if (size_str != cmd_line) ++ strncat(command_line, tmp, size_str - tmp); ++ size = memparse(size_str + 8, &size_str); ++ tmp = size_str + 1; ++ size_str = strstr(size_str, " rd_size="); ++ } ++ if (*tmp) ++ strcat(command_line, tmp); ++ ++#ifdef CONFIG_MIPS64 ++ /* HACK: Guess if the sign extension was forgotten */ ++ if (start > 0x0000000080000000 && start < 0x00000000ffffffff) ++ start |= 0xffffffff00000000; ++#endif ++ ++ end = start + size; ++ if (start && end) { ++ *rd_start = start; ++ *rd_end = end; ++ return 1; ++ } ++ return 0; ++} + + #define PFN_UP(x) (((x) + PAGE_SIZE - 1) >> PAGE_SHIFT) + #define PFN_DOWN(x) ((x) >> PAGE_SHIFT) +@@ -205,30 +267,45 @@ static inline void parse_cmdline_early(v + static inline void bootmem_init(void) + { + unsigned long start_pfn; ++ unsigned long reserved_end = (unsigned long)&_end; + #ifndef CONFIG_SGI_IP27 +- unsigned long bootmap_size, max_low_pfn, first_usable_pfn; ++ unsigned long first_usable_pfn; ++ unsigned long bootmap_size; + int i; + #endif + #ifdef CONFIG_BLK_DEV_INITRD +- unsigned long tmp; +- unsigned long *initrd_header; ++ int initrd_reserve_bootmem = 0; + +- tmp = (((unsigned long)&_end + PAGE_SIZE-1) & PAGE_MASK) - 8; +- if (tmp < (unsigned long)&_end) +- tmp += PAGE_SIZE; +- initrd_header = (unsigned long *)tmp; +- if (initrd_header[0] == 0x494E5244) { +- initrd_start = (unsigned long)&initrd_header[2]; +- initrd_end = initrd_start + initrd_header[1]; ++ /* Board specific code should have set up initrd_start and initrd_end */ ++ ROOT_DEV = Root_RAM0; ++ if (&__rd_start != &__rd_end) { ++ initrd_start = (unsigned long)&__rd_start; ++ initrd_end = (unsigned long)&__rd_end; ++ } else if (parse_rd_cmdline(&initrd_start, &initrd_end)) { ++ reserved_end = max(reserved_end, initrd_end); ++ initrd_reserve_bootmem = 1; ++ } else { ++ unsigned long tmp; ++ unsigned long *initrd_header; ++ ++ tmp = ((reserved_end + PAGE_SIZE-1) & PAGE_MASK) - 8; ++ if (tmp < reserved_end) ++ tmp += PAGE_SIZE; ++ initrd_header = (unsigned long *)tmp; ++ if (initrd_header[0] == 0x494E5244) { ++ initrd_start = (unsigned long)&initrd_header[2]; ++ initrd_end = initrd_start + initrd_header[1]; ++ reserved_end = max(reserved_end, initrd_end); ++ initrd_reserve_bootmem = 1; ++ } + } +- start_pfn = PFN_UP(CPHYSADDR((&_end)+(initrd_end - initrd_start) + PAGE_SIZE)); +-#else ++#endif /* CONFIG_BLK_DEV_INITRD */ ++ + /* + * Partially used pages are not usable - thus + * we are rounding upwards. + */ +- start_pfn = PFN_UP(CPHYSADDR(&_end)); +-#endif /* CONFIG_BLK_DEV_INITRD */ ++ start_pfn = PFN_UP(CPHYSADDR(reserved_end)); + + #ifndef CONFIG_SGI_IP27 + /* Find the highest page frame number we have available. */ +@@ -341,21 +418,14 @@ static inline void bootmem_init(void) + + /* Reserve the bootmap memory. */ + reserve_bootmem(PFN_PHYS(first_usable_pfn), bootmap_size); +-#endif ++#endif /* CONFIG_SGI_IP27 */ + + #ifdef CONFIG_BLK_DEV_INITRD +- /* Board specific code should have set up initrd_start and initrd_end */ +- ROOT_DEV = Root_RAM0; +- if (&__rd_start != &__rd_end) { +- initrd_start = (unsigned long)&__rd_start; +- initrd_end = (unsigned long)&__rd_end; +- } + initrd_below_start_ok = 1; + if (initrd_start) { + unsigned long initrd_size = ((unsigned char *)initrd_end) - ((unsigned char *)initrd_start); + printk("Initial ramdisk at: 0x%p (%lu bytes)\n", +- (void *)initrd_start, +- initrd_size); ++ (void *)initrd_start, initrd_size); + + if (CPHYSADDR(initrd_end) > PFN_PHYS(max_low_pfn)) { + printk("initrd extends beyond end of memory " +@@ -363,7 +433,11 @@ static inline void bootmem_init(void) + sizeof(long) * 2, CPHYSADDR(initrd_end), + sizeof(long) * 2, PFN_PHYS(max_low_pfn)); + initrd_start = initrd_end = 0; ++ initrd_reserve_bootmem = 0; + } ++ ++ if (initrd_reserve_bootmem) ++ reserve_bootmem(CPHYSADDR(initrd_start), initrd_size); + } + #endif /* CONFIG_BLK_DEV_INITRD */ + } -- cgit v1.2.3