Testing Fiasco.OC+L4re on ODROID-X2(Exynos4412)

Adam Lackorzynski adam at os.inf.tu-dresden.de
Tue May 26 23:41:10 CEST 2015


Hi,

On Tue May 19, 2015 at 15:23:33 -0400, Reinier Millo Sánchez wrote:
> On 05/17/2015 06:35 PM, Adam Lackorzynski wrote:
> >Hi,
> >
> >On Fri May 15, 2015 at 13:12:52 -0400, Reinier Millo Sánchez wrote:
> >>On 05/11/2015 06:00 AM, l4-hackers-request at os.inf.tu-dresden.de wrote:
> >>>On Tue May 05, 2015 at 01:28:46 -0400, Reinier Millo S?nchez wrote:
> >>>>>Hi Adam
> >>>>>>>>>>>    FPU0: Arch: VFPv3(3), Part: VFPv3(30), r: 4, v: 9, i: 41, t: hard,
> >>>>>>>>>>>    p: dbl/sngl
> >>>>>>>>>>>
> >>>>>>>>>>>    KERNEL: Warning: No page-fault handler for 0xee202214, error
> >>>>>>>>>>>    0x94000848, pc f0039420
> >>>>>>>>>>>
> >>>>>>>>>>>Somebody have tested Fiasco.OC+L4re on ODROID-X2 or another Exynos 4412
> >>>>>>>>>>>platform?
> >>>>>>>On this platform this seems to be some pattern. However, last time I
> >>>>>>>tried it worked for me. So, hmm, could you try another compiler version
> >>>>>>>and see if it changes behavior? Maybe this gives us some hints.
> >>>>>I'm using a linaro toolchain
> >>>>>(gcc-linaro-arm-linux-gnueabihf-4.8-2014.03_x86_64). I have tried the
> >>>>>arm-none-eabi toolchain in Debian repository but fails compiling the
> >>>>>snapshot.
> >>>>>I have made some progress trying to run FiascoOC+L4re on Odroid-X2. There
> >>>>>are some changes that I have made:
> >>>>>I have modified the file "l4/mk/platforms/exynos4.conf" adapting Exynos4's
> >>>>>platform to Odroid-X2. In this case the RAM size differs (Odroid-X2 have
> >>>>>2Gb). In this file I have configured the UART for serial output (I'm using
> >>>>>UART 1).
> >>>>>
> >>>>>    PLATFORM_RAM_BASE       = 0x40000000
> >>>>>    -  PLATFORM_RAM_SIZE_MB  = 1024
> >>>>>    + PLATFORM_RAM_SIZE_MB  = 2047
> >>>>>    + PLATFORM_UART_NR          = 1
> >>>>>
> >>>>>Booting the generated image I have detected that bootstrap's server is not
> >>>>>using UART 1 for output. I have modified the "init" function on
> >>>>>"l4/pkg/bootstrap/server/src/platform/exynos.cc"  to use the configured UART
> >>>>>on the platform file modified above.
> >>>>>
> >>>>>    unsigned long uart_base;
> >>>>>    -  unsigned uart_nr = 2;
> >>>>>    + unsigned uart_nr = PLATFORM_UART_NR;
> >>>>>
> >>>>>I have tried to compile and test the image on the Odroid-X2, but fails the
> >>>>>execution, this is the serial output:
> >>>>>
> >>>>>    L4 Bootstrapper
> >>>>>       Build: #18 Sat May  2 15:56:00 CDT 2015, 4.8.3 20140303 (prerelease)
> >>>>>       Scanning up to 2047 MB RAM, starting at offset 32MB
> >>>>>       Memory size is 2047MB (40000000 - bfefffff)
> >>>>>       Limiting 'RAM' region   [ 40000000,  bfefffff] { 7ff00000} to [
> >>>>>    40000000,  bcffffff] { 7d000000} due to 3024 MB address limit
> >>>>>       RAM: 0000000040000000 - 00000000bcffffff: 2048000kB
> >>>>>       Total RAM: 2000MB
> >>>>>       Scanning fiasco
> >>>>>       Scanning sigma0
> >>>>>       Scanning moe
> >>>>>       Moving up to 5 modules behind 41100000
> >>>>>       moving module 02 { 410b4000-410e565f } -> { 411a5000-411d665f }
> >>>>>    [202336]
> >>>>>       moving module 01 { 410aa000-410b3377 } -> { 4119b000-411a4377 }
> >>>>>    [37752]
> >>>>>       moving module 00 { 41043000-410a9daf } -> { 41134000-4119adaf }
> >>>>>    [421296]
> >>>>>       moving module 04 { 41029000-410425b3 } -> { 4111a000-411335b3 }
> >>>>>    [103860]
> >>>>>       moving module 03 { 4100f000-41028493 } -> { 41100000-41119493 }
> >>>>>    [103572]
> >>>>>       Loading fiasco
> >>>>>       Loading sigma0
> >>>>>       Loading moe
> >>>>>       find kernel info page...
> >>>>>       found kernel info page at 0x40002000
> >>>>>    Regions of list 'regions'
> >>>>>         [ 40000000,  400000e3] {       e4} Root   mbi_rt
> >>>>>         [ 40001000,  40001aff] {      b00} Kern   fiasco
> >>>>>         [ 40002000,  40076fff] {    75000} Kern   fiasco
> >>>>>         [ 40090000,  4009681b] {     681c} Sigma0 sigma0
> >>>>>         [ 40098000,  4009e177] {     6178} Sigma0 sigma0
> >>>>>         [ 40140000,  4018b4ab] {    4b4ac} Root   moe
> >>>>>         [ 41000000,  4100e4ff] {     e500} Boot   bootstrap
> >>>>>         [ 41100000,  41133fff] {    34000} Root   Module
> >>>>>       API Version: (87) experimental
> >>>>>       Sigma0 config    ip:40090100 sp:00000000
> >>>>>       Roottask config  ip:4014020c sp:00000000
> >>>>>       Starting kernel fiasco at 400012c8
> >>>>>    Hello from Startup::stage2
> >>>>>    Per_cpu_data_alloc: (orig: 0xf0063a50-0xf00644d0)
> >>>>>    Number of IRQs available at this GIC: 160
> >>>>>    FPU0: Arch: VFPv3(3), Part: VFPv3(30), r: 4, v: 9, i: 41, t: hard,
> >>>>>    p: dbl/sngl
> >>>>>
> >>>>>    KERNEL: Warning: No page-fault handler for 0xee202214, error
> >>>>>    0x94000848, pc f0039420
> >>>>>
> >>>>>I have been testing and changing the compiling configuration. Using the
> >>>>>below configuration to compile Fiasco.OC, the system boots and hangs at
> >>>>>"Calibrating timer loop...":
> >>>>>
> >>>>>    Platform Timer -> Multi-core timer
> >>>>>    Use ExtGic -> True
> >>>>>    Execution Model -> TrustZone normal side
> >>>>>    Secure Monitor Interface -> Mobicore
> >>>>>    Enable multi processor support -> True
> >>>>>    Maximal supported number of CPUs -> 4
> >>>Interesting. What's the difference to the previos config?
> >>In the first configuration i was using:
> >>
> >>    Platform Timer -> Multi-core timer
> >>    Use ExtGic -> True
> >>    Execution Model -> Standard mode
> >>    Enable multi processor support -> False
> >Ok, thanks.
> >
> >>>>>This is the serial output when tested the image on Odroid-X2:
> >>>>>    Calibrating timer loop...
> >>>>>
> >>>>>I think that the problem now is with the Exynos4's Timers, but i have been
> >>>>>reviewing the implementations and it seems fine.
> >>>>>Is there anything wrong on my configuration or somebody have any idea?
> >>>Does the counter of the timer count, i.e. multiple reads return
> >>>different values?
> >>We have checked and the system clock at Kip (Kip::k()->clock) is updating on
> >>every tick in the function "Timer::update_system_clock", but multiple reads
> >>of the clock in the function "Delay::measure" returns the same value.
> >This sounds as it would work? Reading 'clock' multiple times in a row
> >will indeed return the same value, until the next timer interrupt.
> >That's what the measure function actually tries to check.
> >
> >>We have made another small changes to test the snapshot on the Odroid-X2
> >>board. We have compiled Fiasco.OC using this configuration:
> >>
> >>    Execution Model ->TrustZone Normal side
> >>    Secure Monitor Interface ->none
> >>    Enable multi processor support ->Disable
> >So you're using the Multi-core timer? Could you add a
> >mct->write<Mword>(1 << 8, Mct_timer::Reg::Tcon); and a couple of
> >printf("%lx\n", mct->read<Mword>(Mct_timer::Reg::Cnt_l)); in
> >timer-arm-exynos.cpp in Timer::init within the boot_cpu block?
> >Are the printed numbers different?
> We've tried your suggestions and the printf write different values of the
> global MCT Timer. The current Fiasco.OC implementation don't uses the Global
> MCT Timer, it uses the CPU local timer. The system clock is updated in
> Timer::update_system_clock, incrementing the Kip::k()->clock value. This
> function is called in the Timer_tick::handle_timer. At this point we have
> added an printf to view if the timer is updating.

