1/* 2 * arch/s390/kernel/setup.c 3 * 4 * S390 version 5 * Copyright (C) IBM Corp. 1999,2010 6 * Author(s): Hartmut Penner (hp@de.ibm.com), 7 * Martin Schwidefsky (schwidefsky@de.ibm.com) 8 * 9 * Derived from "arch/i386/kernel/setup.c" 10 * Copyright (C) 1995, Linus Torvalds 11 */ 12 13/* 14 * This file handles the architecture-dependent parts of initialization 15 */ 16 17#define KMSG_COMPONENT "setup" 18#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt 19 20#include <linux/errno.h> 21#include <linux/module.h> 22#include <linux/sched.h> 23#include <linux/kernel.h> 24#include <linux/mm.h> 25#include <linux/stddef.h> 26#include <linux/unistd.h> 27#include <linux/ptrace.h> 28#include <linux/user.h> 29#include <linux/tty.h> 30#include <linux/ioport.h> 31#include <linux/delay.h> 32#include <linux/init.h> 33#include <linux/initrd.h> 34#include <linux/bootmem.h> 35#include <linux/root_dev.h> 36#include <linux/console.h> 37#include <linux/kernel_stat.h> 38#include <linux/device.h> 39#include <linux/notifier.h> 40#include <linux/pfn.h> 41#include <linux/ctype.h> 42#include <linux/reboot.h> 43#include <linux/topology.h> 44#include <linux/ftrace.h> 45 46#include <asm/ipl.h> 47#include <asm/uaccess.h> 48#include <asm/system.h> 49#include <asm/smp.h> 50#include <asm/mmu_context.h> 51#include <asm/cpcmd.h> 52#include <asm/lowcore.h> 53#include <asm/irq.h> 54#include <asm/page.h> 55#include <asm/ptrace.h> 56#include <asm/sections.h> 57#include <asm/ebcdic.h> 58#include <asm/compat.h> 59#include <asm/kvm_virtio.h> 60 61long psw_kernel_bits = (PSW_BASE_BITS | PSW_MASK_DAT | PSW_ASC_PRIMARY | 62 PSW_MASK_MCHECK | PSW_DEFAULT_KEY); 63long psw_user_bits = (PSW_BASE_BITS | PSW_MASK_DAT | PSW_ASC_HOME | 64 PSW_MASK_IO | PSW_MASK_EXT | PSW_MASK_MCHECK | 65 PSW_MASK_PSTATE | PSW_DEFAULT_KEY); 66 67/* 68 * User copy operations. 69 */ 70struct uaccess_ops uaccess; 71EXPORT_SYMBOL(uaccess); 72 73/* 74 * Machine setup.. 75 */ 76unsigned int console_mode = 0; 77EXPORT_SYMBOL(console_mode); 78 79unsigned int console_devno = -1; 80EXPORT_SYMBOL(console_devno); 81 82unsigned int console_irq = -1; 83EXPORT_SYMBOL(console_irq); 84 85unsigned long elf_hwcap = 0; 86char elf_platform[ELF_PLATFORM_SIZE]; 87 88struct mem_chunk __initdata memory_chunk[MEMORY_CHUNKS]; 89 90int __initdata memory_end_set; 91unsigned long __initdata memory_end; 92 93/* An array with a pointer to the lowcore of every CPU. */ 94struct _lowcore *lowcore_ptr[NR_CPUS]; 95EXPORT_SYMBOL(lowcore_ptr); 96 97/* 98 * This is set up by the setup-routine at boot-time 99 * for S390 need to find out, what we have to setup 100 * using address 0x10400 ... 101 */ 102 103#include <asm/setup.h> 104 105static struct resource code_resource = { 106 .name = "Kernel code", 107 .flags = IORESOURCE_BUSY | IORESOURCE_MEM, 108}; 109 110static struct resource data_resource = { 111 .name = "Kernel data", 112 .flags = IORESOURCE_BUSY | IORESOURCE_MEM, 113}; 114 115/* 116 * condev= and conmode= setup parameter. 117 */ 118 119static int __init condev_setup(char *str) 120{ 121 int vdev; 122 123 vdev = simple_strtoul(str, &str, 0); 124 if (vdev >= 0 && vdev < 65536) { 125 console_devno = vdev; 126 console_irq = -1; 127 } 128 return 1; 129} 130 131__setup("condev=", condev_setup); 132 133static void __init set_preferred_console(void) 134{ 135 if (MACHINE_IS_KVM) 136 add_preferred_console("hvc", 0, NULL); 137 else if (CONSOLE_IS_3215 || CONSOLE_IS_SCLP) 138 add_preferred_console("ttyS", 0, NULL); 139 else if (CONSOLE_IS_3270) 140 add_preferred_console("tty3270", 0, NULL); 141} 142 143static int __init conmode_setup(char *str) 144{ 145#if defined(CONFIG_SCLP_CONSOLE) || defined(CONFIG_SCLP_VT220_CONSOLE) 146 if (strncmp(str, "hwc", 4) == 0 || strncmp(str, "sclp", 5) == 0) 147 SET_CONSOLE_SCLP; 148#endif 149#if defined(CONFIG_TN3215_CONSOLE) 150 if (strncmp(str, "3215", 5) == 0) 151 SET_CONSOLE_3215; 152#endif 153#if defined(CONFIG_TN3270_CONSOLE) 154 if (strncmp(str, "3270", 5) == 0) 155 SET_CONSOLE_3270; 156#endif 157 set_preferred_console(); 158 return 1; 159} 160 161__setup("conmode=", conmode_setup); 162 163static void __init conmode_default(void) 164{ 165 char query_buffer[1024]; 166 char *ptr; 167 168 if (MACHINE_IS_VM) { 169 cpcmd("QUERY CONSOLE", query_buffer, 1024, NULL); 170 console_devno = simple_strtoul(query_buffer + 5, NULL, 16); 171 ptr = strstr(query_buffer, "SUBCHANNEL ="); 172 console_irq = simple_strtoul(ptr + 13, NULL, 16); 173 cpcmd("QUERY TERM", query_buffer, 1024, NULL); 174 ptr = strstr(query_buffer, "CONMODE"); 175 /* 176 * Set the conmode to 3215 so that the device recognition 177 * will set the cu_type of the console to 3215. If the 178 * conmode is 3270 and we don't set it back then both 179 * 3215 and the 3270 driver will try to access the console 180 * device (3215 as console and 3270 as normal tty). 181 */ 182 cpcmd("TERM CONMODE 3215", NULL, 0, NULL); 183 if (ptr == NULL) { 184#if defined(CONFIG_SCLP_CONSOLE) || defined(CONFIG_SCLP_VT220_CONSOLE) 185 SET_CONSOLE_SCLP; 186#endif 187 return; 188 } 189 if (strncmp(ptr + 8, "3270", 4) == 0) { 190#if defined(CONFIG_TN3270_CONSOLE) 191 SET_CONSOLE_3270; 192#elif defined(CONFIG_TN3215_CONSOLE) 193 SET_CONSOLE_3215; 194#elif defined(CONFIG_SCLP_CONSOLE) || defined(CONFIG_SCLP_VT220_CONSOLE) 195 SET_CONSOLE_SCLP; 196#endif 197 } else if (strncmp(ptr + 8, "3215", 4) == 0) { 198#if defined(CONFIG_TN3215_CONSOLE) 199 SET_CONSOLE_3215; 200#elif defined(CONFIG_TN3270_CONSOLE) 201 SET_CONSOLE_3270; 202#elif defined(CONFIG_SCLP_CONSOLE) || defined(CONFIG_SCLP_VT220_CONSOLE) 203 SET_CONSOLE_SCLP; 204#endif 205 } 206 } else { 207#if defined(CONFIG_SCLP_CONSOLE) || defined(CONFIG_SCLP_VT220_CONSOLE) 208 SET_CONSOLE_SCLP; 209#endif 210 } 211} 212 213#ifdef CONFIG_ZFCPDUMP 214static void __init setup_zfcpdump(unsigned int console_devno) 215{ 216 static char str[41]; 217 218 if (ipl_info.type != IPL_TYPE_FCP_DUMP) 219 return; 220 if (console_devno != -1) 221 sprintf(str, " cio_ignore=all,!0.0.%04x,!0.0.%04x", 222 ipl_info.data.fcp.dev_id.devno, console_devno); 223 else 224 sprintf(str, " cio_ignore=all,!0.0.%04x", 225 ipl_info.data.fcp.dev_id.devno); 226 strcat(boot_command_line, str); 227 console_loglevel = 2; 228} 229#else 230static inline void setup_zfcpdump(unsigned int console_devno) {} 231#endif /* CONFIG_ZFCPDUMP */ 232 233 /* 234 * Reboot, halt and power_off stubs. They just call _machine_restart, 235 * _machine_halt or _machine_power_off. 236 */ 237 238void machine_restart(char *command) 239{ 240 if ((!in_interrupt() && !in_atomic()) || oops_in_progress) 241 /* 242 * Only unblank the console if we are called in enabled 243 * context or a bust_spinlocks cleared the way for us. 244 */ 245 console_unblank(); 246 _machine_restart(command); 247} 248 249void machine_halt(void) 250{ 251 if (!in_interrupt() || oops_in_progress) 252 /* 253 * Only unblank the console if we are called in enabled 254 * context or a bust_spinlocks cleared the way for us. 255 */ 256 console_unblank(); 257 _machine_halt(); 258} 259 260void machine_power_off(void) 261{ 262 if (!in_interrupt() || oops_in_progress) 263 /* 264 * Only unblank the console if we are called in enabled 265 * context or a bust_spinlocks cleared the way for us. 266 */ 267 console_unblank(); 268 _machine_power_off(); 269} 270 271/* 272 * Dummy power off function. 273 */ 274void (*pm_power_off)(void) = machine_power_off; 275 276static int __init early_parse_mem(char *p) 277{ 278 memory_end = memparse(p, &p); 279 memory_end_set = 1; 280 return 0; 281} 282early_param("mem", early_parse_mem); 283 284unsigned int user_mode = HOME_SPACE_MODE; 285EXPORT_SYMBOL_GPL(user_mode); 286 287static int set_amode_and_uaccess(unsigned long user_amode, 288 unsigned long user32_amode) 289{ 290 psw_user_bits = PSW_BASE_BITS | PSW_MASK_DAT | user_amode | 291 PSW_MASK_IO | PSW_MASK_EXT | PSW_MASK_MCHECK | 292 PSW_MASK_PSTATE | PSW_DEFAULT_KEY; 293#ifdef CONFIG_COMPAT 294 psw_user32_bits = PSW_BASE32_BITS | PSW_MASK_DAT | user_amode | 295 PSW_MASK_IO | PSW_MASK_EXT | PSW_MASK_MCHECK | 296 PSW_MASK_PSTATE | PSW_DEFAULT_KEY; 297 psw32_user_bits = PSW32_BASE_BITS | PSW32_MASK_DAT | user32_amode | 298 PSW32_MASK_IO | PSW32_MASK_EXT | PSW32_MASK_MCHECK | 299 PSW32_MASK_PSTATE; 300#endif 301 psw_kernel_bits = PSW_BASE_BITS | PSW_MASK_DAT | PSW_ASC_HOME | 302 PSW_MASK_MCHECK | PSW_DEFAULT_KEY; 303 304 if (MACHINE_HAS_MVCOS) { 305 memcpy(&uaccess, &uaccess_mvcos_switch, sizeof(uaccess)); 306 return 1; 307 } else { 308 memcpy(&uaccess, &uaccess_pt, sizeof(uaccess)); 309 return 0; 310 } 311} 312 313/* 314 * Switch kernel/user addressing modes? 315 */ 316static int __init early_parse_switch_amode(char *p) 317{ 318 if (user_mode != SECONDARY_SPACE_MODE) 319 user_mode = PRIMARY_SPACE_MODE; 320 return 0; 321} 322early_param("switch_amode", early_parse_switch_amode); 323 324static int __init early_parse_user_mode(char *p) 325{ 326 if (p && strcmp(p, "primary") == 0) 327 user_mode = PRIMARY_SPACE_MODE; 328#ifdef CONFIG_S390_EXEC_PROTECT 329 else if (p && strcmp(p, "secondary") == 0) 330 user_mode = SECONDARY_SPACE_MODE; 331#endif 332 else if (!p || strcmp(p, "home") == 0) 333 user_mode = HOME_SPACE_MODE; 334 else 335 return 1; 336 return 0; 337} 338early_param("user_mode", early_parse_user_mode); 339 340#ifdef CONFIG_S390_EXEC_PROTECT 341/* 342 * Enable execute protection? 343 */ 344static int __init early_parse_noexec(char *p) 345{ 346 if (!strncmp(p, "off", 3)) 347 return 0; 348 user_mode = SECONDARY_SPACE_MODE; 349 return 0; 350} 351early_param("noexec", early_parse_noexec); 352#endif /* CONFIG_S390_EXEC_PROTECT */ 353 354static void setup_addressing_mode(void) 355{ 356 if (user_mode == SECONDARY_SPACE_MODE) { 357 if (set_amode_and_uaccess(PSW_ASC_SECONDARY, 358 PSW32_ASC_SECONDARY)) 359 pr_info("Execute protection active, " 360 "mvcos available\n"); 361 else 362 pr_info("Execute protection active, " 363 "mvcos not available\n"); 364 } else if (user_mode == PRIMARY_SPACE_MODE) { 365 if (set_amode_and_uaccess(PSW_ASC_PRIMARY, PSW32_ASC_PRIMARY)) 366 pr_info("Address spaces switched, " 367 "mvcos available\n"); 368 else 369 pr_info("Address spaces switched, " 370 "mvcos not available\n"); 371 } 372} 373 374static void __init 375setup_lowcore(void) 376{ 377 struct _lowcore *lc; 378 379 /* 380 * Setup lowcore for boot cpu 381 */ 382 BUILD_BUG_ON(sizeof(struct _lowcore) != LC_PAGES * 4096); 383 lc = __alloc_bootmem_low(LC_PAGES * PAGE_SIZE, LC_PAGES * PAGE_SIZE, 0); 384 lc->restart_psw.mask = PSW_BASE_BITS | PSW_DEFAULT_KEY; 385 lc->restart_psw.addr = 386 PSW_ADDR_AMODE | (unsigned long) restart_int_handler; 387 if (user_mode != HOME_SPACE_MODE) 388 lc->restart_psw.mask |= PSW_ASC_HOME; 389 lc->external_new_psw.mask = psw_kernel_bits; 390 lc->external_new_psw.addr = 391 PSW_ADDR_AMODE | (unsigned long) ext_int_handler; 392 lc->svc_new_psw.mask = psw_kernel_bits | PSW_MASK_IO | PSW_MASK_EXT; 393 lc->svc_new_psw.addr = PSW_ADDR_AMODE | (unsigned long) system_call; 394 lc->program_new_psw.mask = psw_kernel_bits; 395 lc->program_new_psw.addr = 396 PSW_ADDR_AMODE | (unsigned long)pgm_check_handler; 397 lc->mcck_new_psw.mask = 398 psw_kernel_bits & ~PSW_MASK_MCHECK & ~PSW_MASK_DAT; 399 lc->mcck_new_psw.addr = 400 PSW_ADDR_AMODE | (unsigned long) mcck_int_handler; 401 lc->io_new_psw.mask = psw_kernel_bits; 402 lc->io_new_psw.addr = PSW_ADDR_AMODE | (unsigned long) io_int_handler; 403 lc->clock_comparator = -1ULL; 404 lc->kernel_stack = ((unsigned long) &init_thread_union) + THREAD_SIZE; 405 lc->async_stack = (unsigned long) 406 __alloc_bootmem(ASYNC_SIZE, ASYNC_SIZE, 0) + ASYNC_SIZE; 407 lc->panic_stack = (unsigned long) 408 __alloc_bootmem(PAGE_SIZE, PAGE_SIZE, 0) + PAGE_SIZE; 409 lc->current_task = (unsigned long) init_thread_union.thread_info.task; 410 lc->thread_info = (unsigned long) &init_thread_union; 411 lc->machine_flags = S390_lowcore.machine_flags; 412#ifndef CONFIG_64BIT 413 if (MACHINE_HAS_IEEE) { 414 lc->extended_save_area_addr = (__u32) 415 __alloc_bootmem_low(PAGE_SIZE, PAGE_SIZE, 0); 416 /* enable extended save area */ 417 __ctl_set_bit(14, 29); 418 } 419#else 420 lc->cmf_hpp = -1ULL; 421 lc->vdso_per_cpu_data = (unsigned long) &lc->paste[0]; 422#endif 423 lc->sync_enter_timer = S390_lowcore.sync_enter_timer; 424 lc->async_enter_timer = S390_lowcore.async_enter_timer; 425 lc->exit_timer = S390_lowcore.exit_timer; 426 lc->user_timer = S390_lowcore.user_timer; 427 lc->system_timer = S390_lowcore.system_timer; 428 lc->steal_timer = S390_lowcore.steal_timer; 429 lc->last_update_timer = S390_lowcore.last_update_timer; 430 lc->last_update_clock = S390_lowcore.last_update_clock; 431 lc->ftrace_func = S390_lowcore.ftrace_func; 432 set_prefix((u32)(unsigned long) lc); 433 lowcore_ptr[0] = lc; 434} 435 436static void __init 437setup_resources(void) 438{ 439 struct resource *res, *sub_res; 440 int i; 441 442 code_resource.start = (unsigned long) &_text; 443 code_resource.end = (unsigned long) &_etext - 1; 444 data_resource.start = (unsigned long) &_etext; 445 data_resource.end = (unsigned long) &_edata - 1; 446 447 for (i = 0; i < MEMORY_CHUNKS; i++) { 448 if (!memory_chunk[i].size) 449 continue; 450 res = alloc_bootmem_low(sizeof(struct resource)); 451 res->flags = IORESOURCE_BUSY | IORESOURCE_MEM; 452 switch (memory_chunk[i].type) { 453 case CHUNK_READ_WRITE: 454 res->name = "System RAM"; 455 break; 456 case CHUNK_READ_ONLY: 457 res->name = "System ROM"; 458 res->flags |= IORESOURCE_READONLY; 459 break; 460 default: 461 res->name = "reserved"; 462 } 463 res->start = memory_chunk[i].addr; 464 res->end = memory_chunk[i].addr + memory_chunk[i].size - 1; 465 request_resource(&iomem_resource, res); 466 467 if (code_resource.start >= res->start && 468 code_resource.start <= res->end && 469 code_resource.end > res->end) { 470 sub_res = alloc_bootmem_low(sizeof(struct resource)); 471 memcpy(sub_res, &code_resource, 472 sizeof(struct resource)); 473 sub_res->end = res->end; 474 code_resource.start = res->end + 1; 475 request_resource(res, sub_res); 476 } 477 478 if (code_resource.start >= res->start && 479 code_resource.start <= res->end && 480 code_resource.end <= res->end) 481 request_resource(res, &code_resource); 482 483 if (data_resource.start >= res->start && 484 data_resource.start <= res->end && 485 data_resource.end > res->end) { 486 sub_res = alloc_bootmem_low(sizeof(struct resource)); 487 memcpy(sub_res, &data_resource, 488 sizeof(struct resource)); 489 sub_res->end = res->end; 490 data_resource.start = res->end + 1; 491 request_resource(res, sub_res); 492 } 493 494 if (data_resource.start >= res->start && 495 data_resource.start <= res->end && 496 data_resource.end <= res->end) 497 request_resource(res, &data_resource); 498 } 499} 500 501unsigned long real_memory_size; 502EXPORT_SYMBOL_GPL(real_memory_size); 503 504static void __init setup_memory_end(void) 505{ 506 unsigned long memory_size; 507 unsigned long max_mem; 508 int i; 509 510#ifdef CONFIG_ZFCPDUMP 511 if (ipl_info.type == IPL_TYPE_FCP_DUMP) { 512 memory_end = ZFCPDUMP_HSA_SIZE; 513 memory_end_set = 1; 514 } 515#endif 516 memory_size = 0; 517 memory_end &= PAGE_MASK; 518 519 max_mem = memory_end ? min(VMEM_MAX_PHYS, memory_end) : VMEM_MAX_PHYS; 520 memory_end = min(max_mem, memory_end); 521 522 /* 523 * Make sure all chunks are MAX_ORDER aligned so we don't need the 524 * extra checks that HOLES_IN_ZONE would require. 525 */ 526 for (i = 0; i < MEMORY_CHUNKS; i++) { 527 unsigned long start, end; 528 struct mem_chunk *chunk; 529 unsigned long align; 530 531 chunk = &memory_chunk[i]; 532 align = 1UL << (MAX_ORDER + PAGE_SHIFT - 1); 533 start = (chunk->addr + align - 1) & ~(align - 1); 534 end = (chunk->addr + chunk->size) & ~(align - 1); 535 if (start >= end) 536 memset(chunk, 0, sizeof(*chunk)); 537 else { 538 chunk->addr = start; 539 chunk->size = end - start; 540 } 541 } 542 543 for (i = 0; i < MEMORY_CHUNKS; i++) { 544 struct mem_chunk *chunk = &memory_chunk[i]; 545 546 real_memory_size = max(real_memory_size, 547 chunk->addr + chunk->size); 548 if (chunk->addr >= max_mem) { 549 memset(chunk, 0, sizeof(*chunk)); 550 continue; 551 } 552 if (chunk->addr + chunk->size > max_mem) 553 chunk->size = max_mem - chunk->addr; 554 memory_size = max(memory_size, chunk->addr + chunk->size); 555 } 556 if (!memory_end) 557 memory_end = memory_size; 558} 559 560static void __init 561setup_memory(void) 562{ 563 unsigned long bootmap_size; 564 unsigned long start_pfn, end_pfn; 565 int i; 566 567 /* 568 * partially used pages are not usable - thus 569 * we are rounding upwards: 570 */ 571 start_pfn = PFN_UP(__pa(&_end)); 572 end_pfn = max_pfn = PFN_DOWN(memory_end); 573 574#ifdef CONFIG_BLK_DEV_INITRD 575 /* 576 * Move the initrd in case the bitmap of the bootmem allocater 577 * would overwrite it. 578 */ 579 580 if (INITRD_START && INITRD_SIZE) { 581 unsigned long bmap_size; 582 unsigned long start; 583 584 bmap_size = bootmem_bootmap_pages(end_pfn - start_pfn + 1); 585 bmap_size = PFN_PHYS(bmap_size); 586 587 if (PFN_PHYS(start_pfn) + bmap_size > INITRD_START) { 588 start = PFN_PHYS(start_pfn) + bmap_size + PAGE_SIZE; 589 590 if (start + INITRD_SIZE > memory_end) { 591 pr_err("initrd extends beyond end of " 592 "memory (0x%08lx > 0x%08lx) " 593 "disabling initrd\n", 594 start + INITRD_SIZE, memory_end); 595 INITRD_START = INITRD_SIZE = 0; 596 } else { 597 pr_info("Moving initrd (0x%08lx -> " 598 "0x%08lx, size: %ld)\n", 599 INITRD_START, start, INITRD_SIZE); 600 memmove((void *) start, (void *) INITRD_START, 601 INITRD_SIZE); 602 INITRD_START = start; 603 } 604 } 605 } 606#endif 607 608 /* 609 * Initialize the boot-time allocator 610 */ 611 bootmap_size = init_bootmem(start_pfn, end_pfn); 612 613 /* 614 * Register RAM areas with the bootmem allocator. 615 */ 616 617 for (i = 0; i < MEMORY_CHUNKS && memory_chunk[i].size > 0; i++) { 618 unsigned long start_chunk, end_chunk, pfn; 619 620 if (memory_chunk[i].type != CHUNK_READ_WRITE) 621 continue; 622 start_chunk = PFN_DOWN(memory_chunk[i].addr); 623 end_chunk = start_chunk + PFN_DOWN(memory_chunk[i].size); 624 end_chunk = min(end_chunk, end_pfn); 625 if (start_chunk >= end_chunk) 626 continue; 627 add_active_range(0, start_chunk, end_chunk); 628 pfn = max(start_chunk, start_pfn); 629 for (; pfn < end_chunk; pfn++) 630 page_set_storage_key(PFN_PHYS(pfn), PAGE_DEFAULT_KEY); 631 } 632 633 psw_set_key(PAGE_DEFAULT_KEY); 634 635 free_bootmem_with_active_regions(0, max_pfn); 636 637 /* 638 * Reserve memory used for lowcore/command line/kernel image. 639 */ 640 reserve_bootmem(0, (unsigned long)_ehead, BOOTMEM_DEFAULT); 641 reserve_bootmem((unsigned long)_stext, 642 PFN_PHYS(start_pfn) - (unsigned long)_stext, 643 BOOTMEM_DEFAULT); 644 /* 645 * Reserve the bootmem bitmap itself as well. We do this in two 646 * steps (first step was init_bootmem()) because this catches 647 * the (very unlikely) case of us accidentally initializing the 648 * bootmem allocator with an invalid RAM area. 649 */ 650 reserve_bootmem(start_pfn << PAGE_SHIFT, bootmap_size, 651 BOOTMEM_DEFAULT); 652 653#ifdef CONFIG_BLK_DEV_INITRD 654 if (INITRD_START && INITRD_SIZE) { 655 if (INITRD_START + INITRD_SIZE <= memory_end) { 656 reserve_bootmem(INITRD_START, INITRD_SIZE, 657 BOOTMEM_DEFAULT); 658 initrd_start = INITRD_START; 659 initrd_end = initrd_start + INITRD_SIZE; 660 } else { 661 pr_err("initrd extends beyond end of " 662 "memory (0x%08lx > 0x%08lx) " 663 "disabling initrd\n", 664 initrd_start + INITRD_SIZE, memory_end); 665 initrd_start = initrd_end = 0; 666 } 667 } 668#endif 669} 670 671/* 672 * Setup hardware capabilities. 673 */ 674static void __init setup_hwcaps(void) 675{ 676 static const int stfl_bits[6] = { 0, 2, 7, 17, 19, 21 }; 677 unsigned long long facility_list_extended; 678 unsigned int facility_list; 679 struct cpuid cpu_id; 680 int i; 681 682 facility_list = stfl(); 683 /* 684 * The store facility list bits numbers as found in the principles 685 * of operation are numbered with bit 1UL<<31 as number 0 to 686 * bit 1UL<<0 as number 31. 687 * Bit 0: instructions named N3, "backported" to esa-mode 688 * Bit 2: z/Architecture mode is active 689 * Bit 7: the store-facility-list-extended facility is installed 690 * Bit 17: the message-security assist is installed 691 * Bit 19: the long-displacement facility is installed 692 * Bit 21: the extended-immediate facility is installed 693 * Bit 22: extended-translation facility 3 is installed 694 * Bit 30: extended-translation facility 3 enhancement facility 695 * These get translated to: 696 * HWCAP_S390_ESAN3 bit 0, HWCAP_S390_ZARCH bit 1, 697 * HWCAP_S390_STFLE bit 2, HWCAP_S390_MSA bit 3, 698 * HWCAP_S390_LDISP bit 4, HWCAP_S390_EIMM bit 5 and 699 * HWCAP_S390_ETF3EH bit 8 (22 && 30). 700 */ 701 for (i = 0; i < 6; i++) 702 if (facility_list & (1UL << (31 - stfl_bits[i]))) 703 elf_hwcap |= 1UL << i; 704 705 if ((facility_list & (1UL << (31 - 22))) 706 && (facility_list & (1UL << (31 - 30)))) 707 elf_hwcap |= HWCAP_S390_ETF3EH; 708 709 if ((elf_hwcap & (1UL << 2)) && 710 __stfle(&facility_list_extended, 1) > 0) { 711 if ((facility_list_extended & (1ULL << (63 - 42))) 712 && (facility_list_extended & (1ULL << (63 - 44)))) 713 elf_hwcap |= HWCAP_S390_DFP; 714 } 715 716 /* 717 * Huge page support HWCAP_S390_HPAGE is bit 7. 718 */ 719 if (MACHINE_HAS_HPAGE) 720 elf_hwcap |= HWCAP_S390_HPAGE; 721 722 /* 723 * 64-bit register support for 31-bit processes 724 * HWCAP_S390_HIGH_GPRS is bit 9. 725 */ 726 elf_hwcap |= HWCAP_S390_HIGH_GPRS; 727 728 get_cpu_id(&cpu_id); 729 switch (cpu_id.machine) { 730 case 0x9672: 731#if !defined(CONFIG_64BIT) 732 default: /* Use "g5" as default for 31 bit kernels. */ 733#endif 734 strcpy(elf_platform, "g5"); 735 break; 736 case 0x2064: 737 case 0x2066: 738#if defined(CONFIG_64BIT) 739 default: /* Use "z900" as default for 64 bit kernels. */ 740#endif 741 strcpy(elf_platform, "z900"); 742 break; 743 case 0x2084: 744 case 0x2086: 745 strcpy(elf_platform, "z990"); 746 break; 747 case 0x2094: 748 case 0x2096: 749 strcpy(elf_platform, "z9-109"); 750 break; 751 case 0x2097: 752 case 0x2098: 753 strcpy(elf_platform, "z10"); 754 break; 755 } 756} 757 758/* 759 * Setup function called from init/main.c just after the banner 760 * was printed. 761 */ 762 763void __init 764setup_arch(char **cmdline_p) 765{ 766 /* 767 * print what head.S has found out about the machine 768 */ 769#ifndef CONFIG_64BIT 770 if (MACHINE_IS_VM) 771 pr_info("Linux is running as a z/VM " 772 "guest operating system in 31-bit mode\n"); 773 else if (MACHINE_IS_LPAR) 774 pr_info("Linux is running natively in 31-bit mode\n"); 775 if (MACHINE_HAS_IEEE) 776 pr_info("The hardware system has IEEE compatible " 777 "floating point units\n"); 778 else 779 pr_info("The hardware system has no IEEE compatible " 780 "floating point units\n"); 781#else /* CONFIG_64BIT */ 782 if (MACHINE_IS_VM) 783 pr_info("Linux is running as a z/VM " 784 "guest operating system in 64-bit mode\n"); 785 else if (MACHINE_IS_KVM) 786 pr_info("Linux is running under KVM in 64-bit mode\n"); 787 else if (MACHINE_IS_LPAR) 788 pr_info("Linux is running natively in 64-bit mode\n"); 789#endif /* CONFIG_64BIT */ 790 791 /* Have one command line that is parsed and saved in /proc/cmdline */ 792 /* boot_command_line has been already set up in early.c */ 793 *cmdline_p = boot_command_line; 794 795 ROOT_DEV = Root_RAM0; 796 797 init_mm.start_code = PAGE_OFFSET; 798 init_mm.end_code = (unsigned long) &_etext; 799 init_mm.end_data = (unsigned long) &_edata; 800 init_mm.brk = (unsigned long) &_end; 801 802 if (MACHINE_HAS_MVCOS) 803 memcpy(&uaccess, &uaccess_mvcos, sizeof(uaccess)); 804 else 805 memcpy(&uaccess, &uaccess_std, sizeof(uaccess)); 806 807 parse_early_param(); 808 809 setup_ipl(); 810 setup_memory_end(); 811 setup_addressing_mode(); 812 setup_memory(); 813 setup_resources(); 814 setup_lowcore(); 815 816 cpu_init(); 817 s390_init_cpu_topology(); 818 819 /* 820 * Setup capabilities (ELF_HWCAP & ELF_PLATFORM). 821 */ 822 setup_hwcaps(); 823 824 /* 825 * Create kernel page tables and switch to virtual addressing. 826 */ 827 paging_init(); 828 829 /* Setup default console */ 830 conmode_default(); 831 set_preferred_console(); 832 833 /* Setup zfcpdump support */ 834 setup_zfcpdump(console_devno); 835} 836