mirror of https://gitee.com/openkylin/qemu.git
s390/sclp: ignore memory hotplug operations if it is disabled
If no memory hotplug device was created, the sclp command facility is not exposed (SCLP_FC_ASSIGN_ATTACH_READ_STOR). We therefore have no memory hotplug and should correctly report SCLP_RC_INVALID_SCLP_COMMAND if any such command is executed. This gets rid of these ugly asserts that could have been triggered for the s390-virtio machine. Reviewed-by: Matthew Rosato <mjrosato@linux.vnet.ibm.com> Signed-off-by: David Hildenbrand <dahi@linux.vnet.ibm.com> Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
This commit is contained in:
parent
2998ffee24
commit
b02ef3d92b
|
@ -130,7 +130,10 @@ static void read_storage_element0_info(SCLPDevice *sclp, SCCB *sccb)
|
|||
ReadStorageElementInfo *storage_info = (ReadStorageElementInfo *) sccb;
|
||||
sclpMemoryHotplugDev *mhd = get_sclp_memory_hotplug_dev();
|
||||
|
||||
assert(mhd);
|
||||
if (!mhd) {
|
||||
sccb->h.response_code = cpu_to_be16(SCLP_RC_INVALID_SCLP_COMMAND);
|
||||
return;
|
||||
}
|
||||
|
||||
if ((ram_size >> mhd->increment_size) >= 0x10000) {
|
||||
sccb->h.response_code = cpu_to_be16(SCLP_RC_SCCB_BOUNDARY_VIOLATION);
|
||||
|
@ -154,7 +157,10 @@ static void read_storage_element1_info(SCLPDevice *sclp, SCCB *sccb)
|
|||
ReadStorageElementInfo *storage_info = (ReadStorageElementInfo *) sccb;
|
||||
sclpMemoryHotplugDev *mhd = get_sclp_memory_hotplug_dev();
|
||||
|
||||
assert(mhd);
|
||||
if (!mhd) {
|
||||
sccb->h.response_code = cpu_to_be16(SCLP_RC_INVALID_SCLP_COMMAND);
|
||||
return;
|
||||
}
|
||||
|
||||
if ((mhd->standby_mem_size >> mhd->increment_size) >= 0x10000) {
|
||||
sccb->h.response_code = cpu_to_be16(SCLP_RC_SCCB_BOUNDARY_VIOLATION);
|
||||
|
@ -177,7 +183,10 @@ static void attach_storage_element(SCLPDevice *sclp, SCCB *sccb,
|
|||
AttachStorageElement *attach_info = (AttachStorageElement *) sccb;
|
||||
sclpMemoryHotplugDev *mhd = get_sclp_memory_hotplug_dev();
|
||||
|
||||
assert(mhd);
|
||||
if (!mhd) {
|
||||
sccb->h.response_code = cpu_to_be16(SCLP_RC_INVALID_SCLP_COMMAND);
|
||||
return;
|
||||
}
|
||||
|
||||
if (element != 1) {
|
||||
sccb->h.response_code = cpu_to_be16(SCLP_RC_INVALID_SCLP_COMMAND);
|
||||
|
@ -201,10 +210,15 @@ static void assign_storage(SCLPDevice *sclp, SCCB *sccb)
|
|||
uint64_t this_subregion_size;
|
||||
AssignStorage *assign_info = (AssignStorage *) sccb;
|
||||
sclpMemoryHotplugDev *mhd = get_sclp_memory_hotplug_dev();
|
||||
assert(mhd);
|
||||
ram_addr_t assign_addr = (assign_info->rn - 1) * mhd->rzm;
|
||||
ram_addr_t assign_addr;
|
||||
MemoryRegion *sysmem = get_system_memory();
|
||||
|
||||
if (!mhd) {
|
||||
sccb->h.response_code = cpu_to_be16(SCLP_RC_INVALID_SCLP_COMMAND);
|
||||
return;
|
||||
}
|
||||
assign_addr = (assign_info->rn - 1) * mhd->rzm;
|
||||
|
||||
if ((assign_addr % MEM_SECTION_SIZE == 0) &&
|
||||
(assign_addr >= mhd->padded_ram_size)) {
|
||||
/* Re-use existing memory region if found */
|
||||
|
@ -255,10 +269,15 @@ static void unassign_storage(SCLPDevice *sclp, SCCB *sccb)
|
|||
MemoryRegion *mr = NULL;
|
||||
AssignStorage *assign_info = (AssignStorage *) sccb;
|
||||
sclpMemoryHotplugDev *mhd = get_sclp_memory_hotplug_dev();
|
||||
assert(mhd);
|
||||
ram_addr_t unassign_addr = (assign_info->rn - 1) * mhd->rzm;
|
||||
ram_addr_t unassign_addr;
|
||||
MemoryRegion *sysmem = get_system_memory();
|
||||
|
||||
if (!mhd) {
|
||||
sccb->h.response_code = cpu_to_be16(SCLP_RC_INVALID_SCLP_COMMAND);
|
||||
return;
|
||||
}
|
||||
unassign_addr = (assign_info->rn - 1) * mhd->rzm;
|
||||
|
||||
/* if the addr is a multiple of 256 MB */
|
||||
if ((unassign_addr % MEM_SECTION_SIZE == 0) &&
|
||||
(unassign_addr >= mhd->padded_ram_size)) {
|
||||
|
|
Loading…
Reference in New Issue