Activating the sigma0 thread in the Fiasco kernel
Adam Lackorzynski
adam at os.inf.tu-dresden.de
Thu Mar 8 01:15:17 CET 2018
On Thu Mar 08, 2018 at 00:52:55 +0100, Paul Boddie wrote:
> On Wednesday 7. March 2018 01.22.46 Paul Boddie wrote:
> >
> > Currently, I have reason to believe that an exception occurs causing the
> > sigma0 thread to terminate, but it's getting late and my debugging
> > efficiency is suffering. I think that when the thread terminates, it has
> > the following cause register flags set:
> >
> > ExcCode = 0b01101 (= 11, coprocessor unusable)
> > IP2 = 1
> > CE = 0b01
> >
> > The error exception program counter seems to be given as 0x80210000, which
> > doesn't sound consistent with a user mode address, but perhaps the kernel
> > is using that register for something else.
> >
> > So maybe there's some FPU stuff that I haven't managed to eradicate in the
> > L4Re code.
>
> None of this appeared to be accurate, probably because I was reading directly
> from the cause register when I should have been reading the saved version.
> Anyway, I decided to make the kernel stop upon receiving the first thread-
> halting condition, and this yielded the following details:
>
> * Stored cause has ExcCode 4 (address error, load/instruction fetch)
> * Stored exception program counter is 0x2092ac
> * Stored bad virtual address is 0xfff2aff4
>
> In sigma0, I found the following rather interesting, produced using objdump
> with some comments added by me:
>
> 209290: 3c02fff3 lui v0,0xfff3
> 209294: 24422000 addiu v0,v0,8192 // 0xfff32000
> 209298: afc2011c sw v0,284(s8)
> 20929c: 7c02e83b 0x7c02e83b // rdhwr v0, $29 (ULR)
> 2092a0: afc20118 sw v0,280(s8)
> 2092a4: 8fc20118 lw v0,280(s8)
> 2092a8: 8fc30158 lw v1,344(s8)
> 2092ac: 8c508ff4 lw s0,-28684(v0) // 0xfff2aff4
>
> Evidently, v0 was not getting updated by the rdhwr instruction, which should
> be handled as a reserved instruction. Thus, the previous value of v0 was being
> combined with the offset in the final instruction above, causing a read from a
> completely invalid address that happens to feature in the saved bad virtual
> address register.
>
> So, I had a look at my code and discovered that I had indeed transcribed an
> operation incorrectly: it was related to implementing the ins instruction for
> this SoC; I had employed the wrong temporary register and was losing the
> original instruction details when attempting to get the target register.
>
> At this point, I think Fiasco now starts up. However, I now need to figure out
> how to perform the necessary operations to reinitialise the framebuffer and do
> interesting things like provide feedback on what is actually going on in my
> example programs. I hope it gets a bit easier from this point, though. :-)
Good!
Adam
More information about the l4-hackers
mailing list