/* * partially used pages are not usable - thus * we are rounding upwards: */ start_pfn = (__pa(&_end) + PAGE_SIZE - 1) >> PAGE_SHIFT; end_pfn = max_pfn = memory_end >> PAGE_SHIFT;  /* * Initialize the boot-time allocator (with low memory only): */ bootmap_size = init_bootmem(start_pfn, end_pfn);  /* * Register RAM areas with the bootmem allocator. */ for (i = 0; i < 16 && memory_chunk[i].size > 0; i++) { unsigned long start_chunk, end_chunk;  if (memory_chunk[i].type != CHUNK_READ_WRITE) continue; start_chunk = (memory_chunk[i].addr + PAGE_SIZE - 1); start_chunk >>= PAGE_SHIFT; end_chunk = (memory_chunk[i].addr + memory_chunk[i].size); end_chunk >>= PAGE_SHIFT; if (start_chunk < start_pfn) start_chunk = start_pfn; if (end_chunk > end_pfn) end_chunk = end_pfn; if (start_chunk < end_chunk) free_bootmem(start_chunk << PAGE_SHIFT, (end_chunk - start_chunk) << PAGE_SHIFT); }  /* * Reserve the bootmem bitmap itself as well. We do this in two * steps (first step was init_bootmem()) because this catches * the (very unlikely) case of us accidentally initializing the * bootmem allocator with an invalid RAM area. */ reserve_bootmem(start_pfn << PAGE_SHIFT, bootmap_size);  #ifdef CONFIG_BLK_DEV_INITRD if (INITRD_START) { if (INITRD_START + INITRD_SIZE <= memory_end) { reserve_bootmem(INITRD_START, INITRD_SIZE); initrd_start = INITRD_START; initrd_end = initrd_start + INITRD_SIZE; } else { printk("initrd extends beyond end of memory " "(0x%08lx > 0x%08lx)\ndisabling initrd\n", initrd_start + INITRD_SIZE, memory_end); initrd_start = initrd_end = 0; } } #endif  for (i = 0; i < 16 && memory_chunk[i].size > 0; i++) { struct resource *res;  res = alloc_bootmem_low(sizeof(struct resource)); res->flags = IORESOURCE_BUSY | IORESOURCE_MEM;  switch (memory_chunk[i].type) { case CHUNK_READ_WRITE: res->name = "System RAM"; break; case CHUNK_READ_ONLY: res->name = "System ROM"; res->flags |= IORESOURCE_READONLY; break; default: res->name = "reserved"; } res->start = memory_chunk[i].addr; res->end = memory_chunk[i].addr +  memory_chunk[i].size - 1; request_resource(&iomem_resource, res); request_resource(res, &code_resource); request_resource(res, &data_resource); }  /* * Setup lowcore for boot cpu */ #ifndef CONFIG_ARCH_S390X lc = (struct _lowcore *) __alloc_bootmem(PAGE_SIZE, PAGE_SIZE, 0); memset(lc, 0, PAGE_SIZE); #else /* CONFIG_ARCH_S390X */ lc = (struct _lowcore *) __alloc_bootmem(2*PAGE_SIZE, 2*PAGE_SIZE, 0); memset(lc, 0, 2*PAGE_SIZE); #endif /* CONFIG_ARCH_S390X */ lc->restart_psw.mask = PSW_BASE_BITS; lc->restart_psw.addr = PSW_ADDR_AMODE | (unsigned long) restart_int_handler; lc->external_new_psw.mask = PSW_KERNEL_BITS; lc->external_new_psw.addr = PSW_ADDR_AMODE | (unsigned long) ext_int_handler; lc->svc_new_psw.mask = PSW_KERNEL_BITS | PSW_MASK_IO | PSW_MASK_EXT; lc->svc_new_psw.addr = PSW_ADDR_AMODE | (unsigned long) system_call; lc->program_new_psw.mask = PSW_KERNEL_BITS; lc->program_new_psw.addr = PSW_ADDR_AMODE | (unsigned long)pgm_check_handler; lc->mcck_new_psw.mask = PSW_KERNEL_BITS; lc->mcck_new_psw.addr = PSW_ADDR_AMODE | (unsigned long) mcck_int_handler; lc->io_new_psw.mask = PSW_KERNEL_BITS; lc->io_new_psw.addr = PSW_ADDR_AMODE | (unsigned long) io_int_handler; lc->ipl_device = S390_lowcore.ipl_device; lc->jiffy_timer = -1LL; lc->kernel_stack = ((unsigned long) &init_thread_union) + THREAD_SIZE; lc->async_stack = (unsigned long) __alloc_bootmem(ASYNC_SIZE, ASYNC_SIZE, 0) + ASYNC_SIZE; #ifdef CONFIG_CHECK_STACK lc->panic_stack = (unsigned long) __alloc_bootmem(PAGE_SIZE, PAGE_SIZE, 0) + PAGE_SIZE; #endif lc->current_task = (unsigned long) init_thread_union.thread_info.task; lc->thread_info = (unsigned long) &init_thread_union; #ifdef CONFIG_ARCH_S390X if (MACHINE_HAS_DIAG44) lc->diag44_opcode = 0x83000044; else lc->diag44_opcode = 0x07000700; #endif /* CONFIG_ARCH_S390X */ set_prefix((u32)(unsigned long) lc); 
void __init setup_arch(char **cmdline_p){        unsigned long bootmap_size;        unsigned long memory_start, memory_end;        char c = ' ', cn, *to = command_line, *from = COMMAND_LINE;	unsigned long start_pfn, end_pfn;        static unsigned int smptrap=0;        unsigned long delay = 0;	struct _lowcore *lc;	int i;        if (smptrap)                return;        smptrap=1;        /*         * print what head.S has found out about the machine          */#ifndef CONFIG_ARCH_S390X	printk((MACHINE_IS_VM) ?	       "We are running under VM (31 bit mode)\n" :	       "We are running native (31 bit mode)\n");	printk((MACHINE_HAS_IEEE) ?	       "This machine has an IEEE fpu\n" :	       "This machine has no IEEE fpu\n");#else /* CONFIG_ARCH_S390X */	printk((MACHINE_IS_VM) ?	       "We are running under VM (64 bit mode)\n" :	       "We are running native (64 bit mode)\n");#endif /* CONFIG_ARCH_S390X */        ROOT_DEV = Root_RAM0;        memory_start = (unsigned long) &_end;    /* fixit if use $CODELO etc*/#ifndef CONFIG_ARCH_S390X	memory_end = memory_size & ~0x400000UL;  /* align memory end to 4MB */        /*         * We need some free virtual space to be able to do vmalloc.         * On a machine with 2GB memory we make sure that we have at         * least 128 MB free space for vmalloc.         */        if (memory_end > 1920*1024*1024)                memory_end = 1920*1024*1024;#else /* CONFIG_ARCH_S390X */	memory_end = memory_size & ~0x200000UL;  /* detected in head.s */#endif /* CONFIG_ARCH_S390X */        init_mm.start_code = PAGE_OFFSET;        init_mm.end_code = (unsigned long) &_etext;        init_mm.end_data = (unsigned long) &_edata;        init_mm.brk = (unsigned long) &_end;	code_resource.start = (unsigned long) &_text;	code_resource.end = (unsigned long) &_etext - 1;	data_resource.start = (unsigned long) &_etext;	data_resource.end = (unsigned long) &_edata - 1;        /* Save unparsed command line copy for /proc/cmdline */        memcpy(saved_command_line, COMMAND_LINE, COMMAND_LINE_SIZE);        saved_command_line[COMMAND_LINE_SIZE-1] = '\0';        for (;;) {                /*                 * "mem=XXX[kKmM]" sets memsize                  */                if (c == ' ' && strncmp(from, "mem=", 4) == 0) {                        memory_end = simple_strtoul(from+4, &from, 0);                        if ( *from == 'K' || *from == 'k' ) {                                memory_end = memory_end << 10;                                from++;                        } else if ( *from == 'M' || *from == 'm' ) {                                memory_end = memory_end << 20;                                from++;                        }                }                /*                 * "ipldelay=XXX[sm]" sets ipl delay in seconds or minutes                 */                if (c == ' ' && strncmp(from, "ipldelay=", 9) == 0) {                        delay = simple_strtoul(from+9, &from, 0);			if (*from == 's' || *from == 'S') {				delay = delay*1000000;				from++;			} else if (*from == 'm' || *from == 'M') {				delay = delay*60*1000000;				from++;			}			/* now wait for the requested amount of time */			udelay(delay);                }                cn = *(from++);                if (!cn)                        break;                if (cn == '\n')                        cn = ' ';  /* replace newlines with space */		if (cn == 0x0d)			cn = ' ';  /* replace 0x0d with space */                if (cn == ' ' && c == ' ')                        continue;  /* remove additional spaces */                c = cn;                if (to - command_line >= COMMAND_LINE_SIZE)                        break;                *(to++) = c;        }        if (c == ' ' && to > command_line) to--;        *to = '\0';        *cmdline_p = command_line;	/*	 * partially used pages are not usable - thus	 * we are rounding upwards:	 */	start_pfn = (__pa(&_end) + PAGE_SIZE - 1) >> PAGE_SHIFT;	end_pfn = max_pfn = memory_end >> PAGE_SHIFT;	/*	 * Initialize the boot-time allocator (with low memory only):	 */	bootmap_size = init_bootmem(start_pfn, end_pfn);	/*	 * Register RAM areas with the bootmem allocator.	 */	for (i = 0; i < 16 && memory_chunk[i].size > 0; i++) {		unsigned long start_chunk, end_chunk;		if (memory_chunk[i].type != CHUNK_READ_WRITE)			continue;		start_chunk = (memory_chunk[i].addr + PAGE_SIZE - 1);		start_chunk >>= PAGE_SHIFT;		end_chunk = (memory_chunk[i].addr + memory_chunk[i].size);		end_chunk >>= PAGE_SHIFT;		if (start_chunk < start_pfn)			start_chunk = start_pfn;		if (end_chunk > end_pfn)			end_chunk = end_pfn;		if (start_chunk < end_chunk)			free_bootmem(start_chunk << PAGE_SHIFT,				     (end_chunk - start_chunk) << PAGE_SHIFT);	}        /*         * Reserve the bootmem bitmap itself as well. We do this in two         * steps (first step was init_bootmem()) because this catches         * the (very unlikely) case of us accidentally initializing the         * bootmem allocator with an invalid RAM area.         */        reserve_bootmem(start_pfn << PAGE_SHIFT, bootmap_size);#ifdef CONFIG_BLK_DEV_INITRD        if (INITRD_START) {		if (INITRD_START + INITRD_SIZE <= memory_end) {			reserve_bootmem(INITRD_START, INITRD_SIZE);			initrd_start = INITRD_START;			initrd_end = initrd_start + INITRD_SIZE;		} else {                        printk("initrd extends beyond end of memory "                               "(0x%08lx > 0x%08lx)\ndisabling initrd\n",                               initrd_start + INITRD_SIZE, memory_end);                        initrd_start = initrd_end = 0;		}        }#endif	for (i = 0; i < 16 && memory_chunk[i].size > 0; i++) {		struct resource *res;		res = alloc_bootmem_low(sizeof(struct resource));		res->flags = IORESOURCE_BUSY | IORESOURCE_MEM;		switch (memory_chunk[i].type) {		case CHUNK_READ_WRITE:			res->name = "System RAM";			break;		case CHUNK_READ_ONLY:			res->name = "System ROM";			res->flags |= IORESOURCE_READONLY;			break;		default:			res->name = "reserved";		}		res->start = memory_chunk[i].addr;		res->end = memory_chunk[i].addr +  memory_chunk[i].size - 1;		request_resource(&iomem_resource, res);		request_resource(res, &code_resource);		request_resource(res, &data_resource);	}        /*         * Setup lowcore for boot cpu         */#ifndef CONFIG_ARCH_S390X	lc = (struct _lowcore *) __alloc_bootmem(PAGE_SIZE, PAGE_SIZE, 0);	memset(lc, 0, PAGE_SIZE);#else /* CONFIG_ARCH_S390X */	lc = (struct _lowcore *) __alloc_bootmem(2*PAGE_SIZE, 2*PAGE_SIZE, 0);	memset(lc, 0, 2*PAGE_SIZE);#endif /* CONFIG_ARCH_S390X */	lc->restart_psw.mask = PSW_BASE_BITS;	lc->restart_psw.addr =		PSW_ADDR_AMODE | (unsigned long) restart_int_handler;	lc->external_new_psw.mask = PSW_KERNEL_BITS;	lc->external_new_psw.addr =		PSW_ADDR_AMODE | (unsigned long) ext_int_handler;	lc->svc_new_psw.mask = PSW_KERNEL_BITS | PSW_MASK_IO | PSW_MASK_EXT;	lc->svc_new_psw.addr = PSW_ADDR_AMODE | (unsigned long) system_call;	lc->program_new_psw.mask = PSW_KERNEL_BITS;	lc->program_new_psw.addr =		PSW_ADDR_AMODE | (unsigned long)pgm_check_handler;	lc->mcck_new_psw.mask = PSW_KERNEL_BITS;	lc->mcck_new_psw.addr =		PSW_ADDR_AMODE | (unsigned long) mcck_int_handler;	lc->io_new_psw.mask = PSW_KERNEL_BITS;	lc->io_new_psw.addr = PSW_ADDR_AMODE | (unsigned long) io_int_handler;	lc->ipl_device = S390_lowcore.ipl_device;	lc->jiffy_timer = -1LL;	lc->kernel_stack = ((unsigned long) &init_thread_union) + THREAD_SIZE;	lc->async_stack = (unsigned long)		__alloc_bootmem(ASYNC_SIZE, ASYNC_SIZE, 0) + ASYNC_SIZE;#ifdef CONFIG_CHECK_STACK	lc->panic_stack = (unsigned long)		__alloc_bootmem(PAGE_SIZE, PAGE_SIZE, 0) + PAGE_SIZE;#endif	lc->current_task = (unsigned long) init_thread_union.thread_info.task;	lc->thread_info = (unsigned long) &init_thread_union;#ifdef CONFIG_ARCH_S390X	if (MACHINE_HAS_DIAG44)		lc->diag44_opcode = 0x83000044;	else		lc->diag44_opcode = 0x07000700;#endif /* CONFIG_ARCH_S390X */	set_prefix((u32)(unsigned long) lc);        cpu_init();        __cpu_logical_map[0] = S390_lowcore.cpu_data.cpu_addr;	/*	 * Create kernel page tables and switch to virtual addressing.	 */        paging_init();        /* Setup default console */	conmode_default();}
4520	/local/tlutelli/issta_data/temp/c/2005_temp/2005/4520/c9e3735359ac2d74ee61c6f1e5724f4a6db570bf/setup.c/buggy/arch/s390/kernel/setup.c