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

Adam Lackorzynski adam at os.inf.tu-dresden.de
Wed Nov 1 00:38:23 CET 2017


Hi,

On Mon Oct 30, 2017 at 18:38:40 +0100, Paul Boddie wrote:
> > > 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.

Yes, that's about TLS.

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

I just modified the code to have a fixed value and that worked for me as
a quick hack. I don't think the value will ever change for a particular
CPU. But it's still a hack and there's a smarter way definitely.

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

Debian is building pie code per default nowadays, I think that's where
it's coming from, and we should handle this.

The MIPS vendor compiler is actually gcc but an older one:
https://www.mips.com/develop/tools/codescape-mips-sdk/download-codescape-mips-sdk-essentials/

> [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?

There's a hole, and it also looks like the first 256MB is mirrored at
512MB. However, using all the memory is just a matter actually making it
known, I've just tried it and it seems to work. All Ci20's have 1GB,
right?



Adam




More information about the l4-hackers mailing list