On Sun, Sep 14, 2025 at 2:17 PM Paul Edwards via Gcc <gcc@gcc.gnu.org> wrote:
> There is a 32-bit target of gcc, can't remember what it is > called (x32?), that uses 32-bit instructions that work > under x64. > x32 uses 32-bit pointers in x86-64, not 32-bit instructions. For that to actually work, the x64 system will need to be > cooperative, and map (using virtual memory) the 4 GiB > to 8 GiB region onto the 0-4 GiB region so that negative > indexes still "wrap". > x32 has no negative index. It uses 0x67 address prefix to truncate addresses to 32 bits. > > And if that "x32" executable were to be run on an ARM64 > Linux system using qemu-x32 (if it existed) - and note - this > is qemu user, not qemu-system-* - then the ARM64 system > would also need to be cooperative (or qemu would - whose > responsibility is it?) to also have that 32-bit wrapping. > > How was this issue solved? > > I have the same situation with qemu-s390x. For whatever > reason, there is no qemu-s390 shipped. I have tools (the > linker pdld) that will force my 32-bit executable to be > ELF64, and it all works fine - under both qemu user and > system running real z/Linux - so long as I don't have any > negative indexes. > > Negative indexes aren't that common, so a lot of code > runs. But negative indexes aren't non-existent, so some > applications have failed, and I need to know how the > problem was solved. > > Note that this is a general thing in computer science. I > don't know a specific system, but if there was one that > allowed both 16-bit and 32-bit instructions to work > without mode-switching, then if a 32-bit OS has > activated virtual memory it should ideally map the > 64k - 128k region to 0-64k to allow 16-bit programs to > be loaded in the first 64k of the virtual memory space > and still use negative indexes. > > Perhaps ideally systems should all be like s390x > (aka z/Arch) and allow 32-bit and 64-bit code to run > without mode changes. > > Note that mode changes is a different concept from > address masking (although there is some overlap). > There is effectively no address masking being used > for 32-bit programs running as AM64. AM64 is > effectively "no masking of address bits" - the same > as AM32 would be. The 32-bit executables with 32-bit > general purpose registers will run regardless of what > address masking is being done, e.g. AM32 like the > S360/67, AM31 like S/370XA and above, and AM24 > like S/370 and most of the below. Plus emulators of > any of the above, or similar. > > Or rather - they can run, so long as you don't attempt > to store data in any of the bits you are expecting to > be masked. THAT was the issue all along - culture. > > BFN. Paul. > -- H.J.