Activating the sigma0 thread in the Fiasco kernel

Paul Boddie paul at boddie.org.uk
Thu Mar 8 00:52:55 CET 2018


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. :-)

Paul




More information about the l4-hackers mailing list