1 /* 2 * arch/s390/kernel/ipl.c 3 * ipl/reipl/dump support for Linux on s390. 4 * 5 * Copyright IBM Corp. 2005,2007 6 * Author(s): Michael Holzheu <holzheu@de.ibm.com> 7 * Heiko Carstens <heiko.carstens@de.ibm.com> 8 * Volker Sameske <sameske@de.ibm.com> 9 */ 10 11 #include <linux/types.h> 12 #include <linux/module.h> 13 #include <linux/device.h> 14 #include <linux/delay.h> 15 #include <linux/reboot.h> 16 #include <linux/ctype.h> 17 #include <linux/fs.h> 18 #include <linux/gfp.h> 19 #include <asm/ipl.h> 20 #include <asm/smp.h> 21 #include <asm/setup.h> 22 #include <asm/cpcmd.h> 23 #include <asm/cio.h> 24 #include <asm/ebcdic.h> 25 #include <asm/reset.h> 26 #include <asm/sclp.h> 27 #include <asm/sigp.h> 28 #include <asm/checksum.h> 29 30 #define IPL_PARM_BLOCK_VERSION 0 31 32 #define IPL_UNKNOWN_STR "unknown" 33 #define IPL_CCW_STR "ccw" 34 #define IPL_FCP_STR "fcp" 35 #define IPL_FCP_DUMP_STR "fcp_dump" 36 #define IPL_NSS_STR "nss" 37 38 #define DUMP_CCW_STR "ccw" 39 #define DUMP_FCP_STR "fcp" 40 #define DUMP_NONE_STR "none" 41 42 /* 43 * Four shutdown trigger types are supported: 44 * - panic 45 * - halt 46 * - power off 47 * - reipl 48 */ 49 #define ON_PANIC_STR "on_panic" 50 #define ON_HALT_STR "on_halt" 51 #define ON_POFF_STR "on_poff" 52 #define ON_REIPL_STR "on_reboot" 53 54 struct shutdown_action; 55 struct shutdown_trigger { 56 char *name; 57 struct shutdown_action *action; 58 }; 59 60 /* 61 * The following shutdown action types are supported: 62 */ 63 #define SHUTDOWN_ACTION_IPL_STR "ipl" 64 #define SHUTDOWN_ACTION_REIPL_STR "reipl" 65 #define SHUTDOWN_ACTION_DUMP_STR "dump" 66 #define SHUTDOWN_ACTION_VMCMD_STR "vmcmd" 67 #define SHUTDOWN_ACTION_STOP_STR "stop" 68 #define SHUTDOWN_ACTION_DUMP_REIPL_STR "dump_reipl" 69 70 struct shutdown_action { 71 char *name; 72 void (*fn) (struct shutdown_trigger *trigger); 73 int (*init) (void); 74 int init_rc; 75 }; 76 77 static char *ipl_type_str(enum ipl_type type) 78 { 79 switch (type) { 80 case IPL_TYPE_CCW: 81 return IPL_CCW_STR; 82 case IPL_TYPE_FCP: 83 return IPL_FCP_STR; 84 case IPL_TYPE_FCP_DUMP: 85 return IPL_FCP_DUMP_STR; 86 case IPL_TYPE_NSS: 87 return IPL_NSS_STR; 88 case IPL_TYPE_UNKNOWN: 89 default: 90 return IPL_UNKNOWN_STR; 91 } 92 } 93 94 enum dump_type { 95 DUMP_TYPE_NONE = 1, 96 DUMP_TYPE_CCW = 2, 97 DUMP_TYPE_FCP = 4, 98 }; 99 100 static char *dump_type_str(enum dump_type type) 101 { 102 switch (type) { 103 case DUMP_TYPE_NONE: 104 return DUMP_NONE_STR; 105 case DUMP_TYPE_CCW: 106 return DUMP_CCW_STR; 107 case DUMP_TYPE_FCP: 108 return DUMP_FCP_STR; 109 default: 110 return NULL; 111 } 112 } 113 114 /* 115 * Must be in data section since the bss section 116 * is not cleared when these are accessed. 117 */ 118 static u16 ipl_devno __attribute__((__section__(".data"))) = 0; 119 u32 ipl_flags __attribute__((__section__(".data"))) = 0; 120 121 enum ipl_method { 122 REIPL_METHOD_CCW_CIO, 123 REIPL_METHOD_CCW_DIAG, 124 REIPL_METHOD_CCW_VM, 125 REIPL_METHOD_FCP_RO_DIAG, 126 REIPL_METHOD_FCP_RW_DIAG, 127 REIPL_METHOD_FCP_RO_VM, 128 REIPL_METHOD_FCP_DUMP, 129 REIPL_METHOD_NSS, 130 REIPL_METHOD_NSS_DIAG, 131 REIPL_METHOD_DEFAULT, 132 }; 133 134 enum dump_method { 135 DUMP_METHOD_NONE, 136 DUMP_METHOD_CCW_CIO, 137 DUMP_METHOD_CCW_DIAG, 138 DUMP_METHOD_CCW_VM, 139 DUMP_METHOD_FCP_DIAG, 140 }; 141 142 static int diag308_set_works = 0; 143 144 static struct ipl_parameter_block ipl_block; 145 146 static int reipl_capabilities = IPL_TYPE_UNKNOWN; 147 148 static enum ipl_type reipl_type = IPL_TYPE_UNKNOWN; 149 static enum ipl_method reipl_method = REIPL_METHOD_DEFAULT; 150 static struct ipl_parameter_block *reipl_block_fcp; 151 static struct ipl_parameter_block *reipl_block_ccw; 152 static struct ipl_parameter_block *reipl_block_nss; 153 static struct ipl_parameter_block *reipl_block_actual; 154 155 static int dump_capabilities = DUMP_TYPE_NONE; 156 static enum dump_type dump_type = DUMP_TYPE_NONE; 157 static enum dump_method dump_method = DUMP_METHOD_NONE; 158 static struct ipl_parameter_block *dump_block_fcp; 159 static struct ipl_parameter_block *dump_block_ccw; 160 161 static struct sclp_ipl_info sclp_ipl_info; 162 163 int diag308(unsigned long subcode, void *addr) 164 { 165 register unsigned long _addr asm("0") = (unsigned long) addr; 166 register unsigned long _rc asm("1") = 0; 167 168 asm volatile( 169 " diag %0,%2,0x308\n" 170 "0:\n" 171 EX_TABLE(0b,0b) 172 : "+d" (_addr), "+d" (_rc) 173 : "d" (subcode) : "cc", "memory"); 174 return _rc; 175 } 176 EXPORT_SYMBOL_GPL(diag308); 177 178 /* SYSFS */ 179 180 #define DEFINE_IPL_ATTR_RO(_prefix, _name, _format, _value) \ 181 static ssize_t sys_##_prefix##_##_name##_show(struct kobject *kobj, \ 182 struct kobj_attribute *attr, \ 183 char *page) \ 184 { \ 185 return sprintf(page, _format, _value); \ 186 } \ 187 static struct kobj_attribute sys_##_prefix##_##_name##_attr = \ 188 __ATTR(_name, S_IRUGO, sys_##_prefix##_##_name##_show, NULL); 189 190 #define DEFINE_IPL_ATTR_RW(_prefix, _name, _fmt_out, _fmt_in, _value) \ 191 static ssize_t sys_##_prefix##_##_name##_show(struct kobject *kobj, \ 192 struct kobj_attribute *attr, \ 193 char *page) \ 194 { \ 195 return sprintf(page, _fmt_out, \ 196 (unsigned long long) _value); \ 197 } \ 198 static ssize_t sys_##_prefix##_##_name##_store(struct kobject *kobj, \ 199 struct kobj_attribute *attr, \ 200 const char *buf, size_t len) \ 201 { \ 202 unsigned long long value; \ 203 if (sscanf(buf, _fmt_in, &value) != 1) \ 204 return -EINVAL; \ 205 _value = value; \ 206 return len; \ 207 } \ 208 static struct kobj_attribute sys_##_prefix##_##_name##_attr = \ 209 __ATTR(_name,(S_IRUGO | S_IWUSR), \ 210 sys_##_prefix##_##_name##_show, \ 211 sys_##_prefix##_##_name##_store); 212 213 #define DEFINE_IPL_ATTR_STR_RW(_prefix, _name, _fmt_out, _fmt_in, _value)\ 214 static ssize_t sys_##_prefix##_##_name##_show(struct kobject *kobj, \ 215 struct kobj_attribute *attr, \ 216 char *page) \ 217 { \ 218 return sprintf(page, _fmt_out, _value); \ 219 } \ 220 static ssize_t sys_##_prefix##_##_name##_store(struct kobject *kobj, \ 221 struct kobj_attribute *attr, \ 222 const char *buf, size_t len) \ 223 { \ 224 strncpy(_value, buf, sizeof(_value) - 1); \ 225 strim(_value); \ 226 return len; \ 227 } \ 228 static struct kobj_attribute sys_##_prefix##_##_name##_attr = \ 229 __ATTR(_name,(S_IRUGO | S_IWUSR), \ 230 sys_##_prefix##_##_name##_show, \ 231 sys_##_prefix##_##_name##_store); 232 233 static void make_attrs_ro(struct attribute **attrs) 234 { 235 while (*attrs) { 236 (*attrs)->mode = S_IRUGO; 237 attrs++; 238 } 239 } 240 241 /* 242 * ipl section 243 */ 244 245 static __init enum ipl_type get_ipl_type(void) 246 { 247 struct ipl_parameter_block *ipl = IPL_PARMBLOCK_START; 248 249 if (ipl_flags & IPL_NSS_VALID) 250 return IPL_TYPE_NSS; 251 if (!(ipl_flags & IPL_DEVNO_VALID)) 252 return IPL_TYPE_UNKNOWN; 253 if (!(ipl_flags & IPL_PARMBLOCK_VALID)) 254 return IPL_TYPE_CCW; 255 if (ipl->hdr.version > IPL_MAX_SUPPORTED_VERSION) 256 return IPL_TYPE_UNKNOWN; 257 if (ipl->hdr.pbt != DIAG308_IPL_TYPE_FCP) 258 return IPL_TYPE_UNKNOWN; 259 if (ipl->ipl_info.fcp.opt == DIAG308_IPL_OPT_DUMP) 260 return IPL_TYPE_FCP_DUMP; 261 return IPL_TYPE_FCP; 262 } 263 264 struct ipl_info ipl_info; 265 EXPORT_SYMBOL_GPL(ipl_info); 266 267 static ssize_t ipl_type_show(struct kobject *kobj, struct kobj_attribute *attr, 268 char *page) 269 { 270 return sprintf(page, "%s\n", ipl_type_str(ipl_info.type)); 271 } 272 273 static struct kobj_attribute sys_ipl_type_attr = __ATTR_RO(ipl_type); 274 275 /* VM IPL PARM routines */ 276 size_t reipl_get_ascii_vmparm(char *dest, size_t size, 277 const struct ipl_parameter_block *ipb) 278 { 279 int i; 280 size_t len; 281 char has_lowercase = 0; 282 283 len = 0; 284 if ((ipb->ipl_info.ccw.vm_flags & DIAG308_VM_FLAGS_VP_VALID) && 285 (ipb->ipl_info.ccw.vm_parm_len > 0)) { 286 287 len = min_t(size_t, size - 1, ipb->ipl_info.ccw.vm_parm_len); 288 memcpy(dest, ipb->ipl_info.ccw.vm_parm, len); 289 /* If at least one character is lowercase, we assume mixed 290 * case; otherwise we convert everything to lowercase. 291 */ 292 for (i = 0; i < len; i++) 293 if ((dest[i] > 0x80 && dest[i] < 0x8a) || /* a-i */ 294 (dest[i] > 0x90 && dest[i] < 0x9a) || /* j-r */ 295 (dest[i] > 0xa1 && dest[i] < 0xaa)) { /* s-z */ 296 has_lowercase = 1; 297 break; 298 } 299 if (!has_lowercase) 300 EBC_TOLOWER(dest, len); 301 EBCASC(dest, len); 302 } 303 dest[len] = 0; 304 305 return len; 306 } 307 308 size_t append_ipl_vmparm(char *dest, size_t size) 309 { 310 size_t rc; 311 312 rc = 0; 313 if (diag308_set_works && (ipl_block.hdr.pbt == DIAG308_IPL_TYPE_CCW)) 314 rc = reipl_get_ascii_vmparm(dest, size, &ipl_block); 315 else 316 dest[0] = 0; 317 return rc; 318 } 319 320 static ssize_t ipl_vm_parm_show(struct kobject *kobj, 321 struct kobj_attribute *attr, char *page) 322 { 323 char parm[DIAG308_VMPARM_SIZE + 1] = {}; 324 325 append_ipl_vmparm(parm, sizeof(parm)); 326 return sprintf(page, "%s\n", parm); 327 } 328 329 static size_t scpdata_length(const char* buf, size_t count) 330 { 331 while (count) { 332 if (buf[count - 1] != '\0' && buf[count - 1] != ' ') 333 break; 334 count--; 335 } 336 return count; 337 } 338 339 size_t reipl_append_ascii_scpdata(char *dest, size_t size, 340 const struct ipl_parameter_block *ipb) 341 { 342 size_t count; 343 size_t i; 344 int has_lowercase; 345 346 count = min(size - 1, scpdata_length(ipb->ipl_info.fcp.scp_data, 347 ipb->ipl_info.fcp.scp_data_len)); 348 if (!count) 349 goto out; 350 351 has_lowercase = 0; 352 for (i = 0; i < count; i++) { 353 if (!isascii(ipb->ipl_info.fcp.scp_data[i])) { 354 count = 0; 355 goto out; 356 } 357 if (!has_lowercase && islower(ipb->ipl_info.fcp.scp_data[i])) 358 has_lowercase = 1; 359 } 360 361 if (has_lowercase) 362 memcpy(dest, ipb->ipl_info.fcp.scp_data, count); 363 else 364 for (i = 0; i < count; i++) 365 dest[i] = tolower(ipb->ipl_info.fcp.scp_data[i]); 366 out: 367 dest[count] = '\0'; 368 return count; 369 } 370 371 size_t append_ipl_scpdata(char *dest, size_t len) 372 { 373 size_t rc; 374 375 rc = 0; 376 if (ipl_block.hdr.pbt == DIAG308_IPL_TYPE_FCP) 377 rc = reipl_append_ascii_scpdata(dest, len, &ipl_block); 378 else 379 dest[0] = 0; 380 return rc; 381 } 382 383 384 static struct kobj_attribute sys_ipl_vm_parm_attr = 385 __ATTR(parm, S_IRUGO, ipl_vm_parm_show, NULL); 386 387 static ssize_t sys_ipl_device_show(struct kobject *kobj, 388 struct kobj_attribute *attr, char *page) 389 { 390 struct ipl_parameter_block *ipl = IPL_PARMBLOCK_START; 391 392 switch (ipl_info.type) { 393 case IPL_TYPE_CCW: 394 return sprintf(page, "0.0.%04x\n", ipl_devno); 395 case IPL_TYPE_FCP: 396 case IPL_TYPE_FCP_DUMP: 397 return sprintf(page, "0.0.%04x\n", ipl->ipl_info.fcp.devno); 398 default: 399 return 0; 400 } 401 } 402 403 static struct kobj_attribute sys_ipl_device_attr = 404 __ATTR(device, S_IRUGO, sys_ipl_device_show, NULL); 405 406 static ssize_t ipl_parameter_read(struct file *filp, struct kobject *kobj, 407 struct bin_attribute *attr, char *buf, 408 loff_t off, size_t count) 409 { 410 return memory_read_from_buffer(buf, count, &off, IPL_PARMBLOCK_START, 411 IPL_PARMBLOCK_SIZE); 412 } 413 414 static struct bin_attribute ipl_parameter_attr = { 415 .attr = { 416 .name = "binary_parameter", 417 .mode = S_IRUGO, 418 }, 419 .size = PAGE_SIZE, 420 .read = &ipl_parameter_read, 421 }; 422 423 static ssize_t ipl_scp_data_read(struct file *filp, struct kobject *kobj, 424 struct bin_attribute *attr, char *buf, 425 loff_t off, size_t count) 426 { 427 unsigned int size = IPL_PARMBLOCK_START->ipl_info.fcp.scp_data_len; 428 void *scp_data = &IPL_PARMBLOCK_START->ipl_info.fcp.scp_data; 429 430 return memory_read_from_buffer(buf, count, &off, scp_data, size); 431 } 432 433 static struct bin_attribute ipl_scp_data_attr = { 434 .attr = { 435 .name = "scp_data", 436 .mode = S_IRUGO, 437 }, 438 .size = PAGE_SIZE, 439 .read = ipl_scp_data_read, 440 }; 441 442 /* FCP ipl device attributes */ 443 444 DEFINE_IPL_ATTR_RO(ipl_fcp, wwpn, "0x%016llx\n", (unsigned long long) 445 IPL_PARMBLOCK_START->ipl_info.fcp.wwpn); 446 DEFINE_IPL_ATTR_RO(ipl_fcp, lun, "0x%016llx\n", (unsigned long long) 447 IPL_PARMBLOCK_START->ipl_info.fcp.lun); 448 DEFINE_IPL_ATTR_RO(ipl_fcp, bootprog, "%lld\n", (unsigned long long) 449 IPL_PARMBLOCK_START->ipl_info.fcp.bootprog); 450 DEFINE_IPL_ATTR_RO(ipl_fcp, br_lba, "%lld\n", (unsigned long long) 451 IPL_PARMBLOCK_START->ipl_info.fcp.br_lba); 452 453 static struct attribute *ipl_fcp_attrs[] = { 454 &sys_ipl_type_attr.attr, 455 &sys_ipl_device_attr.attr, 456 &sys_ipl_fcp_wwpn_attr.attr, 457 &sys_ipl_fcp_lun_attr.attr, 458 &sys_ipl_fcp_bootprog_attr.attr, 459 &sys_ipl_fcp_br_lba_attr.attr, 460 NULL, 461 }; 462 463 static struct attribute_group ipl_fcp_attr_group = { 464 .attrs = ipl_fcp_attrs, 465 }; 466 467 /* CCW ipl device attributes */ 468 469 static ssize_t ipl_ccw_loadparm_show(struct kobject *kobj, 470 struct kobj_attribute *attr, char *page) 471 { 472 char loadparm[LOADPARM_LEN + 1] = {}; 473 474 if (!sclp_ipl_info.is_valid) 475 return sprintf(page, "#unknown#\n"); 476 memcpy(loadparm, &sclp_ipl_info.loadparm, LOADPARM_LEN); 477 EBCASC(loadparm, LOADPARM_LEN); 478 strim(loadparm); 479 return sprintf(page, "%s\n", loadparm); 480 } 481 482 static struct kobj_attribute sys_ipl_ccw_loadparm_attr = 483 __ATTR(loadparm, 0444, ipl_ccw_loadparm_show, NULL); 484 485 static struct attribute *ipl_ccw_attrs_vm[] = { 486 &sys_ipl_type_attr.attr, 487 &sys_ipl_device_attr.attr, 488 &sys_ipl_ccw_loadparm_attr.attr, 489 &sys_ipl_vm_parm_attr.attr, 490 NULL, 491 }; 492 493 static struct attribute *ipl_ccw_attrs_lpar[] = { 494 &sys_ipl_type_attr.attr, 495 &sys_ipl_device_attr.attr, 496 &sys_ipl_ccw_loadparm_attr.attr, 497 NULL, 498 }; 499 500 static struct attribute_group ipl_ccw_attr_group_vm = { 501 .attrs = ipl_ccw_attrs_vm, 502 }; 503 504 static struct attribute_group ipl_ccw_attr_group_lpar = { 505 .attrs = ipl_ccw_attrs_lpar 506 }; 507 508 /* NSS ipl device attributes */ 509 510 DEFINE_IPL_ATTR_RO(ipl_nss, name, "%s\n", kernel_nss_name); 511 512 static struct attribute *ipl_nss_attrs[] = { 513 &sys_ipl_type_attr.attr, 514 &sys_ipl_nss_name_attr.attr, 515 &sys_ipl_ccw_loadparm_attr.attr, 516 &sys_ipl_vm_parm_attr.attr, 517 NULL, 518 }; 519 520 static struct attribute_group ipl_nss_attr_group = { 521 .attrs = ipl_nss_attrs, 522 }; 523 524 /* UNKNOWN ipl device attributes */ 525 526 static struct attribute *ipl_unknown_attrs[] = { 527 &sys_ipl_type_attr.attr, 528 NULL, 529 }; 530 531 static struct attribute_group ipl_unknown_attr_group = { 532 .attrs = ipl_unknown_attrs, 533 }; 534 535 static struct kset *ipl_kset; 536 537 static int __init ipl_register_fcp_files(void) 538 { 539 int rc; 540 541 rc = sysfs_create_group(&ipl_kset->kobj, &ipl_fcp_attr_group); 542 if (rc) 543 goto out; 544 rc = sysfs_create_bin_file(&ipl_kset->kobj, &ipl_parameter_attr); 545 if (rc) 546 goto out_ipl_parm; 547 rc = sysfs_create_bin_file(&ipl_kset->kobj, &ipl_scp_data_attr); 548 if (!rc) 549 goto out; 550 551 sysfs_remove_bin_file(&ipl_kset->kobj, &ipl_parameter_attr); 552 553 out_ipl_parm: 554 sysfs_remove_group(&ipl_kset->kobj, &ipl_fcp_attr_group); 555 out: 556 return rc; 557 } 558 559 static void __ipl_run(void *unused) 560 { 561 diag308(DIAG308_IPL, NULL); 562 if (MACHINE_IS_VM) 563 __cpcmd("IPL", NULL, 0, NULL); 564 else if (ipl_info.type == IPL_TYPE_CCW) 565 reipl_ccw_dev(&ipl_info.data.ccw.dev_id); 566 } 567 568 static void ipl_run(struct shutdown_trigger *trigger) 569 { 570 smp_switch_to_ipl_cpu(__ipl_run, NULL); 571 } 572 573 static int __init ipl_init(void) 574 { 575 int rc; 576 577 ipl_kset = kset_create_and_add("ipl", NULL, firmware_kobj); 578 if (!ipl_kset) { 579 rc = -ENOMEM; 580 goto out; 581 } 582 switch (ipl_info.type) { 583 case IPL_TYPE_CCW: 584 if (MACHINE_IS_VM) 585 rc = sysfs_create_group(&ipl_kset->kobj, 586 &ipl_ccw_attr_group_vm); 587 else 588 rc = sysfs_create_group(&ipl_kset->kobj, 589 &ipl_ccw_attr_group_lpar); 590 break; 591 case IPL_TYPE_FCP: 592 case IPL_TYPE_FCP_DUMP: 593 rc = ipl_register_fcp_files(); 594 break; 595 case IPL_TYPE_NSS: 596 rc = sysfs_create_group(&ipl_kset->kobj, &ipl_nss_attr_group); 597 break; 598 default: 599 rc = sysfs_create_group(&ipl_kset->kobj, 600 &ipl_unknown_attr_group); 601 break; 602 } 603 out: 604 if (rc) 605 panic("ipl_init failed: rc = %i\n", rc); 606 607 return 0; 608 } 609 610 static struct shutdown_action __refdata ipl_action = { 611 .name = SHUTDOWN_ACTION_IPL_STR, 612 .fn = ipl_run, 613 .init = ipl_init, 614 }; 615 616 /* 617 * reipl shutdown action: Reboot Linux on shutdown. 618 */ 619 620 /* VM IPL PARM attributes */ 621 static ssize_t reipl_generic_vmparm_show(struct ipl_parameter_block *ipb, 622 char *page) 623 { 624 char vmparm[DIAG308_VMPARM_SIZE + 1] = {}; 625 626 reipl_get_ascii_vmparm(vmparm, sizeof(vmparm), ipb); 627 return sprintf(page, "%s\n", vmparm); 628 } 629 630 static ssize_t reipl_generic_vmparm_store(struct ipl_parameter_block *ipb, 631 size_t vmparm_max, 632 const char *buf, size_t len) 633 { 634 int i, ip_len; 635 636 /* ignore trailing newline */ 637 ip_len = len; 638 if ((len > 0) && (buf[len - 1] == '\n')) 639 ip_len--; 640 641 if (ip_len > vmparm_max) 642 return -EINVAL; 643 644 /* parm is used to store kernel options, check for common chars */ 645 for (i = 0; i < ip_len; i++) 646 if (!(isalnum(buf[i]) || isascii(buf[i]) || isprint(buf[i]))) 647 return -EINVAL; 648 649 memset(ipb->ipl_info.ccw.vm_parm, 0, DIAG308_VMPARM_SIZE); 650 ipb->ipl_info.ccw.vm_parm_len = ip_len; 651 if (ip_len > 0) { 652 ipb->ipl_info.ccw.vm_flags |= DIAG308_VM_FLAGS_VP_VALID; 653 memcpy(ipb->ipl_info.ccw.vm_parm, buf, ip_len); 654 ASCEBC(ipb->ipl_info.ccw.vm_parm, ip_len); 655 } else { 656 ipb->ipl_info.ccw.vm_flags &= ~DIAG308_VM_FLAGS_VP_VALID; 657 } 658 659 return len; 660 } 661 662 /* NSS wrapper */ 663 static ssize_t reipl_nss_vmparm_show(struct kobject *kobj, 664 struct kobj_attribute *attr, char *page) 665 { 666 return reipl_generic_vmparm_show(reipl_block_nss, page); 667 } 668 669 static ssize_t reipl_nss_vmparm_store(struct kobject *kobj, 670 struct kobj_attribute *attr, 671 const char *buf, size_t len) 672 { 673 return reipl_generic_vmparm_store(reipl_block_nss, 56, buf, len); 674 } 675 676 /* CCW wrapper */ 677 static ssize_t reipl_ccw_vmparm_show(struct kobject *kobj, 678 struct kobj_attribute *attr, char *page) 679 { 680 return reipl_generic_vmparm_show(reipl_block_ccw, page); 681 } 682 683 static ssize_t reipl_ccw_vmparm_store(struct kobject *kobj, 684 struct kobj_attribute *attr, 685 const char *buf, size_t len) 686 { 687 return reipl_generic_vmparm_store(reipl_block_ccw, 64, buf, len); 688 } 689 690 static struct kobj_attribute sys_reipl_nss_vmparm_attr = 691 __ATTR(parm, S_IRUGO | S_IWUSR, reipl_nss_vmparm_show, 692 reipl_nss_vmparm_store); 693 static struct kobj_attribute sys_reipl_ccw_vmparm_attr = 694 __ATTR(parm, S_IRUGO | S_IWUSR, reipl_ccw_vmparm_show, 695 reipl_ccw_vmparm_store); 696 697 /* FCP reipl device attributes */ 698 699 static ssize_t reipl_fcp_scpdata_read(struct file *filp, struct kobject *kobj, 700 struct bin_attribute *attr, 701 char *buf, loff_t off, size_t count) 702 { 703 size_t size = reipl_block_fcp->ipl_info.fcp.scp_data_len; 704 void *scp_data = reipl_block_fcp->ipl_info.fcp.scp_data; 705 706 return memory_read_from_buffer(buf, count, &off, scp_data, size); 707 } 708 709 static ssize_t reipl_fcp_scpdata_write(struct file *filp, struct kobject *kobj, 710 struct bin_attribute *attr, 711 char *buf, loff_t off, size_t count) 712 { 713 size_t padding; 714 size_t scpdata_len; 715 716 if (off < 0) 717 return -EINVAL; 718 719 if (off >= DIAG308_SCPDATA_SIZE) 720 return -ENOSPC; 721 722 if (count > DIAG308_SCPDATA_SIZE - off) 723 count = DIAG308_SCPDATA_SIZE - off; 724 725 memcpy(reipl_block_fcp->ipl_info.fcp.scp_data, buf + off, count); 726 scpdata_len = off + count; 727 728 if (scpdata_len % 8) { 729 padding = 8 - (scpdata_len % 8); 730 memset(reipl_block_fcp->ipl_info.fcp.scp_data + scpdata_len, 731 0, padding); 732 scpdata_len += padding; 733 } 734 735 reipl_block_fcp->ipl_info.fcp.scp_data_len = scpdata_len; 736 reipl_block_fcp->hdr.len = IPL_PARM_BLK_FCP_LEN + scpdata_len; 737 reipl_block_fcp->hdr.blk0_len = IPL_PARM_BLK0_FCP_LEN + scpdata_len; 738 739 return count; 740 } 741 742 static struct bin_attribute sys_reipl_fcp_scp_data_attr = { 743 .attr = { 744 .name = "scp_data", 745 .mode = S_IRUGO | S_IWUSR, 746 }, 747 .size = PAGE_SIZE, 748 .read = reipl_fcp_scpdata_read, 749 .write = reipl_fcp_scpdata_write, 750 }; 751 752 DEFINE_IPL_ATTR_RW(reipl_fcp, wwpn, "0x%016llx\n", "%016llx\n", 753 reipl_block_fcp->ipl_info.fcp.wwpn); 754 DEFINE_IPL_ATTR_RW(reipl_fcp, lun, "0x%016llx\n", "%016llx\n", 755 reipl_block_fcp->ipl_info.fcp.lun); 756 DEFINE_IPL_ATTR_RW(reipl_fcp, bootprog, "%lld\n", "%lld\n", 757 reipl_block_fcp->ipl_info.fcp.bootprog); 758 DEFINE_IPL_ATTR_RW(reipl_fcp, br_lba, "%lld\n", "%lld\n", 759 reipl_block_fcp->ipl_info.fcp.br_lba); 760 DEFINE_IPL_ATTR_RW(reipl_fcp, device, "0.0.%04llx\n", "0.0.%llx\n", 761 reipl_block_fcp->ipl_info.fcp.devno); 762 763 static struct attribute *reipl_fcp_attrs[] = { 764 &sys_reipl_fcp_device_attr.attr, 765 &sys_reipl_fcp_wwpn_attr.attr, 766 &sys_reipl_fcp_lun_attr.attr, 767 &sys_reipl_fcp_bootprog_attr.attr, 768 &sys_reipl_fcp_br_lba_attr.attr, 769 NULL, 770 }; 771 772 static struct attribute_group reipl_fcp_attr_group = { 773 .attrs = reipl_fcp_attrs, 774 }; 775 776 /* CCW reipl device attributes */ 777 778 DEFINE_IPL_ATTR_RW(reipl_ccw, device, "0.0.%04llx\n", "0.0.%llx\n", 779 reipl_block_ccw->ipl_info.ccw.devno); 780 781 static void reipl_get_ascii_loadparm(char *loadparm, 782 struct ipl_parameter_block *ibp) 783 { 784 memcpy(loadparm, ibp->ipl_info.ccw.load_parm, LOADPARM_LEN); 785 EBCASC(loadparm, LOADPARM_LEN); 786 loadparm[LOADPARM_LEN] = 0; 787 strim(loadparm); 788 } 789 790 static ssize_t reipl_generic_loadparm_show(struct ipl_parameter_block *ipb, 791 char *page) 792 { 793 char buf[LOADPARM_LEN + 1]; 794 795 reipl_get_ascii_loadparm(buf, ipb); 796 return sprintf(page, "%s\n", buf); 797 } 798 799 static ssize_t reipl_generic_loadparm_store(struct ipl_parameter_block *ipb, 800 const char *buf, size_t len) 801 { 802 int i, lp_len; 803 804 /* ignore trailing newline */ 805 lp_len = len; 806 if ((len > 0) && (buf[len - 1] == '\n')) 807 lp_len--; 808 /* loadparm can have max 8 characters and must not start with a blank */ 809 if ((lp_len > LOADPARM_LEN) || ((lp_len > 0) && (buf[0] == ' '))) 810 return -EINVAL; 811 /* loadparm can only contain "a-z,A-Z,0-9,SP,." */ 812 for (i = 0; i < lp_len; i++) { 813 if (isalpha(buf[i]) || isdigit(buf[i]) || (buf[i] == ' ') || 814 (buf[i] == '.')) 815 continue; 816 return -EINVAL; 817 } 818 /* initialize loadparm with blanks */ 819 memset(ipb->ipl_info.ccw.load_parm, ' ', LOADPARM_LEN); 820 /* copy and convert to ebcdic */ 821 memcpy(ipb->ipl_info.ccw.load_parm, buf, lp_len); 822 ASCEBC(ipb->ipl_info.ccw.load_parm, LOADPARM_LEN); 823 return len; 824 } 825 826 /* NSS wrapper */ 827 static ssize_t reipl_nss_loadparm_show(struct kobject *kobj, 828 struct kobj_attribute *attr, char *page) 829 { 830 return reipl_generic_loadparm_show(reipl_block_nss, page); 831 } 832 833 static ssize_t reipl_nss_loadparm_store(struct kobject *kobj, 834 struct kobj_attribute *attr, 835 const char *buf, size_t len) 836 { 837 return reipl_generic_loadparm_store(reipl_block_nss, buf, len); 838 } 839 840 /* CCW wrapper */ 841 static ssize_t reipl_ccw_loadparm_show(struct kobject *kobj, 842 struct kobj_attribute *attr, char *page) 843 { 844 return reipl_generic_loadparm_show(reipl_block_ccw, page); 845 } 846 847 static ssize_t reipl_ccw_loadparm_store(struct kobject *kobj, 848 struct kobj_attribute *attr, 849 const char *buf, size_t len) 850 { 851 return reipl_generic_loadparm_store(reipl_block_ccw, buf, len); 852 } 853 854 static struct kobj_attribute sys_reipl_ccw_loadparm_attr = 855 __ATTR(loadparm, S_IRUGO | S_IWUSR, reipl_ccw_loadparm_show, 856 reipl_ccw_loadparm_store); 857 858 static struct attribute *reipl_ccw_attrs_vm[] = { 859 &sys_reipl_ccw_device_attr.attr, 860 &sys_reipl_ccw_loadparm_attr.attr, 861 &sys_reipl_ccw_vmparm_attr.attr, 862 NULL, 863 }; 864 865 static struct attribute *reipl_ccw_attrs_lpar[] = { 866 &sys_reipl_ccw_device_attr.attr, 867 &sys_reipl_ccw_loadparm_attr.attr, 868 NULL, 869 }; 870 871 static struct attribute_group reipl_ccw_attr_group_vm = { 872 .name = IPL_CCW_STR, 873 .attrs = reipl_ccw_attrs_vm, 874 }; 875 876 static struct attribute_group reipl_ccw_attr_group_lpar = { 877 .name = IPL_CCW_STR, 878 .attrs = reipl_ccw_attrs_lpar, 879 }; 880 881 882 /* NSS reipl device attributes */ 883 static void reipl_get_ascii_nss_name(char *dst, 884 struct ipl_parameter_block *ipb) 885 { 886 memcpy(dst, ipb->ipl_info.ccw.nss_name, NSS_NAME_SIZE); 887 EBCASC(dst, NSS_NAME_SIZE); 888 dst[NSS_NAME_SIZE] = 0; 889 } 890 891 static ssize_t reipl_nss_name_show(struct kobject *kobj, 892 struct kobj_attribute *attr, char *page) 893 { 894 char nss_name[NSS_NAME_SIZE + 1] = {}; 895 896 reipl_get_ascii_nss_name(nss_name, reipl_block_nss); 897 return sprintf(page, "%s\n", nss_name); 898 } 899 900 static ssize_t reipl_nss_name_store(struct kobject *kobj, 901 struct kobj_attribute *attr, 902 const char *buf, size_t len) 903 { 904 int nss_len; 905 906 /* ignore trailing newline */ 907 nss_len = len; 908 if ((len > 0) && (buf[len - 1] == '\n')) 909 nss_len--; 910 911 if (nss_len > NSS_NAME_SIZE) 912 return -EINVAL; 913 914 memset(reipl_block_nss->ipl_info.ccw.nss_name, 0x40, NSS_NAME_SIZE); 915 if (nss_len > 0) { 916 reipl_block_nss->ipl_info.ccw.vm_flags |= 917 DIAG308_VM_FLAGS_NSS_VALID; 918 memcpy(reipl_block_nss->ipl_info.ccw.nss_name, buf, nss_len); 919 ASCEBC(reipl_block_nss->ipl_info.ccw.nss_name, nss_len); 920 EBC_TOUPPER(reipl_block_nss->ipl_info.ccw.nss_name, nss_len); 921 } else { 922 reipl_block_nss->ipl_info.ccw.vm_flags &= 923 ~DIAG308_VM_FLAGS_NSS_VALID; 924 } 925 926 return len; 927 } 928 929 static struct kobj_attribute sys_reipl_nss_name_attr = 930 __ATTR(name, S_IRUGO | S_IWUSR, reipl_nss_name_show, 931 reipl_nss_name_store); 932 933 static struct kobj_attribute sys_reipl_nss_loadparm_attr = 934 __ATTR(loadparm, S_IRUGO | S_IWUSR, reipl_nss_loadparm_show, 935 reipl_nss_loadparm_store); 936 937 static struct attribute *reipl_nss_attrs[] = { 938 &sys_reipl_nss_name_attr.attr, 939 &sys_reipl_nss_loadparm_attr.attr, 940 &sys_reipl_nss_vmparm_attr.attr, 941 NULL, 942 }; 943 944 static struct attribute_group reipl_nss_attr_group = { 945 .name = IPL_NSS_STR, 946 .attrs = reipl_nss_attrs, 947 }; 948 949 /* reipl type */ 950 951 static int reipl_set_type(enum ipl_type type) 952 { 953 if (!(reipl_capabilities & type)) 954 return -EINVAL; 955 956 switch(type) { 957 case IPL_TYPE_CCW: 958 if (diag308_set_works) 959 reipl_method = REIPL_METHOD_CCW_DIAG; 960 else if (MACHINE_IS_VM) 961 reipl_method = REIPL_METHOD_CCW_VM; 962 else 963 reipl_method = REIPL_METHOD_CCW_CIO; 964 reipl_block_actual = reipl_block_ccw; 965 break; 966 case IPL_TYPE_FCP: 967 if (diag308_set_works) 968 reipl_method = REIPL_METHOD_FCP_RW_DIAG; 969 else if (MACHINE_IS_VM) 970 reipl_method = REIPL_METHOD_FCP_RO_VM; 971 else 972 reipl_method = REIPL_METHOD_FCP_RO_DIAG; 973 reipl_block_actual = reipl_block_fcp; 974 break; 975 case IPL_TYPE_FCP_DUMP: 976 reipl_method = REIPL_METHOD_FCP_DUMP; 977 break; 978 case IPL_TYPE_NSS: 979 if (diag308_set_works) 980 reipl_method = REIPL_METHOD_NSS_DIAG; 981 else 982 reipl_method = REIPL_METHOD_NSS; 983 reipl_block_actual = reipl_block_nss; 984 break; 985 case IPL_TYPE_UNKNOWN: 986 reipl_method = REIPL_METHOD_DEFAULT; 987 break; 988 default: 989 BUG(); 990 } 991 reipl_type = type; 992 return 0; 993 } 994 995 static ssize_t reipl_type_show(struct kobject *kobj, 996 struct kobj_attribute *attr, char *page) 997 { 998 return sprintf(page, "%s\n", ipl_type_str(reipl_type)); 999 } 1000 1001 static ssize_t reipl_type_store(struct kobject *kobj, 1002 struct kobj_attribute *attr, 1003 const char *buf, size_t len) 1004 { 1005 int rc = -EINVAL; 1006 1007 if (strncmp(buf, IPL_CCW_STR, strlen(IPL_CCW_STR)) == 0) 1008 rc = reipl_set_type(IPL_TYPE_CCW); 1009 else if (strncmp(buf, IPL_FCP_STR, strlen(IPL_FCP_STR)) == 0) 1010 rc = reipl_set_type(IPL_TYPE_FCP); 1011 else if (strncmp(buf, IPL_NSS_STR, strlen(IPL_NSS_STR)) == 0) 1012 rc = reipl_set_type(IPL_TYPE_NSS); 1013 return (rc != 0) ? rc : len; 1014 } 1015 1016 static struct kobj_attribute reipl_type_attr = 1017 __ATTR(reipl_type, 0644, reipl_type_show, reipl_type_store); 1018 1019 static struct kset *reipl_kset; 1020 static struct kset *reipl_fcp_kset; 1021 1022 static void get_ipl_string(char *dst, struct ipl_parameter_block *ipb, 1023 const enum ipl_method m) 1024 { 1025 char loadparm[LOADPARM_LEN + 1] = {}; 1026 char vmparm[DIAG308_VMPARM_SIZE + 1] = {}; 1027 char nss_name[NSS_NAME_SIZE + 1] = {}; 1028 size_t pos = 0; 1029 1030 reipl_get_ascii_loadparm(loadparm, ipb); 1031 reipl_get_ascii_nss_name(nss_name, ipb); 1032 reipl_get_ascii_vmparm(vmparm, sizeof(vmparm), ipb); 1033 1034 switch (m) { 1035 case REIPL_METHOD_CCW_VM: 1036 pos = sprintf(dst, "IPL %X CLEAR", ipb->ipl_info.ccw.devno); 1037 break; 1038 case REIPL_METHOD_NSS: 1039 pos = sprintf(dst, "IPL %s", nss_name); 1040 break; 1041 default: 1042 break; 1043 } 1044 if (strlen(loadparm) > 0) 1045 pos += sprintf(dst + pos, " LOADPARM '%s'", loadparm); 1046 if (strlen(vmparm) > 0) 1047 sprintf(dst + pos, " PARM %s", vmparm); 1048 } 1049 1050 static void __reipl_run(void *unused) 1051 { 1052 struct ccw_dev_id devid; 1053 static char buf[128]; 1054 1055 switch (reipl_method) { 1056 case REIPL_METHOD_CCW_CIO: 1057 devid.devno = reipl_block_ccw->ipl_info.ccw.devno; 1058 devid.ssid = 0; 1059 reipl_ccw_dev(&devid); 1060 break; 1061 case REIPL_METHOD_CCW_VM: 1062 get_ipl_string(buf, reipl_block_ccw, REIPL_METHOD_CCW_VM); 1063 __cpcmd(buf, NULL, 0, NULL); 1064 break; 1065 case REIPL_METHOD_CCW_DIAG: 1066 diag308(DIAG308_SET, reipl_block_ccw); 1067 diag308(DIAG308_IPL, NULL); 1068 break; 1069 case REIPL_METHOD_FCP_RW_DIAG: 1070 diag308(DIAG308_SET, reipl_block_fcp); 1071 diag308(DIAG308_IPL, NULL); 1072 break; 1073 case REIPL_METHOD_FCP_RO_DIAG: 1074 diag308(DIAG308_IPL, NULL); 1075 break; 1076 case REIPL_METHOD_FCP_RO_VM: 1077 __cpcmd("IPL", NULL, 0, NULL); 1078 break; 1079 case REIPL_METHOD_NSS_DIAG: 1080 diag308(DIAG308_SET, reipl_block_nss); 1081 diag308(DIAG308_IPL, NULL); 1082 break; 1083 case REIPL_METHOD_NSS: 1084 get_ipl_string(buf, reipl_block_nss, REIPL_METHOD_NSS); 1085 __cpcmd(buf, NULL, 0, NULL); 1086 break; 1087 case REIPL_METHOD_DEFAULT: 1088 if (MACHINE_IS_VM) 1089 __cpcmd("IPL", NULL, 0, NULL); 1090 diag308(DIAG308_IPL, NULL); 1091 break; 1092 case REIPL_METHOD_FCP_DUMP: 1093 break; 1094 } 1095 disabled_wait((unsigned long) __builtin_return_address(0)); 1096 } 1097 1098 static void reipl_run(struct shutdown_trigger *trigger) 1099 { 1100 smp_switch_to_ipl_cpu(__reipl_run, NULL); 1101 } 1102 1103 static void reipl_block_ccw_init(struct ipl_parameter_block *ipb) 1104 { 1105 ipb->hdr.len = IPL_PARM_BLK_CCW_LEN; 1106 ipb->hdr.version = IPL_PARM_BLOCK_VERSION; 1107 ipb->hdr.blk0_len = IPL_PARM_BLK0_CCW_LEN; 1108 ipb->hdr.pbt = DIAG308_IPL_TYPE_CCW; 1109 } 1110 1111 static void reipl_block_ccw_fill_parms(struct ipl_parameter_block *ipb) 1112 { 1113 /* LOADPARM */ 1114 /* check if read scp info worked and set loadparm */ 1115 if (sclp_ipl_info.is_valid) 1116 memcpy(ipb->ipl_info.ccw.load_parm, 1117 &sclp_ipl_info.loadparm, LOADPARM_LEN); 1118 else 1119 /* read scp info failed: set empty loadparm (EBCDIC blanks) */ 1120 memset(ipb->ipl_info.ccw.load_parm, 0x40, LOADPARM_LEN); 1121 ipb->hdr.flags = DIAG308_FLAGS_LP_VALID; 1122 1123 /* VM PARM */ 1124 if (MACHINE_IS_VM && diag308_set_works && 1125 (ipl_block.ipl_info.ccw.vm_flags & DIAG308_VM_FLAGS_VP_VALID)) { 1126 1127 ipb->ipl_info.ccw.vm_flags |= DIAG308_VM_FLAGS_VP_VALID; 1128 ipb->ipl_info.ccw.vm_parm_len = 1129 ipl_block.ipl_info.ccw.vm_parm_len; 1130 memcpy(ipb->ipl_info.ccw.vm_parm, 1131 ipl_block.ipl_info.ccw.vm_parm, DIAG308_VMPARM_SIZE); 1132 } 1133 } 1134 1135 static int __init reipl_nss_init(void) 1136 { 1137 int rc; 1138 1139 if (!MACHINE_IS_VM) 1140 return 0; 1141 1142 reipl_block_nss = (void *) get_zeroed_page(GFP_KERNEL); 1143 if (!reipl_block_nss) 1144 return -ENOMEM; 1145 1146 if (!diag308_set_works) 1147 sys_reipl_nss_vmparm_attr.attr.mode = S_IRUGO; 1148 1149 rc = sysfs_create_group(&reipl_kset->kobj, &reipl_nss_attr_group); 1150 if (rc) 1151 return rc; 1152 1153 reipl_block_ccw_init(reipl_block_nss); 1154 if (ipl_info.type == IPL_TYPE_NSS) { 1155 memset(reipl_block_nss->ipl_info.ccw.nss_name, 1156 ' ', NSS_NAME_SIZE); 1157 memcpy(reipl_block_nss->ipl_info.ccw.nss_name, 1158 kernel_nss_name, strlen(kernel_nss_name)); 1159 ASCEBC(reipl_block_nss->ipl_info.ccw.nss_name, NSS_NAME_SIZE); 1160 reipl_block_nss->ipl_info.ccw.vm_flags |= 1161 DIAG308_VM_FLAGS_NSS_VALID; 1162 1163 reipl_block_ccw_fill_parms(reipl_block_nss); 1164 } 1165 1166 reipl_capabilities |= IPL_TYPE_NSS; 1167 return 0; 1168 } 1169 1170 static int __init reipl_ccw_init(void) 1171 { 1172 int rc; 1173 1174 reipl_block_ccw = (void *) get_zeroed_page(GFP_KERNEL); 1175 if (!reipl_block_ccw) 1176 return -ENOMEM; 1177 1178 if (MACHINE_IS_VM) { 1179 if (!diag308_set_works) 1180 sys_reipl_ccw_vmparm_attr.attr.mode = S_IRUGO; 1181 rc = sysfs_create_group(&reipl_kset->kobj, 1182 &reipl_ccw_attr_group_vm); 1183 } else { 1184 if(!diag308_set_works) 1185 sys_reipl_ccw_loadparm_attr.attr.mode = S_IRUGO; 1186 rc = sysfs_create_group(&reipl_kset->kobj, 1187 &reipl_ccw_attr_group_lpar); 1188 } 1189 if (rc) 1190 return rc; 1191 1192 reipl_block_ccw_init(reipl_block_ccw); 1193 if (ipl_info.type == IPL_TYPE_CCW) { 1194 reipl_block_ccw->ipl_info.ccw.devno = ipl_devno; 1195 reipl_block_ccw_fill_parms(reipl_block_ccw); 1196 } 1197 1198 reipl_capabilities |= IPL_TYPE_CCW; 1199 return 0; 1200 } 1201 1202 static int __init reipl_fcp_init(void) 1203 { 1204 int rc; 1205 1206 if (!diag308_set_works) { 1207 if (ipl_info.type == IPL_TYPE_FCP) { 1208 make_attrs_ro(reipl_fcp_attrs); 1209 sys_reipl_fcp_scp_data_attr.attr.mode = S_IRUGO; 1210 } else 1211 return 0; 1212 } 1213 1214 reipl_block_fcp = (void *) get_zeroed_page(GFP_KERNEL); 1215 if (!reipl_block_fcp) 1216 return -ENOMEM; 1217 1218 /* sysfs: create fcp kset for mixing attr group and bin attrs */ 1219 reipl_fcp_kset = kset_create_and_add(IPL_FCP_STR, NULL, 1220 &reipl_kset->kobj); 1221 if (!reipl_kset) { 1222 free_page((unsigned long) reipl_block_fcp); 1223 return -ENOMEM; 1224 } 1225 1226 rc = sysfs_create_group(&reipl_fcp_kset->kobj, &reipl_fcp_attr_group); 1227 if (rc) { 1228 kset_unregister(reipl_fcp_kset); 1229 free_page((unsigned long) reipl_block_fcp); 1230 return rc; 1231 } 1232 1233 rc = sysfs_create_bin_file(&reipl_fcp_kset->kobj, 1234 &sys_reipl_fcp_scp_data_attr); 1235 if (rc) { 1236 sysfs_remove_group(&reipl_fcp_kset->kobj, &reipl_fcp_attr_group); 1237 kset_unregister(reipl_fcp_kset); 1238 free_page((unsigned long) reipl_block_fcp); 1239 return rc; 1240 } 1241 1242 if (ipl_info.type == IPL_TYPE_FCP) 1243 memcpy(reipl_block_fcp, IPL_PARMBLOCK_START, PAGE_SIZE); 1244 else { 1245 reipl_block_fcp->hdr.len = IPL_PARM_BLK_FCP_LEN; 1246 reipl_block_fcp->hdr.version = IPL_PARM_BLOCK_VERSION; 1247 reipl_block_fcp->hdr.blk0_len = IPL_PARM_BLK0_FCP_LEN; 1248 reipl_block_fcp->hdr.pbt = DIAG308_IPL_TYPE_FCP; 1249 reipl_block_fcp->ipl_info.fcp.opt = DIAG308_IPL_OPT_IPL; 1250 } 1251 reipl_capabilities |= IPL_TYPE_FCP; 1252 return 0; 1253 } 1254 1255 static int __init reipl_init(void) 1256 { 1257 int rc; 1258 1259 reipl_kset = kset_create_and_add("reipl", NULL, firmware_kobj); 1260 if (!reipl_kset) 1261 return -ENOMEM; 1262 rc = sysfs_create_file(&reipl_kset->kobj, &reipl_type_attr.attr); 1263 if (rc) { 1264 kset_unregister(reipl_kset); 1265 return rc; 1266 } 1267 rc = reipl_ccw_init(); 1268 if (rc) 1269 return rc; 1270 rc = reipl_fcp_init(); 1271 if (rc) 1272 return rc; 1273 rc = reipl_nss_init(); 1274 if (rc) 1275 return rc; 1276 rc = reipl_set_type(ipl_info.type); 1277 if (rc) 1278 return rc; 1279 return 0; 1280 } 1281 1282 static struct shutdown_action __refdata reipl_action = { 1283 .name = SHUTDOWN_ACTION_REIPL_STR, 1284 .fn = reipl_run, 1285 .init = reipl_init, 1286 }; 1287 1288 /* 1289 * dump shutdown action: Dump Linux on shutdown. 1290 */ 1291 1292 /* FCP dump device attributes */ 1293 1294 DEFINE_IPL_ATTR_RW(dump_fcp, wwpn, "0x%016llx\n", "%016llx\n", 1295 dump_block_fcp->ipl_info.fcp.wwpn); 1296 DEFINE_IPL_ATTR_RW(dump_fcp, lun, "0x%016llx\n", "%016llx\n", 1297 dump_block_fcp->ipl_info.fcp.lun); 1298 DEFINE_IPL_ATTR_RW(dump_fcp, bootprog, "%lld\n", "%lld\n", 1299 dump_block_fcp->ipl_info.fcp.bootprog); 1300 DEFINE_IPL_ATTR_RW(dump_fcp, br_lba, "%lld\n", "%lld\n", 1301 dump_block_fcp->ipl_info.fcp.br_lba); 1302 DEFINE_IPL_ATTR_RW(dump_fcp, device, "0.0.%04llx\n", "0.0.%llx\n", 1303 dump_block_fcp->ipl_info.fcp.devno); 1304 1305 static struct attribute *dump_fcp_attrs[] = { 1306 &sys_dump_fcp_device_attr.attr, 1307 &sys_dump_fcp_wwpn_attr.attr, 1308 &sys_dump_fcp_lun_attr.attr, 1309 &sys_dump_fcp_bootprog_attr.attr, 1310 &sys_dump_fcp_br_lba_attr.attr, 1311 NULL, 1312 }; 1313 1314 static struct attribute_group dump_fcp_attr_group = { 1315 .name = IPL_FCP_STR, 1316 .attrs = dump_fcp_attrs, 1317 }; 1318 1319 /* CCW dump device attributes */ 1320 1321 DEFINE_IPL_ATTR_RW(dump_ccw, device, "0.0.%04llx\n", "0.0.%llx\n", 1322 dump_block_ccw->ipl_info.ccw.devno); 1323 1324 static struct attribute *dump_ccw_attrs[] = { 1325 &sys_dump_ccw_device_attr.attr, 1326 NULL, 1327 }; 1328 1329 static struct attribute_group dump_ccw_attr_group = { 1330 .name = IPL_CCW_STR, 1331 .attrs = dump_ccw_attrs, 1332 }; 1333 1334 /* dump type */ 1335 1336 static int dump_set_type(enum dump_type type) 1337 { 1338 if (!(dump_capabilities & type)) 1339 return -EINVAL; 1340 switch (type) { 1341 case DUMP_TYPE_CCW: 1342 if (diag308_set_works) 1343 dump_method = DUMP_METHOD_CCW_DIAG; 1344 else if (MACHINE_IS_VM) 1345 dump_method = DUMP_METHOD_CCW_VM; 1346 else 1347 dump_method = DUMP_METHOD_CCW_CIO; 1348 break; 1349 case DUMP_TYPE_FCP: 1350 dump_method = DUMP_METHOD_FCP_DIAG; 1351 break; 1352 default: 1353 dump_method = DUMP_METHOD_NONE; 1354 } 1355 dump_type = type; 1356 return 0; 1357 } 1358 1359 static ssize_t dump_type_show(struct kobject *kobj, 1360 struct kobj_attribute *attr, char *page) 1361 { 1362 return sprintf(page, "%s\n", dump_type_str(dump_type)); 1363 } 1364 1365 static ssize_t dump_type_store(struct kobject *kobj, 1366 struct kobj_attribute *attr, 1367 const char *buf, size_t len) 1368 { 1369 int rc = -EINVAL; 1370 1371 if (strncmp(buf, DUMP_NONE_STR, strlen(DUMP_NONE_STR)) == 0) 1372 rc = dump_set_type(DUMP_TYPE_NONE); 1373 else if (strncmp(buf, DUMP_CCW_STR, strlen(DUMP_CCW_STR)) == 0) 1374 rc = dump_set_type(DUMP_TYPE_CCW); 1375 else if (strncmp(buf, DUMP_FCP_STR, strlen(DUMP_FCP_STR)) == 0) 1376 rc = dump_set_type(DUMP_TYPE_FCP); 1377 return (rc != 0) ? rc : len; 1378 } 1379 1380 static struct kobj_attribute dump_type_attr = 1381 __ATTR(dump_type, 0644, dump_type_show, dump_type_store); 1382 1383 static struct kset *dump_kset; 1384 1385 static void __dump_run(void *unused) 1386 { 1387 struct ccw_dev_id devid; 1388 static char buf[100]; 1389 1390 switch (dump_method) { 1391 case DUMP_METHOD_CCW_CIO: 1392 devid.devno = dump_block_ccw->ipl_info.ccw.devno; 1393 devid.ssid = 0; 1394 reipl_ccw_dev(&devid); 1395 break; 1396 case DUMP_METHOD_CCW_VM: 1397 sprintf(buf, "STORE STATUS"); 1398 __cpcmd(buf, NULL, 0, NULL); 1399 sprintf(buf, "IPL %X", dump_block_ccw->ipl_info.ccw.devno); 1400 __cpcmd(buf, NULL, 0, NULL); 1401 break; 1402 case DUMP_METHOD_CCW_DIAG: 1403 diag308(DIAG308_SET, dump_block_ccw); 1404 diag308(DIAG308_DUMP, NULL); 1405 break; 1406 case DUMP_METHOD_FCP_DIAG: 1407 diag308(DIAG308_SET, dump_block_fcp); 1408 diag308(DIAG308_DUMP, NULL); 1409 break; 1410 default: 1411 break; 1412 } 1413 } 1414 1415 static void dump_run(struct shutdown_trigger *trigger) 1416 { 1417 if (dump_method == DUMP_METHOD_NONE) 1418 return; 1419 smp_send_stop(); 1420 smp_switch_to_ipl_cpu(__dump_run, NULL); 1421 } 1422 1423 static int __init dump_ccw_init(void) 1424 { 1425 int rc; 1426 1427 dump_block_ccw = (void *) get_zeroed_page(GFP_KERNEL); 1428 if (!dump_block_ccw) 1429 return -ENOMEM; 1430 rc = sysfs_create_group(&dump_kset->kobj, &dump_ccw_attr_group); 1431 if (rc) { 1432 free_page((unsigned long)dump_block_ccw); 1433 return rc; 1434 } 1435 dump_block_ccw->hdr.len = IPL_PARM_BLK_CCW_LEN; 1436 dump_block_ccw->hdr.version = IPL_PARM_BLOCK_VERSION; 1437 dump_block_ccw->hdr.blk0_len = IPL_PARM_BLK0_CCW_LEN; 1438 dump_block_ccw->hdr.pbt = DIAG308_IPL_TYPE_CCW; 1439 dump_capabilities |= DUMP_TYPE_CCW; 1440 return 0; 1441 } 1442 1443 static int __init dump_fcp_init(void) 1444 { 1445 int rc; 1446 1447 if (!sclp_ipl_info.has_dump) 1448 return 0; /* LDIPL DUMP is not installed */ 1449 if (!diag308_set_works) 1450 return 0; 1451 dump_block_fcp = (void *) get_zeroed_page(GFP_KERNEL); 1452 if (!dump_block_fcp) 1453 return -ENOMEM; 1454 rc = sysfs_create_group(&dump_kset->kobj, &dump_fcp_attr_group); 1455 if (rc) { 1456 free_page((unsigned long)dump_block_fcp); 1457 return rc; 1458 } 1459 dump_block_fcp->hdr.len = IPL_PARM_BLK_FCP_LEN; 1460 dump_block_fcp->hdr.version = IPL_PARM_BLOCK_VERSION; 1461 dump_block_fcp->hdr.blk0_len = IPL_PARM_BLK0_FCP_LEN; 1462 dump_block_fcp->hdr.pbt = DIAG308_IPL_TYPE_FCP; 1463 dump_block_fcp->ipl_info.fcp.opt = DIAG308_IPL_OPT_DUMP; 1464 dump_capabilities |= DUMP_TYPE_FCP; 1465 return 0; 1466 } 1467 1468 static int __init dump_init(void) 1469 { 1470 int rc; 1471 1472 dump_kset = kset_create_and_add("dump", NULL, firmware_kobj); 1473 if (!dump_kset) 1474 return -ENOMEM; 1475 rc = sysfs_create_file(&dump_kset->kobj, &dump_type_attr.attr); 1476 if (rc) { 1477 kset_unregister(dump_kset); 1478 return rc; 1479 } 1480 rc = dump_ccw_init(); 1481 if (rc) 1482 return rc; 1483 rc = dump_fcp_init(); 1484 if (rc) 1485 return rc; 1486 dump_set_type(DUMP_TYPE_NONE); 1487 return 0; 1488 } 1489 1490 static struct shutdown_action __refdata dump_action = { 1491 .name = SHUTDOWN_ACTION_DUMP_STR, 1492 .fn = dump_run, 1493 .init = dump_init, 1494 }; 1495 1496 static void dump_reipl_run(struct shutdown_trigger *trigger) 1497 { 1498 preempt_disable(); 1499 /* 1500 * Bypass dynamic address translation (DAT) when storing IPL parameter 1501 * information block address and checksum into the prefix area 1502 * (corresponding to absolute addresses 0-8191). 1503 * When enhanced DAT applies and the STE format control in one, 1504 * the absolute address is formed without prefixing. In this case a 1505 * normal store (stg/st) into the prefix area would no more match to 1506 * absolute addresses 0-8191. 1507 */ 1508 #ifdef CONFIG_64BIT 1509 asm volatile("sturg %0,%1" 1510 :: "a" ((unsigned long) reipl_block_actual), 1511 "a" (&lowcore_ptr[smp_processor_id()]->ipib)); 1512 #else 1513 asm volatile("stura %0,%1" 1514 :: "a" ((unsigned long) reipl_block_actual), 1515 "a" (&lowcore_ptr[smp_processor_id()]->ipib)); 1516 #endif 1517 asm volatile("stura %0,%1" 1518 :: "a" (csum_partial(reipl_block_actual, 1519 reipl_block_actual->hdr.len, 0)), 1520 "a" (&lowcore_ptr[smp_processor_id()]->ipib_checksum)); 1521 preempt_enable(); 1522 dump_run(trigger); 1523 } 1524 1525 static int __init dump_reipl_init(void) 1526 { 1527 if (!diag308_set_works) 1528 return -EOPNOTSUPP; 1529 else 1530 return 0; 1531 } 1532 1533 static struct shutdown_action __refdata dump_reipl_action = { 1534 .name = SHUTDOWN_ACTION_DUMP_REIPL_STR, 1535 .fn = dump_reipl_run, 1536 .init = dump_reipl_init, 1537 }; 1538 1539 /* 1540 * vmcmd shutdown action: Trigger vm command on shutdown. 1541 */ 1542 1543 static char vmcmd_on_reboot[128]; 1544 static char vmcmd_on_panic[128]; 1545 static char vmcmd_on_halt[128]; 1546 static char vmcmd_on_poff[128]; 1547 1548 DEFINE_IPL_ATTR_STR_RW(vmcmd, on_reboot, "%s\n", "%s\n", vmcmd_on_reboot); 1549 DEFINE_IPL_ATTR_STR_RW(vmcmd, on_panic, "%s\n", "%s\n", vmcmd_on_panic); 1550 DEFINE_IPL_ATTR_STR_RW(vmcmd, on_halt, "%s\n", "%s\n", vmcmd_on_halt); 1551 DEFINE_IPL_ATTR_STR_RW(vmcmd, on_poff, "%s\n", "%s\n", vmcmd_on_poff); 1552 1553 static struct attribute *vmcmd_attrs[] = { 1554 &sys_vmcmd_on_reboot_attr.attr, 1555 &sys_vmcmd_on_panic_attr.attr, 1556 &sys_vmcmd_on_halt_attr.attr, 1557 &sys_vmcmd_on_poff_attr.attr, 1558 NULL, 1559 }; 1560 1561 static struct attribute_group vmcmd_attr_group = { 1562 .attrs = vmcmd_attrs, 1563 }; 1564 1565 static struct kset *vmcmd_kset; 1566 1567 static void vmcmd_run(struct shutdown_trigger *trigger) 1568 { 1569 char *cmd, *next_cmd; 1570 1571 if (strcmp(trigger->name, ON_REIPL_STR) == 0) 1572 cmd = vmcmd_on_reboot; 1573 else if (strcmp(trigger->name, ON_PANIC_STR) == 0) 1574 cmd = vmcmd_on_panic; 1575 else if (strcmp(trigger->name, ON_HALT_STR) == 0) 1576 cmd = vmcmd_on_halt; 1577 else if (strcmp(trigger->name, ON_POFF_STR) == 0) 1578 cmd = vmcmd_on_poff; 1579 else 1580 return; 1581 1582 if (strlen(cmd) == 0) 1583 return; 1584 do { 1585 next_cmd = strchr(cmd, '\n'); 1586 if (next_cmd) { 1587 next_cmd[0] = 0; 1588 next_cmd += 1; 1589 } 1590 __cpcmd(cmd, NULL, 0, NULL); 1591 cmd = next_cmd; 1592 } while (cmd != NULL); 1593 } 1594 1595 static int vmcmd_init(void) 1596 { 1597 if (!MACHINE_IS_VM) 1598 return -EOPNOTSUPP; 1599 vmcmd_kset = kset_create_and_add("vmcmd", NULL, firmware_kobj); 1600 if (!vmcmd_kset) 1601 return -ENOMEM; 1602 return sysfs_create_group(&vmcmd_kset->kobj, &vmcmd_attr_group); 1603 } 1604 1605 static struct shutdown_action vmcmd_action = {SHUTDOWN_ACTION_VMCMD_STR, 1606 vmcmd_run, vmcmd_init}; 1607 1608 /* 1609 * stop shutdown action: Stop Linux on shutdown. 1610 */ 1611 1612 static void stop_run(struct shutdown_trigger *trigger) 1613 { 1614 if (strcmp(trigger->name, ON_PANIC_STR) == 0) 1615 disabled_wait((unsigned long) __builtin_return_address(0)); 1616 while (sigp(smp_processor_id(), sigp_stop) == sigp_busy) 1617 cpu_relax(); 1618 for (;;); 1619 } 1620 1621 static struct shutdown_action stop_action = {SHUTDOWN_ACTION_STOP_STR, 1622 stop_run, NULL}; 1623 1624 /* action list */ 1625 1626 static struct shutdown_action *shutdown_actions_list[] = { 1627 &ipl_action, &reipl_action, &dump_reipl_action, &dump_action, 1628 &vmcmd_action, &stop_action}; 1629 #define SHUTDOWN_ACTIONS_COUNT (sizeof(shutdown_actions_list) / sizeof(void *)) 1630 1631 /* 1632 * Trigger section 1633 */ 1634 1635 static struct kset *shutdown_actions_kset; 1636 1637 static int set_trigger(const char *buf, struct shutdown_trigger *trigger, 1638 size_t len) 1639 { 1640 int i; 1641 1642 for (i = 0; i < SHUTDOWN_ACTIONS_COUNT; i++) { 1643 if (sysfs_streq(buf, shutdown_actions_list[i]->name)) { 1644 if (shutdown_actions_list[i]->init_rc) { 1645 return shutdown_actions_list[i]->init_rc; 1646 } else { 1647 trigger->action = shutdown_actions_list[i]; 1648 return len; 1649 } 1650 } 1651 } 1652 return -EINVAL; 1653 } 1654 1655 /* on reipl */ 1656 1657 static struct shutdown_trigger on_reboot_trigger = {ON_REIPL_STR, 1658 &reipl_action}; 1659 1660 static ssize_t on_reboot_show(struct kobject *kobj, 1661 struct kobj_attribute *attr, char *page) 1662 { 1663 return sprintf(page, "%s\n", on_reboot_trigger.action->name); 1664 } 1665 1666 static ssize_t on_reboot_store(struct kobject *kobj, 1667 struct kobj_attribute *attr, 1668 const char *buf, size_t len) 1669 { 1670 return set_trigger(buf, &on_reboot_trigger, len); 1671 } 1672 1673 static struct kobj_attribute on_reboot_attr = 1674 __ATTR(on_reboot, 0644, on_reboot_show, on_reboot_store); 1675 1676 static void do_machine_restart(char *__unused) 1677 { 1678 smp_send_stop(); 1679 on_reboot_trigger.action->fn(&on_reboot_trigger); 1680 reipl_run(NULL); 1681 } 1682 void (*_machine_restart)(char *command) = do_machine_restart; 1683 1684 /* on panic */ 1685 1686 static struct shutdown_trigger on_panic_trigger = {ON_PANIC_STR, &stop_action}; 1687 1688 static ssize_t on_panic_show(struct kobject *kobj, 1689 struct kobj_attribute *attr, char *page) 1690 { 1691 return sprintf(page, "%s\n", on_panic_trigger.action->name); 1692 } 1693 1694 static ssize_t on_panic_store(struct kobject *kobj, 1695 struct kobj_attribute *attr, 1696 const char *buf, size_t len) 1697 { 1698 return set_trigger(buf, &on_panic_trigger, len); 1699 } 1700 1701 static struct kobj_attribute on_panic_attr = 1702 __ATTR(on_panic, 0644, on_panic_show, on_panic_store); 1703 1704 static void do_panic(void) 1705 { 1706 on_panic_trigger.action->fn(&on_panic_trigger); 1707 stop_run(&on_panic_trigger); 1708 } 1709 1710 /* on halt */ 1711 1712 static struct shutdown_trigger on_halt_trigger = {ON_HALT_STR, &stop_action}; 1713 1714 static ssize_t on_halt_show(struct kobject *kobj, 1715 struct kobj_attribute *attr, char *page) 1716 { 1717 return sprintf(page, "%s\n", on_halt_trigger.action->name); 1718 } 1719 1720 static ssize_t on_halt_store(struct kobject *kobj, 1721 struct kobj_attribute *attr, 1722 const char *buf, size_t len) 1723 { 1724 return set_trigger(buf, &on_halt_trigger, len); 1725 } 1726 1727 static struct kobj_attribute on_halt_attr = 1728 __ATTR(on_halt, 0644, on_halt_show, on_halt_store); 1729 1730 1731 static void do_machine_halt(void) 1732 { 1733 smp_send_stop(); 1734 on_halt_trigger.action->fn(&on_halt_trigger); 1735 stop_run(&on_halt_trigger); 1736 } 1737 void (*_machine_halt)(void) = do_machine_halt; 1738 1739 /* on power off */ 1740 1741 static struct shutdown_trigger on_poff_trigger = {ON_POFF_STR, &stop_action}; 1742 1743 static ssize_t on_poff_show(struct kobject *kobj, 1744 struct kobj_attribute *attr, char *page) 1745 { 1746 return sprintf(page, "%s\n", on_poff_trigger.action->name); 1747 } 1748 1749 static ssize_t on_poff_store(struct kobject *kobj, 1750 struct kobj_attribute *attr, 1751 const char *buf, size_t len) 1752 { 1753 return set_trigger(buf, &on_poff_trigger, len); 1754 } 1755 1756 static struct kobj_attribute on_poff_attr = 1757 __ATTR(on_poff, 0644, on_poff_show, on_poff_store); 1758 1759 1760 static void do_machine_power_off(void) 1761 { 1762 smp_send_stop(); 1763 on_poff_trigger.action->fn(&on_poff_trigger); 1764 stop_run(&on_poff_trigger); 1765 } 1766 void (*_machine_power_off)(void) = do_machine_power_off; 1767 1768 static void __init shutdown_triggers_init(void) 1769 { 1770 shutdown_actions_kset = kset_create_and_add("shutdown_actions", NULL, 1771 firmware_kobj); 1772 if (!shutdown_actions_kset) 1773 goto fail; 1774 if (sysfs_create_file(&shutdown_actions_kset->kobj, 1775 &on_reboot_attr.attr)) 1776 goto fail; 1777 if (sysfs_create_file(&shutdown_actions_kset->kobj, 1778 &on_panic_attr.attr)) 1779 goto fail; 1780 if (sysfs_create_file(&shutdown_actions_kset->kobj, 1781 &on_halt_attr.attr)) 1782 goto fail; 1783 if (sysfs_create_file(&shutdown_actions_kset->kobj, 1784 &on_poff_attr.attr)) 1785 goto fail; 1786 1787 return; 1788 fail: 1789 panic("shutdown_triggers_init failed\n"); 1790 } 1791 1792 static void __init shutdown_actions_init(void) 1793 { 1794 int i; 1795 1796 for (i = 0; i < SHUTDOWN_ACTIONS_COUNT; i++) { 1797 if (!shutdown_actions_list[i]->init) 1798 continue; 1799 shutdown_actions_list[i]->init_rc = 1800 shutdown_actions_list[i]->init(); 1801 } 1802 } 1803 1804 static int __init s390_ipl_init(void) 1805 { 1806 sclp_get_ipl_info(&sclp_ipl_info); 1807 shutdown_actions_init(); 1808 shutdown_triggers_init(); 1809 return 0; 1810 } 1811 1812 __initcall(s390_ipl_init); 1813 1814 static void __init strncpy_skip_quote(char *dst, char *src, int n) 1815 { 1816 int sx, dx; 1817 1818 dx = 0; 1819 for (sx = 0; src[sx] != 0; sx++) { 1820 if (src[sx] == '"') 1821 continue; 1822 dst[dx++] = src[sx]; 1823 if (dx >= n) 1824 break; 1825 } 1826 } 1827 1828 static int __init vmcmd_on_reboot_setup(char *str) 1829 { 1830 if (!MACHINE_IS_VM) 1831 return 1; 1832 strncpy_skip_quote(vmcmd_on_reboot, str, 127); 1833 vmcmd_on_reboot[127] = 0; 1834 on_reboot_trigger.action = &vmcmd_action; 1835 return 1; 1836 } 1837 __setup("vmreboot=", vmcmd_on_reboot_setup); 1838 1839 static int __init vmcmd_on_panic_setup(char *str) 1840 { 1841 if (!MACHINE_IS_VM) 1842 return 1; 1843 strncpy_skip_quote(vmcmd_on_panic, str, 127); 1844 vmcmd_on_panic[127] = 0; 1845 on_panic_trigger.action = &vmcmd_action; 1846 return 1; 1847 } 1848 __setup("vmpanic=", vmcmd_on_panic_setup); 1849 1850 static int __init vmcmd_on_halt_setup(char *str) 1851 { 1852 if (!MACHINE_IS_VM) 1853 return 1; 1854 strncpy_skip_quote(vmcmd_on_halt, str, 127); 1855 vmcmd_on_halt[127] = 0; 1856 on_halt_trigger.action = &vmcmd_action; 1857 return 1; 1858 } 1859 __setup("vmhalt=", vmcmd_on_halt_setup); 1860 1861 static int __init vmcmd_on_poff_setup(char *str) 1862 { 1863 if (!MACHINE_IS_VM) 1864 return 1; 1865 strncpy_skip_quote(vmcmd_on_poff, str, 127); 1866 vmcmd_on_poff[127] = 0; 1867 on_poff_trigger.action = &vmcmd_action; 1868 return 1; 1869 } 1870 __setup("vmpoff=", vmcmd_on_poff_setup); 1871 1872 static int on_panic_notify(struct notifier_block *self, 1873 unsigned long event, void *data) 1874 { 1875 do_panic(); 1876 return NOTIFY_OK; 1877 } 1878 1879 static struct notifier_block on_panic_nb = { 1880 .notifier_call = on_panic_notify, 1881 .priority = INT_MIN, 1882 }; 1883 1884 void __init setup_ipl(void) 1885 { 1886 ipl_info.type = get_ipl_type(); 1887 switch (ipl_info.type) { 1888 case IPL_TYPE_CCW: 1889 ipl_info.data.ccw.dev_id.devno = ipl_devno; 1890 ipl_info.data.ccw.dev_id.ssid = 0; 1891 break; 1892 case IPL_TYPE_FCP: 1893 case IPL_TYPE_FCP_DUMP: 1894 ipl_info.data.fcp.dev_id.devno = 1895 IPL_PARMBLOCK_START->ipl_info.fcp.devno; 1896 ipl_info.data.fcp.dev_id.ssid = 0; 1897 ipl_info.data.fcp.wwpn = IPL_PARMBLOCK_START->ipl_info.fcp.wwpn; 1898 ipl_info.data.fcp.lun = IPL_PARMBLOCK_START->ipl_info.fcp.lun; 1899 break; 1900 case IPL_TYPE_NSS: 1901 strncpy(ipl_info.data.nss.name, kernel_nss_name, 1902 sizeof(ipl_info.data.nss.name)); 1903 break; 1904 case IPL_TYPE_UNKNOWN: 1905 /* We have no info to copy */ 1906 break; 1907 } 1908 atomic_notifier_chain_register(&panic_notifier_list, &on_panic_nb); 1909 } 1910 1911 void __init ipl_update_parameters(void) 1912 { 1913 int rc; 1914 1915 rc = diag308(DIAG308_STORE, &ipl_block); 1916 if ((rc == DIAG308_RC_OK) || (rc == DIAG308_RC_NOCONFIG)) 1917 diag308_set_works = 1; 1918 } 1919 1920 void __init ipl_save_parameters(void) 1921 { 1922 struct cio_iplinfo iplinfo; 1923 void *src, *dst; 1924 1925 if (cio_get_iplinfo(&iplinfo)) 1926 return; 1927 1928 ipl_devno = iplinfo.devno; 1929 ipl_flags |= IPL_DEVNO_VALID; 1930 if (!iplinfo.is_qdio) 1931 return; 1932 ipl_flags |= IPL_PARMBLOCK_VALID; 1933 src = (void *)(unsigned long)S390_lowcore.ipl_parmblock_ptr; 1934 dst = (void *)IPL_PARMBLOCK_ORIGIN; 1935 memmove(dst, src, PAGE_SIZE); 1936 S390_lowcore.ipl_parmblock_ptr = IPL_PARMBLOCK_ORIGIN; 1937 } 1938 1939 static LIST_HEAD(rcall); 1940 static DEFINE_MUTEX(rcall_mutex); 1941 1942 void register_reset_call(struct reset_call *reset) 1943 { 1944 mutex_lock(&rcall_mutex); 1945 list_add(&reset->list, &rcall); 1946 mutex_unlock(&rcall_mutex); 1947 } 1948 EXPORT_SYMBOL_GPL(register_reset_call); 1949 1950 void unregister_reset_call(struct reset_call *reset) 1951 { 1952 mutex_lock(&rcall_mutex); 1953 list_del(&reset->list); 1954 mutex_unlock(&rcall_mutex); 1955 } 1956 EXPORT_SYMBOL_GPL(unregister_reset_call); 1957 1958 static void do_reset_calls(void) 1959 { 1960 struct reset_call *reset; 1961 1962 list_for_each_entry(reset, &rcall, list) 1963 reset->fn(); 1964 } 1965 1966 u32 dump_prefix_page; 1967 1968 void s390_reset_system(void) 1969 { 1970 struct _lowcore *lc; 1971 1972 lc = (struct _lowcore *)(unsigned long) store_prefix(); 1973 1974 /* Stack for interrupt/machine check handler */ 1975 lc->panic_stack = S390_lowcore.panic_stack; 1976 1977 /* Save prefix page address for dump case */ 1978 dump_prefix_page = (u32)(unsigned long) lc; 1979 1980 /* Disable prefixing */ 1981 set_prefix(0); 1982 1983 /* Disable lowcore protection */ 1984 __ctl_clear_bit(0,28); 1985 1986 /* Set new machine check handler */ 1987 S390_lowcore.mcck_new_psw.mask = psw_kernel_bits & ~PSW_MASK_MCHECK; 1988 S390_lowcore.mcck_new_psw.addr = 1989 PSW_ADDR_AMODE | (unsigned long) s390_base_mcck_handler; 1990 1991 /* Set new program check handler */ 1992 S390_lowcore.program_new_psw.mask = psw_kernel_bits & ~PSW_MASK_MCHECK; 1993 S390_lowcore.program_new_psw.addr = 1994 PSW_ADDR_AMODE | (unsigned long) s390_base_pgm_handler; 1995 1996 do_reset_calls(); 1997 } 1998 1999