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;
|
ReadStorageElementInfo *storage_info = (ReadStorageElementInfo *) sccb;
|
||||||
sclpMemoryHotplugDev *mhd = get_sclp_memory_hotplug_dev();
|
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) {
|
if ((ram_size >> mhd->increment_size) >= 0x10000) {
|
||||||
sccb->h.response_code = cpu_to_be16(SCLP_RC_SCCB_BOUNDARY_VIOLATION);
|
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;
|
ReadStorageElementInfo *storage_info = (ReadStorageElementInfo *) sccb;
|
||||||
sclpMemoryHotplugDev *mhd = get_sclp_memory_hotplug_dev();
|
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) {
|
if ((mhd->standby_mem_size >> mhd->increment_size) >= 0x10000) {
|
||||||
sccb->h.response_code = cpu_to_be16(SCLP_RC_SCCB_BOUNDARY_VIOLATION);
|
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;
|
AttachStorageElement *attach_info = (AttachStorageElement *) sccb;
|
||||||
sclpMemoryHotplugDev *mhd = get_sclp_memory_hotplug_dev();
|
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) {
|
if (element != 1) {
|
||||||
sccb->h.response_code = cpu_to_be16(SCLP_RC_INVALID_SCLP_COMMAND);
|
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;
|
uint64_t this_subregion_size;
|
||||||
AssignStorage *assign_info = (AssignStorage *) sccb;
|
AssignStorage *assign_info = (AssignStorage *) sccb;
|
||||||
sclpMemoryHotplugDev *mhd = get_sclp_memory_hotplug_dev();
|
sclpMemoryHotplugDev *mhd = get_sclp_memory_hotplug_dev();
|
||||||
assert(mhd);
|
ram_addr_t assign_addr;
|
||||||
ram_addr_t assign_addr = (assign_info->rn - 1) * mhd->rzm;
|
|
||||||
MemoryRegion *sysmem = get_system_memory();
|
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) &&
|
if ((assign_addr % MEM_SECTION_SIZE == 0) &&
|
||||||
(assign_addr >= mhd->padded_ram_size)) {
|
(assign_addr >= mhd->padded_ram_size)) {
|
||||||
/* Re-use existing memory region if found */
|
/* Re-use existing memory region if found */
|
||||||
|
@ -255,10 +269,15 @@ static void unassign_storage(SCLPDevice *sclp, SCCB *sccb)
|
||||||
MemoryRegion *mr = NULL;
|
MemoryRegion *mr = NULL;
|
||||||
AssignStorage *assign_info = (AssignStorage *) sccb;
|
AssignStorage *assign_info = (AssignStorage *) sccb;
|
||||||
sclpMemoryHotplugDev *mhd = get_sclp_memory_hotplug_dev();
|
sclpMemoryHotplugDev *mhd = get_sclp_memory_hotplug_dev();
|
||||||
assert(mhd);
|
ram_addr_t unassign_addr;
|
||||||
ram_addr_t unassign_addr = (assign_info->rn - 1) * mhd->rzm;
|
|
||||||
MemoryRegion *sysmem = get_system_memory();
|
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 the addr is a multiple of 256 MB */
|
||||||
if ((unassign_addr % MEM_SECTION_SIZE == 0) &&
|
if ((unassign_addr % MEM_SECTION_SIZE == 0) &&
|
||||||
(unassign_addr >= mhd->padded_ram_size)) {
|
(unassign_addr >= mhd->padded_ram_size)) {
|
||||||
|
|
Loading…
Reference in New Issue