mirror of
https://github.com/xemu-project/xemu.git
synced 2025-02-04 02:56:21 +00:00
- fix cpu number reporting in the stsi 3.2.2 block for kvm
- fix migration for old machines with odd ram sizes -----BEGIN PGP SIGNATURE----- iQJGBAABCAAwFiEEw9DWbcNiT/aowBjO3s9rk8bwL68FAl6G/aoSHGNvaHVja0By ZWRoYXQuY29tAAoJEN7Pa5PG8C+vm1cQAKOa3GS6l61yHhRMYc0RkhK12iOnAkpX FRFSob8vY5WXnfRke2peVQnRt8nqzKFSVzYUai55k/qX7XgmEFe6HRX1sMNV6Gx+ jBnucJUgvOYQR5gfqvl20oxlUMC9aXmdLZS+Bb4wCcunfdQieyIn68sJevxBUZr5 43nO3eLqU4Cx39I3C4BkcuoWddTCiMaYX0FOAgI1HyPuuoez5yG/kTTESJyrWGgn I0pLVwP4ouDigbyc5T83wlK/pa3u4uJvjAq+pR6wVKQcVj9Zc0Vunivil0h5s1dH dQEjH87oeGRvcY3oTVXfEBFB2+kQfsFMh4VTVpSZGbePGDYqupySVAXwnCdqVNwk HKLICzP8jbK0B/e5oqjMXAa74kXXpktL7/WXmEe50LZPxlxLgXY/emLI5+DM5zsv XYy95nWHaH0e4xpXACrGSSwOwnmMpj64KxWqi2RJeTmONDVwGUQA/goxuhQ0YPRL 8XjhIkYeKVCaTVHauFvrMzQuN2IntadiyJnSum5jCaR6G0T4VH0ni4J+9tr8296E cUr1tJYVCgBUYkE0bLIEo5OlL+1INg3EfmIQ4dWo7NKVNe8pygP+54G8jH6LSLIN bY9rf/JptcsBZVMSiakteFL7FoBE+zWz6BLfDPoQpDSYMkG/g2NlEJ6Kknt47vet uoPSDzdjrMdw =XPeE -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/cohuck/tags/s390x-20200403' into staging - fix cpu number reporting in the stsi 3.2.2 block for kvm - fix migration for old machines with odd ram sizes # gpg: Signature made Fri 03 Apr 2020 10:11:06 BST # gpg: using RSA key C3D0D66DC3624FF6A8C018CEDECF6B93C6F02FAF # gpg: issuer "cohuck@redhat.com" # gpg: Good signature from "Cornelia Huck <conny@cornelia-huck.de>" [marginal] # gpg: aka "Cornelia Huck <huckc@linux.vnet.ibm.com>" [full] # gpg: aka "Cornelia Huck <cornelia.huck@de.ibm.com>" [full] # gpg: aka "Cornelia Huck <cohuck@kernel.org>" [marginal] # gpg: aka "Cornelia Huck <cohuck@redhat.com>" [marginal] # Primary key fingerprint: C3D0 D66D C362 4FF6 A8C0 18CE DECF 6B93 C6F0 2FAF * remotes/cohuck/tags/s390x-20200403: vl/s390x: fixup ram sizes for compat machines s390x: kvm: Fix number of cpu reports for stsi 3.2.2 Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
64a3b4d53d
@ -176,7 +176,7 @@ static void qemu_s390_skeys_init(Object *obj)
|
||||
QEMUS390SKeysState *skeys = QEMU_S390_SKEYS(obj);
|
||||
MachineState *machine = MACHINE(qdev_get_machine());
|
||||
|
||||
skeys->key_count = machine->maxram_size / TARGET_PAGE_SIZE;
|
||||
skeys->key_count = machine->ram_size / TARGET_PAGE_SIZE;
|
||||
skeys->keydata = g_malloc0(skeys->key_count);
|
||||
}
|
||||
|
||||
|
@ -85,7 +85,7 @@ static int kvm_s390_stattrib_set_stattr(S390StAttribState *sa,
|
||||
{
|
||||
KVMS390StAttribState *sas = KVM_S390_STATTRIB(sa);
|
||||
MachineState *machine = MACHINE(qdev_get_machine());
|
||||
unsigned long max = machine->maxram_size / TARGET_PAGE_SIZE;
|
||||
unsigned long max = machine->ram_size / TARGET_PAGE_SIZE;
|
||||
|
||||
if (start_gfn + count > max) {
|
||||
error_report("Out of memory bounds when setting storage attributes");
|
||||
@ -104,7 +104,7 @@ static void kvm_s390_stattrib_synchronize(S390StAttribState *sa)
|
||||
{
|
||||
KVMS390StAttribState *sas = KVM_S390_STATTRIB(sa);
|
||||
MachineState *machine = MACHINE(qdev_get_machine());
|
||||
unsigned long max = machine->maxram_size / TARGET_PAGE_SIZE;
|
||||
unsigned long max = machine->ram_size / TARGET_PAGE_SIZE;
|
||||
/* We do not need to reach the maximum buffer size allowed */
|
||||
unsigned long cx, len = KVM_S390_SKEYS_MAX / 2;
|
||||
int r;
|
||||
|
@ -26,6 +26,7 @@
|
||||
#include "qemu/ctype.h"
|
||||
#include "qemu/error-report.h"
|
||||
#include "qemu/option.h"
|
||||
#include "qemu/qemu-print.h"
|
||||
#include "s390-pci-bus.h"
|
||||
#include "sysemu/reset.h"
|
||||
#include "hw/s390x/storage-keys.h"
|
||||
@ -439,6 +440,26 @@ static void s390_nmi(NMIState *n, int cpu_index, Error **errp)
|
||||
s390_cpu_restart(S390_CPU(cs));
|
||||
}
|
||||
|
||||
static ram_addr_t s390_fixup_ram_size(ram_addr_t sz)
|
||||
{
|
||||
/* same logic as in sclp.c */
|
||||
int increment_size = 20;
|
||||
ram_addr_t newsz;
|
||||
|
||||
while ((sz >> increment_size) > MAX_STORAGE_INCREMENTS) {
|
||||
increment_size++;
|
||||
}
|
||||
newsz = sz >> increment_size << increment_size;
|
||||
|
||||
if (sz != newsz) {
|
||||
qemu_printf("Ram size %" PRIu64 "MB was fixed up to %" PRIu64
|
||||
"MB to match machine restrictions. Consider updating "
|
||||
"the guest definition.\n", (uint64_t) (sz / MiB),
|
||||
(uint64_t) (newsz / MiB));
|
||||
}
|
||||
return newsz;
|
||||
}
|
||||
|
||||
static void ccw_machine_class_init(ObjectClass *oc, void *data)
|
||||
{
|
||||
MachineClass *mc = MACHINE_CLASS(oc);
|
||||
@ -668,6 +689,7 @@ static void ccw_machine_4_2_instance_options(MachineState *machine)
|
||||
static void ccw_machine_4_2_class_options(MachineClass *mc)
|
||||
{
|
||||
ccw_machine_5_0_class_options(mc);
|
||||
mc->fixup_ram_size = s390_fixup_ram_size;
|
||||
compat_props_add(mc->compat_props, hw_compat_4_2, hw_compat_4_2_len);
|
||||
}
|
||||
DEFINE_CCW_MACHINE(4_2, "4.2", false);
|
||||
|
@ -327,27 +327,20 @@ out:
|
||||
static void sclp_memory_init(SCLPDevice *sclp)
|
||||
{
|
||||
MachineState *machine = MACHINE(qdev_get_machine());
|
||||
MachineClass *machine_class = MACHINE_GET_CLASS(qdev_get_machine());
|
||||
ram_addr_t initial_mem = machine->ram_size;
|
||||
int increment_size = 20;
|
||||
|
||||
/* The storage increment size is a multiple of 1M and is a power of 2.
|
||||
* The number of storage increments must be MAX_STORAGE_INCREMENTS or fewer.
|
||||
* For some machine types, the number of storage increments must be
|
||||
* MAX_STORAGE_INCREMENTS or fewer.
|
||||
* The variable 'increment_size' is an exponent of 2 that can be
|
||||
* used to calculate the size (in bytes) of an increment. */
|
||||
while ((initial_mem >> increment_size) > MAX_STORAGE_INCREMENTS) {
|
||||
while (machine_class->fixup_ram_size != NULL &&
|
||||
(initial_mem >> increment_size) > MAX_STORAGE_INCREMENTS) {
|
||||
increment_size++;
|
||||
}
|
||||
sclp->increment_size = increment_size;
|
||||
|
||||
/* The core memory area needs to be aligned with the increment size.
|
||||
* In effect, this can cause the user-specified memory size to be rounded
|
||||
* down to align with the nearest increment boundary. */
|
||||
initial_mem = initial_mem >> increment_size << increment_size;
|
||||
|
||||
machine->ram_size = initial_mem;
|
||||
machine->maxram_size = initial_mem;
|
||||
/* let's propagate the changed ram size into the global variable. */
|
||||
ram_size = initial_mem;
|
||||
}
|
||||
|
||||
static void sclp_init(Object *obj)
|
||||
|
@ -152,6 +152,12 @@ typedef struct {
|
||||
* It also will be used as a way to optin into "-m" option support.
|
||||
* If it's not set by board, '-m' will be ignored and generic code will
|
||||
* not create default RAM MemoryRegion.
|
||||
* @fixup_ram_size:
|
||||
* Amends user provided ram size (with -m option) using machine
|
||||
* specific algorithm. To be used by old machine types for compat
|
||||
* purposes only.
|
||||
* Applies only to default memory backend, i.e., explicit memory backend
|
||||
* wasn't used.
|
||||
*/
|
||||
struct MachineClass {
|
||||
/*< private >*/
|
||||
@ -218,6 +224,7 @@ struct MachineClass {
|
||||
unsigned cpu_index);
|
||||
const CPUArchIdList *(*possible_cpu_arch_ids)(MachineState *machine);
|
||||
int64_t (*get_default_cpu_node_id)(const MachineState *ms, int idx);
|
||||
ram_addr_t (*fixup_ram_size)(ram_addr_t size);
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -2600,6 +2600,9 @@ static bool set_memory_options(uint64_t *ram_slots, ram_addr_t *maxram_size,
|
||||
}
|
||||
|
||||
sz = QEMU_ALIGN_UP(sz, 8192);
|
||||
if (mc->fixup_ram_size) {
|
||||
sz = mc->fixup_ram_size(sz);
|
||||
}
|
||||
ram_size = sz;
|
||||
if (ram_size != sz) {
|
||||
error_report("ram size too large");
|
||||
|
@ -1768,8 +1768,10 @@ static int handle_tsch(S390CPU *cpu)
|
||||
|
||||
static void insert_stsi_3_2_2(S390CPU *cpu, __u64 addr, uint8_t ar)
|
||||
{
|
||||
const MachineState *ms = MACHINE(qdev_get_machine());
|
||||
uint16_t conf_cpus = 0, reserved_cpus = 0;
|
||||
SysIB_322 sysib;
|
||||
int del;
|
||||
int del, i;
|
||||
|
||||
if (s390_cpu_virt_mem_read(cpu, addr, ar, &sysib, sizeof(sysib))) {
|
||||
return;
|
||||
@ -1789,6 +1791,19 @@ static void insert_stsi_3_2_2(S390CPU *cpu, __u64 addr, uint8_t ar)
|
||||
memset(sysib.ext_names[del], 0,
|
||||
sizeof(sysib.ext_names[0]) * (sysib.count - del));
|
||||
}
|
||||
|
||||
/* count the cpus and split them into configured and reserved ones */
|
||||
for (i = 0; i < ms->possible_cpus->len; i++) {
|
||||
if (ms->possible_cpus->cpus[i].cpu) {
|
||||
conf_cpus++;
|
||||
} else {
|
||||
reserved_cpus++;
|
||||
}
|
||||
}
|
||||
sysib.vm[0].total_cpus = conf_cpus + reserved_cpus;
|
||||
sysib.vm[0].conf_cpus = conf_cpus;
|
||||
sysib.vm[0].reserved_cpus = reserved_cpus;
|
||||
|
||||
/* Insert short machine name in EBCDIC, padded with blanks */
|
||||
if (qemu_name) {
|
||||
memset(sysib.vm[0].name, 0x40, sizeof(sysib.vm[0].name));
|
||||
|
Loading…
x
Reference in New Issue
Block a user