On Tue, 9 Jan 2024 at 16:24, Michael Tokarev <m...@tls.msk.ru> wrote:
>
> 09.01.2024 16:52, Peter Maydell:
> ..
> > Oh, your kernel isn't an LPAE one (i.e. CONFIG_LPAE is not
> > set). That will obviously never be able to access registers
> > above the 4GB mark (though the kernel's error message in this
> > situation is a bit unhelpful and could perhaps be improved).
> > If I set CONFIG_LPAE on the non-working config it starts working.
> >
> > I think then the answer is:
> >   * if you want to use the (default) highmem setup, use an LPAE kernel
> >   * if you want to use a non-LPAE kernel, tell QEMU to avoid
> >     highmem using '-machine virt,highmem=off'
> >
> > It was just a bug that we were accidentally disabling highmem
> > for the 32-bit 'max' CPU before b8f7959f28c4f3.
>
> Wow wow wow.  So it's a pebkac bug, not qemu bug.. :)
> I didn't even know about LPAE before this email, and knew very
> little about arm stuff too.
>
> Thank you very much for your work and time!
>
> The diagnostics here is definitely.. "interesting", so to say, it's
> very "obvious" what the problem is.. from the kernel messages :)

Yeah. I don't personally have the time to try to follow up
on improving the kernel handling of this, but if anybody else
does, I think the problem is that the function __of_address_to_resource()
which fills in a 'struct resource' from a DTB entry silently
truncates over-large values when it fills in r->start and r->end
(which are of type phys_addr_t, and so only 32 bits on non-LPAE
kernels). So that function seems like a good place to put some

  if (taddr or taddr + size are above 4GB) {
      warn("resource foo is too high in the address space to use
            (did you forget to enable CONFIG_LPAE?)\n");
      return -EINVAL;
  }

type handling which would then catch this user error relatively
comprehensibly for most devices.

> And the author(s) of the tool used in debian to run arm guest (which
> triggered this issue with qemu 8.2) didn't know this thing either,
> obviously.  Also, it seems to be a little-known fact that qemu has
> highmem enabled for 32bit arm by default and that one - unlike e.g
> i386 - actually breaks system (with pci bus being unaccessible),
> while on i386 the only outcome is not all memory is available.
> That feels like unfortunate decision to enable highmem by default
> on arm in qemu 2.12.

Yeah, in retrospect the other option might have been better.
But at this late date it doesn't seem worth revisiting.

> > The linux-image-6.6.9-armmp-lpae_6.6.9-1_armhf.deb kernel
> > will probably work (though I haven't tested it).
>
> Yes, it works.  Also -machine virt,highmem=off works.  There's
> no bug per se.
>
>
> Thank you for all the findings, Peter!  Much appreciated!

No worries.

-- PMM

Reply via email to