qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PatchV2] s390x: fix memory detection for guests > 64GB


From: Alexander Graf
Subject: Re: [Qemu-devel] [PatchV2] s390x: fix memory detection for guests > 64GB
Date: Thu, 12 May 2011 09:55:00 +0200

On 12.05.2011, at 09:50, Christian Borntraeger wrote:

> the s390 memory detection has a 16bit field that specifies the amount of
> increments. This patch adopts the memory size to always fit into that
> scheme. This also fixes virtio detection for these guests, since the 
> descriptor page is located after the main memory.
> 
> Signed-off-by: Christian Borntraeger <address@hidden>
> 
> ---
> target-s390x/op_helper.c |    8 ++++++--
> vl.c                     |   11 +++++++++++
> 2 files changed, 17 insertions(+), 2 deletions(-)
> 
> Index: b/target-s390x/op_helper.c
> ===================================================================
> --- a/target-s390x/op_helper.c
> +++ b/target-s390x/op_helper.c
> @@ -2361,6 +2361,7 @@ static void ext_interrupt(CPUState *env,
> int sclp_service_call(CPUState *env, uint32_t sccb, uint64_t code)
> {
>     int r = 0;
> +    int shift = 0;
> 
> #ifdef DEBUG_HELPER
>     printf("sclp(0x%x, 0x%" PRIx64 ")\n", sccb, code);
> @@ -2375,8 +2376,11 @@ int sclp_service_call(CPUState *env, uin
>     switch(code) {
>         case SCLP_CMDW_READ_SCP_INFO:
>         case SCLP_CMDW_READ_SCP_INFO_FORCED:
> -            stw_phys(sccb + SCP_MEM_CODE, ram_size >> 20);
> -            stb_phys(sccb + SCP_INCREMENT, 1);
> +            while ((ram_size >> (20 + shift)) > 65535) {
> +                shift++;
> +            }
> +            stw_phys(sccb + SCP_MEM_CODE, ram_size >> (20 + shift));
> +            stb_phys(sccb + SCP_INCREMENT, 1 << shift);
>             stw_phys(sccb + SCP_RESPONSE_CODE, 0x10);
> 
>             if (kvm_enabled()) {
> Index: b/vl.c
> ===================================================================
> --- a/vl.c
> +++ b/vl.c
> @@ -2962,6 +2962,17 @@ int main(int argc, char **argv, char **e
>     if (ram_size == 0)
>         ram_size = DEFAULT_RAM_SIZE * 1024 * 1024;
> 
> +    /* s390x ram size detection needs a 16bit multiplier + an increment. So
> +       guests > 64GB can be specified in 2MB steps etc */
> +    if (strstr(machine->name, "s390")) {
> +        int shift = 0;
> +
> +        while ((ram_size >> (20 + shift)) > 65535) {
> +            shift++;
> +        }
> +        ram_size = ram_size >> (20 + shift) << (20 + shift);

This one really belongs to hw/s390-virtio.c. Just move the same code to 
s390_init there and it should work out. The less hacks we can have in generic 
code, the better :).


Alex




reply via email to

[Prev in Thread] Current Thread [Next in Thread]