void s390_reipl_request(void) { S390IPLState *ipl = get_ipl_device(); ipl->reipl_requested = true; qemu_system_reset_request(); }
void s390_reipl_request(void) { S390IPLState *ipl = get_ipl_device(); ipl->reipl_requested = true; qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET); }
void s390_ipl_update_diag308(IplParameterBlock *iplb) { S390IPLState *ipl = get_ipl_device(); ipl->iplb = *iplb; ipl->iplb_valid = true; }
void s390_ipl_update_diag308(IplParameterBlock *iplb) { S390IPLState *ipl = get_ipl_device(); ipl->iplb = *iplb; ipl->iplb_valid = true; ipl->netboot = is_virtio_net_device(iplb); }
IplParameterBlock *s390_ipl_get_iplb(void) { S390IPLState *ipl = get_ipl_device(); if (!ipl->iplb_valid) { return NULL; } return &ipl->iplb; }
void s390_ipl_prepare_cpu(S390CPU *cpu) { S390IPLState *ipl = get_ipl_device(); cpu->env.psw.addr = ipl->start_addr; cpu->env.psw.mask = IPL_PSW_MASK; if (!ipl->kernel || ipl->iplb_valid) { cpu->env.psw.addr = ipl->bios_start_addr; cpu->env.regs[7] = s390_update_iplstate(ipl); } }
static void s390_ipl_prepare_qipl(S390CPU *cpu) { S390IPLState *ipl = get_ipl_device(); uint8_t *addr; uint64_t len = 4096; addr = cpu_physical_memory_map(cpu->env.psa, &len, 1); if (!addr || len < QIPL_ADDRESS + sizeof(QemuIplParameters)) { error_report("Cannot set QEMU IPL parameters"); return; } memcpy(addr + QIPL_ADDRESS, &ipl->qipl, sizeof(QemuIplParameters)); cpu_physical_memory_unmap(addr, len, 1, len); }
void s390_ipl_prepare_cpu(S390CPU *cpu) { S390IPLState *ipl = get_ipl_device(); cpu->env.psw.addr = ipl->start_addr; cpu->env.psw.mask = IPL_PSW_MASK; if (!ipl->kernel || ipl->iplb_valid) { cpu->env.psw.addr = ipl->bios_start_addr; if (!ipl->iplb_valid) { ipl->iplb_valid = s390_gen_initial_iplb(ipl); } } }
static int load_netboot_image(Error **errp) { S390IPLState *ipl = get_ipl_device(); char *netboot_filename; MemoryRegion *sysmem = get_system_memory(); MemoryRegion *mr = NULL; void *ram_ptr = NULL; int img_size = -1; mr = memory_region_find(sysmem, 0, 1).mr; if (!mr) { error_setg(errp, "Failed to find memory region at address 0"); return -1; } ram_ptr = memory_region_get_ram_ptr(mr); if (!ram_ptr) { error_setg(errp, "No RAM found"); goto unref_mr; } netboot_filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, ipl->netboot_fw); if (netboot_filename == NULL) { error_setg(errp, "Could not find network bootloader '%s'", ipl->netboot_fw); goto unref_mr; } img_size = load_elf_ram(netboot_filename, NULL, NULL, &ipl->start_addr, NULL, NULL, 1, EM_S390, 0, 0, NULL, false); if (img_size < 0) { img_size = load_image_size(netboot_filename, ram_ptr, ram_size); ipl->start_addr = KERN_IMAGE_START; } if (img_size < 0) { error_setg(errp, "Failed to load network bootloader"); } g_free(netboot_filename); unref_mr: memory_region_unref(mr); return img_size; }
void s390_reipl_request(void) { S390IPLState *ipl = get_ipl_device(); ipl->reipl_requested = true; if (ipl->iplb_valid && !ipl->netboot && ipl->iplb.pbt == S390_IPL_TYPE_CCW && is_virtio_scsi_device(&ipl->iplb)) { CcwDevice *ccw_dev = s390_get_ccw_device(get_boot_device(0)); if (ccw_dev && cpu_to_be16(ccw_dev->sch->devno) == ipl->iplb.ccw.devno && (ccw_dev->sch->ssid & 3) == ipl->iplb.ccw.ssid) { /* * this is the original boot device's SCSI * so restore IPL parameter info from it */ ipl->iplb_valid = s390_gen_initial_iplb(ipl); } } qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET); }
void s390_ipl_prepare_cpu(S390CPU *cpu) { S390IPLState *ipl = get_ipl_device(); Error *err = NULL; cpu->env.psw.addr = ipl->start_addr; cpu->env.psw.mask = IPL_PSW_MASK; if (!ipl->kernel || ipl->iplb_valid) { cpu->env.psw.addr = ipl->bios_start_addr; if (!ipl->iplb_valid) { ipl->iplb_valid = s390_gen_initial_iplb(ipl); } } if (ipl->netboot) { if (load_netboot_image(&err) < 0) { error_report_err(err); vm_stop(RUN_STATE_INTERNAL_ERROR); } ipl->qipl.netboot_start_addr = cpu_to_be64(ipl->start_addr); } s390_ipl_set_boot_menu(ipl); s390_ipl_prepare_qipl(cpu); }