bringup on RK3399

Stefan Kalkowski stefan.kalkowski at genode-labs.com
Tue Nov 10 14:03:24 CET 2020


Hi,

On Tue, Nov 10, 2020 at 12:21:50PM +0000, Michael Grunditz wrote:
> On Tue, 10 Nov 2020 at 10:40, Stefan Kalkowski
> <stefan.kalkowski at genode-labs.com> wrote:
> >
> > Hi Michael,
> >
> > I just answered to you in the IRC channel. I could imagine that access
> > to the GIC is the actual problem, because this is done in _arch_init()
> > inside of the Cpu constructor.
> >
> > Can you confirm, that you can proceed at least behind the Cpu
> > construction if you uncomment the line:
> >
> >   repos/base-hw/src/core/spec/arm_v8/kernel/cpu.cc:20
> >
> > or not?
> 
> Not.. I have checked all related constructors , and non seems to get
> called. I somewhat suspect cpu constructor isn't called.

To be really sure, that the constructor does not even get called, you
might derive the Kernel::Cpu class from a Dummy class that prints
something in its contructor. Of course, it should be the first class
the Cpu class inherits from.

If the (hardware-)exception is really not caused inside the
constructor, but before the constructor call, then you would be right
and it has to do with the actual memory access for the object
creation.
The Cpu objects are constructed using the Genode::Constructible class,
which contains a static char array as placeholder for the object
memory. That means it is actually no dynamically allocated memory but
already part of core's ELF sections.  Therefore, it might be useful to
investigate the linking address you are using for the whole image, and
maybe to change that.
Another reason might be some alignment constraints? To be really sure,
what is going on, you could temporarily change the exception vector in
file 'repos/base-hw/src/core/spec/arm_v8/exception_vector.s' at the
very beginning to, e.g.:

  .section .text.crt0

  .rept 16
  mrs  x0, elr_el1
  mrs  x1, spsr_el1
  adr  x2, .
  and  x2, x2, #0xf80
  bl   kernel
  .balign 128
  .endr

And change the function kernel() to something like:

  extern "C" void kernel(void * ip, void * spsr, void * off, void * esr_el1)
  {
    Genode::raw("ip=", ip, " spsr=", spsr, " exc_off=", off, " esr_el1=", esr_el1);
  }

Then the outcome of the first printing would be quite interesting to know.

Regards
Stefan

> 
> MIchael
> 
> _______________________________________________
> Genode users mailing list
> users at lists.genode.org
> https://lists.genode.org/listinfo/users

-- 
Stefan Kalkowski
Genode labs

https://github.com/skalk | https://genode.org



More information about the users mailing list