changeset: 34929:eb3af40be96227cce5d5b3b36a5bd62e3e39e48b tag: tip user: yamahata@valinux.co.jp date: Thu Aug 03 22:49:10 2006 +0900 files: arch/ia64/kernel/setup.c description: first try PATCHNAME: first_try Signed-off-by: Isaku Yamahata diff -r e677133a59a9c5313e6985e5ba63ff50aecec42c -r eb3af40be96227cce5d5b3b36a5bd62e3e39e48b arch/ia64/kernel/setup.c --- a/arch/ia64/kernel/setup.c Thu Aug 03 00:43:34 2006 +0200 +++ b/arch/ia64/kernel/setup.c Thu Aug 03 22:49:10 2006 +0900 @@ -75,6 +75,7 @@ EXPORT_SYMBOL(__per_cpu_offset); #endif #ifdef CONFIG_XEN +#ifdef notyet static int xen_panic_event(struct notifier_block *this, unsigned long event, void *ptr) { @@ -86,6 +87,7 @@ static struct notifier_block xen_panic_b static struct notifier_block xen_panic_block = { xen_panic_event, NULL, 0 /* try to go last */ }; +#endif // notyet #endif extern void ia64_setup_printk_clock(void); @@ -194,21 +196,74 @@ filter_rsvd_memory (unsigned long start, return 0; } +static int __init +rsvd_region_cmp(struct rsvd_region *lhs, struct rsvd_region *rhs) +{ + if (lhs->start > rhs->start) + return 1; + if (lhs->start < rhs->start) + return -1; + + if (lhs->end > rhs->end) + return 1; + if (lhs->end < rhs->end) + return -1; + + return 0; +} + static void __init sort_regions (struct rsvd_region *rsvd_region, int max) { + int num = max; int j; /* simple bubble sorting */ while (max--) { for (j = 0; j < max; ++j) { - if (rsvd_region[j].start > rsvd_region[j+1].start) { + if (rsvd_region_cmp(&rsvd_region[j], + &rsvd_region[j + 1]) > 0) { struct rsvd_region tmp; tmp = rsvd_region[j]; rsvd_region[j] = rsvd_region[j + 1]; rsvd_region[j + 1] = tmp; } } + } + for (j = 0; j < num; j++) { + printk("rsvd_region[%d]: [0x%016lx, 0x%06lx)\n", + j, rsvd_region[j].start, rsvd_region[j].end); + } + + for (j = 0; j < num - 1; j++) { + int k; + unsigned long start = rsvd_region[j].start; + unsigned long end = rsvd_region[j].end; + int collapsed; + + for (k = j + 1; k < num; k++) { + BUG_ON(start > rsvd_region[k].start); + if (end < rsvd_region[k].start) { + k--; + break; + } + end = max(end, rsvd_region[k].end); + } + if (k == num) { + k--; + } + rsvd_region[j].end = end; + collapsed = k - j; + for (k = j + 1; k < j + 1 + collapsed; k++) { + rsvd_region[k] = rsvd_region[k + collapsed]; + } + num -= collapsed; + } + + num_rsvd_regions = num; + for (j = 0; j < num; j++) { + printk("rsvd_region[%d]: [0x%016lx, 0x%06lx)\n", + j, rsvd_region[j].start, rsvd_region[j].end); } } @@ -441,8 +496,10 @@ setup_arch (char **cmdline_p) #ifdef CONFIG_XEN if (is_running_on_xen()) { setup_xen_features(); +#ifdef notyet /* Register a call for panic conditions. */ notifier_chain_register(&panic_notifier_list, &xen_panic_block); +#endif // notyet } #endif