On Wednesday, 26 April 2023 17:27:35 CEST Paul Boddie wrote: > > As part of reviewing my earlier efforts getting L4Re running on various > MIPS- based devices, I have been trying to get the bootstrap module to > start the kernel on the MIPS Creator CI20, and here I encounter a strange > problem.
[Invalid data at the kernel entry point] > Does this seem like recognisable behaviour of some kind of misconfiguration? > For the most part, I am just rebasing my old patches on the current L4Re > and Fiasco versions, so I didn't expect a problem at this level. Further troubleshooting suggests that what happens is as follows... Boot_modules::_move_module copies data from its original location as part of the boot payload to locations relative to the module base address. This copying is done using "virtual" addresses, even though the bootstrap module outputs "physical" addresses in the log. So, for the offending kernel code: moving module 00 { 2f4000-39a537 } -> { 2000000-20a6537 } [681272] Here, the actual copying is done using these "virtual" addresses: 802f4000-8039a537 -> 82000000-820a6537 As a reminder, these "virtual" addresses are KSEG0 addresses, meaning that they correspond directly to the previously indicated addresses, but the address mapping is done by the processor, effectively clearing the top bit of each address. Subsequently, the data is copied again to its final, desired location by l4_exec_read_exec. However, this function uses entirely "physical" addresses, and it is here that the bad data was being found and copied for execution. For example: 2000000-20a6537 -> d3000-d5097 As another reminder, these "physical" addresses are actually virtual addresses that are set up in an identity mapping in the _start routine in the appropriate crt0.S file. What I discovered was that whilst bad data was available via the "physical" addresses, valid data was available via the "virtual" addresses. Thus, it was possible to get the l4_exec_read_exec function to see the appropriate data by employing "virtual" addresses when copying. Alternatively, by making the _move_module function use the "physical" addresses, I could get the l4_exec_read_exec function to see the appropriate data that way. An alternative to changing the addressing schemes employed by these functions was to instead flush the data cache in _move_module. This appears to synchronise the views of memory that the KSEG0 mapping and the configured mapping have. However, after doing this, and demonstrating that I can invoke the kernel code (using the low-technology method of changing the colour of the CI20's power LED), I find that the instruction clearing the processor's status register seems to halt execution. To me, this suggests that something else is wrong with the memory mapping, but I can't think of what this is at the moment. It is very odd that this code doesn't work any more. Furthermore, I use the QEMU emulation of the MIPS Malta board all the time, and it doesn't have such problems. I can imagine that there are details of the cache management that are different between the emulated Malta processor and the genuine CI20 processor, but it doesn't really explain how this worked on the CI20 before. I suppose that all the necessary cached data might have been written to memory purely by chance. Anyway, that is as far as I have managed to get, unfortunately. I did attempt to try the older Subversion-based L4Re distribution, but I encountered a long- forgotten issue with the build system and didn't have the appetite to continue. Any insights would be welcome. Paul _______________________________________________ l4-hackers mailing list l4-hackers@os.inf.tu-dresden.de https://os.inf.tu-dresden.de/mailman/listinfo/l4-hackers