Ok, sounds goo.d

> We have only printed 20 values to don't overload the serial output with the
> ticks output. We have added some printf in the Delay::measure to check the
> clock values:
> 
>    Delay::measure()
>    {
>       Cpu_time t1;
>       unsigned count = 0;
> 
>       Kip *k = Kip::k();
>       Cpu_time t = Kip::k()->clock;
> 
>    ++  printf("  IN MEASURE CLOCK:  %llu\n",k->clock);
>    ++  int i=0;
> 
>       Timer::update_timer(t + 1000); // 1ms
>       while (t == (t1 = k->clock)){
>         Proc::pause();
>    ++    if(i==0){
>    ++       printf("  MEASURE-WHILE : %llu : %llu\n",t,k->clock);
>    ++       i++;
>    ++   }
>       }
> 
>       Timer::update_timer(k->clock + 1000); // 1ms
>       while (t1 == k->clock)
>         {
>           ++count;
>           Proc::pause();
>         }
> 
>       return count;
>    }
> 
> We have testes it on the Odroid-X2 and this is the serial output:
> 
>    Calibrating timer loop...
>       IN MEASURE CLOCK: 20000
>       MEASURE-WHILE :20000 : 20000
> 
> We have tested changing the amount of update_system_timer logged, but always
> the system waits to finish it and then enter in the "Calibrating timer
> loop". In the Delay::meause the clock always print the last value logged by
> the printf at Timer_tick::handle_timer.
> It seems the the system clock is working and updating but at certain point
> it don't update anymore.
> We have tested a little solution, forcing the system to try to pass this
> point. We have added a Proc::sti() call after the Proc::pause(). In this
> case the system prints differents values ​​for the clocks.
> Somebody have any idea or suggestions about this problem on the Exynos4412?

Your code is a bit confusing to me, as I do not see how it ever can
print more than 2 lines and I'd suspect that all numbers are the same
(or do you let it wrap?).
Concerning the sti(), it is called before measure() (before Delay::init()
is called). So maybe interrupts go off again. Could you check at various
points starting from Delay::init() what Proc::interrupts() returns?





Adam
-- 
Adam                 adam at os.inf.tu-dresden.de
  Lackorzynski         http://os.inf.tu-dresden.de/~adam/



More information about the l4-hackers mailing list