Hi Michael.

Thanks for picking up this issue. I have been working
with Jesus on this.

m31 is semantically the same as the m32 option.


The m31 option allows for 32 bit addressing and that is confusing since the m31 option in S390 would mean 2 GiB space addressing

Indeed that's exactly what it means, and what it's supposed to mean. On s390, in AMODE(31) the toplevel bit of an (32bit) address is either ignored or an indicator to switch back to 24bit addresses from the s360 times. Either way that leaves 31 bits to generate the virtual address. On s390 you indeed have a 2GB address space, not more.

He is using z/Arch and AM64.

But building with -m31.

Code used:

    volatile uint64_t *gib_test = (volatile uint64_t *)0x7FFFFFFF;
    memset(gib_test, 1, 4096);


Hercules dump:

r 0x7FFFFFFF-0x800001FF
R:000000007FFFFFFF:K:06=01 .

I'm not sure what you believe to have demonstrated here. The (virtual or physical) address 0x7FFFFFFF is either (in AMODE(24)) equivalent to 0x00ffffff or to 0xffffffff (in AMODE(31)), either way, the top byte of the addressable range ...

I don't think that's what Hercules does for a real
memory display - it will instead say out of range.
But it doesn't matter, because we're using
64-bit Hercules with 4 GiB of memory and it doesn't
matter what the AMODE happens to be at any moment
in time, what is important is what is in that 4 GiB of
memory.

The -mXX options are supposed to reflect the address space's size, not the size of the general purpose registers. An option that reflect AMODE(24) would also be called -m24, despite the registers still being 32bit in size.

The code generated by -m24 would be identical to
code generated by -m31 which would be identical to
code generated by -m32.

Why can't we just have a normal -m32 and accept -m31
and maybe -m24 too, and flag them as "obsolete"?

Thanks. Paul.

Reply via email to