Patches (was Re: Problem with L4Linux accessing ethernet clocks)

Paul Boddie paul at boddie.org.uk
Mon Oct 30 18:38:40 CET 2017


Sorry for the delayed reply! Other things have been getting in the way, and 
some mild illness certainly hasn't helped matters.

On Wednesday 25. October 2017 00.42.59 Adam Lackorzynski wrote:
> 
> On Mon Oct 23, 2017 at 01:50:47 +0200, Paul Boddie wrote:
> > 
> > I haven't looked at how the floating point emulation is done in the Linux
> > kernel, as another example of this kind of thing, but I imagine that you
> > have
> 
> Linux has FP emulators to support applications with FPU code on
> processors that don't have an FPU. It does the obvious, catching the
> traps and handling them. Whether it's a good idea to do that in a
> microkernel is another thing. Technically it could be done of course but
> building the code with softfloat has always been a good alternative.

I'll most likely take the soft-float route for other SoCs when I get round to 
looking at them.

> > to do some assembly language programming here just to recover from the
> > exception. In this case, however, the emulated instruction is very
> > simple, although I did take the liberty of rearranging the emulation
> > mechanism slightly.
> 
> Yes, it is probably simple but that does not necessarily mean it would
> need to be done in asm. Exceptions are caught and handled of course, the
> actual processing can be done in C.

The instruction being emulated is rdhwr with argument $1 (SYNCI_Step). Other 
arguments of this instruction were already implemented in 
src/kernel/fiasco/src/kern/mips/exception.S, and so it was natural to add 
support for this argument there as well. For example, the existing support 
covered argument $29 (ULR) which seems to be concerned with accessing 
task/thread-local storage, if I interpret "TLS" correctly.

Meanwhile, argument $1 (SYNCI_Step) is concerned with accessing data from a 
configuration register that would normally only be accessible in kernel mode, 
with the purpose of this instruction variant being to expose the cache details 
to user mode. So the only way to actually implement the instruction as 
intended would be in kernel mode by doing the necessary read from the CONFIG1 
register.

A hack that I did consider was to just replace the instruction with code that 
just loads a constant that is set up according to the SoC parameters. A user 
space handler could certainly do such work and be invoked by the exception 
handler, but the resulting functionality would not exactly be equivalent to 
that provided by the patch because it would not dynamically ask the hardware 
about itself.

[...]

> > Yes. Various L4Re components do not work when compiled with gcc unless I
> > introduce these changes. It was suggested that I do not compile such
> > things as position-independent code, but I don't remember any further
> > explanation.
> 
> Hmm, does that mean that with Debian's gcc (6? 7?) there might be issues?

Here's my version information:

mipsel-linux-gnu-gcc (Debian 6.3.0-18) 6.3.0 20170516

However, I was told that gcc typically compiles position-independent code as 
the default for mipsel. My guess is that any version would be a problem, and I 
think it was already noted that development was done with the MIPS vendor 
compilers, not gcc, so this is why this issue wasn't noticed before.

[Accessing 1GB]

> Ok, I see, there's a background. And obviously the available memory can
> make a big difference.

If the entire 1GB appears at a different physical address than zero, which is 
my understanding of the situation, is it possible to set some kind of 
configuration variable to let Fiasco know about this, while still preserving 
the addresses used for things like peripherals in the usual zero-based region?

Paul




More information about the l4-hackers mailing list