On Sun, May 23, 2021 at 07:09:26PM +0200, BALATON Zoltan wrote:
On Sun, 23 May 2021, BALATON Zoltan wrote:
On Sun, 23 May 2021, Alexey Kardashevskiy wrote:
One thing to note about PCI is that normally I think the client
expects the firmware to do PCI probing and SLOF does it. But VOF
does not and Linux scans PCI bus(es) itself. Might be a problem for
you kernel.
I'm not sure what info does MorphOS get from the device tree and what it
probes itself but I think it may at least need device ids and info about
the PCI bus to be able to access the config regs, after that it should
set the devices up hopefully. I could add these from the board code to
device tree so VOF does not need to do anything about it. However I'm
not getting to that point yet because it crashes on something that it's
missing and couldn't yet find out what is that.
I'd like to get Linux working now as that would be enough to test this
and then if for MorphOS we still need a ROM it's not a problem if at
least we can boot Linux without the original firmware. But I can't make
Linux open a serial console and I don't know what it needs for that. Do
you happen to know? I've looked at the sources in Linux/arch/powerpc but
not sure how it would find and open a serial port on pegasos2. It seems
to work with the board firmware and now I can get it to boot with VOF
but then it does not open serial so it probably needs something in the
device tree or expects the firmware to set something up that we should
add in pegasos2.c when using VOF.
I've now found that Linux uses rtas methods read-pci-config and
write-pci-config for PCI access on pegasos2 so this means that we'll
probably need rtas too (I hoped we could get away without it if it were only
used for shutdown/reboot or so but seems Linux needs it for PCI as well and
does not scan the bus and won't find some devices without it).
Yes, definitely sounds like you'll need an RTAS implementation.
While VOF can do rtas, this causes a problem with the hypercall method using
sc 1 that goes through vhyp but trips the assert in ppc_store_sdr1() so
cannot work after guest is past quiesce.
So the question is why is that
assert there
Ah.. right. So, vhyp was designed for the PAPR use case, where we
want to model the CPU when it's in supervisor and user mode, but not
when it's in hypervisor mode. We want qemu to mimic the behaviour of
the hypervisor, rather than attempting to actually execute hypervisor
code in the virtual CPU.
On systems that have a hypervisor mode, SDR1 is hypervisor privileged,
so it makes no sense for the guest to attempt to set it. That should
be caught by the general SPR code and turned into a 0x700, hence the
assert() if we somehow reach ppc_store_sdr1().
So, we are seeing a problem here because you want the 'sc 1'
interception of vhyp, but not the rest of the stuff that goes with it.
and would using sc 1 for hypercalls on pegasos2 cause other
problems later even if the assert could be removed?
At least in the short term, I think you probably can remove the
assert. In your case the 'sc 1' calls aren't truly to a hypervisor,
but a special case escape to qemu for the firmware emulation. I think
it's unlikely to cause problems later, because nothing on a 32-bit
system should be attempting an 'sc 1'. The only thing I can think of
that would fail is some test case which explicitly verified that 'sc
1' triggered a 0x700 (SIGILL from userspace).
Can somebody who knows
more about it explain this please? If this cannot be resolved then we may
need a different hypercall method on pegasos2 (I've considered MOL OSI or
are there other options? I may use some advice from people who know it
better, especially the possible interaction with KVM later as the long term
goal with pegasos2 is to be able to run with KVM on PPC hardware
eventually.)
Right, you might need an alternative method eventually. Really any
illegal instruction for your cpu is a possible candidate. Bear in
mind that this is *not* truly a hypercall interface, instead it's
something we're special casing for the purposes of faking the
firmware.
The "attn" instruction used on BookE might be a reasonable candidate
(assuming it doesn't conflict with something on 32-bit BookS) - that's
often used for things like signalling the attention of hardware
debuggers, and this is somewhat akin.
Mostly it's just a matter of working out what would be least messy to
intercept in the TCG instruction decoding path.
But this also means that if that assert cannot be dropped or
there may be other problems with sc 1 hypercalls then we maybe cannot have
the same vof.bin and we'll need a separate version that I would like to
avoid if possible so if there's a simple way to keep it working or make
vof.bin use alternate hypercall method without needing a separate binary
that would be the direction I'd tend to go. Even if we need a seoarate
version I'd like to keep as much common as possible.
I've tested that the missing rtas is not the reason for getting no output
via serial though, as even when disabling rtas on pegasos2.rom it boots and
I still get serial output just some PCI devices are not detected (such as
USB, the video card and the not emulated ethernet port but these are not
fatal so it might even work as a first try without rtas, just to boot a
Linux kernel for testing it would be enough if I can fix the serial output).
I still don't know why it's not finding serial but I think it may be some
missing or wrong info in the device tree I generat. I'll try to focus on
this for now and leave the above rtas question for later.
Oh.. another thought on that. You have an ISA serial port on Pegasos,
I believe. I wonder if the PCI->ISA bridge needs some configuration /
initialization that the firmware is expected to do. If so you'll need
to mimic that setup in qemu for the VOF case.