Ralf Ramsauer <[email protected]> writes:

> On 04/05/2017 02:48 PM, Jan Kiszka wrote:
>> On 2017-04-05 13:43, Måns Rullgård wrote:
>>> Ralf Ramsauer <[email protected]> writes:
>>>
>>>> Hi,
>>>>
>>>> I need spinlocks in inmates on ARM, so I simply included asm/spinlock.h.
>>>> Taking locks in inmates on ARM somehow doesn't work at all, but that's
>>>> not the main issue. As soon as I try to take locks, cells can not be
>>>> destroyed any longer, the whole system freezes on cell destroy.
>>>>
>>>> I was able to trace this down to the 'ldrex' instruction. This minimal
>>>> example triggers this behavior (tested on a TK1, can not test it on
>>>> other boards):
>>>>
>>>> #include <inmate.h>
>>>>
>>>> void inmate_main(void)
>>>> {
>>>>    unsigned int foo = 0, bar = 0;
>>>>
>>>>    printk("Foo!\n");
>>>>    asm volatile("ldrex %0, [%1]\n\t"
>>>>            : "=&r" (foo) : "r" (bar));
>>>>
>>>>    printk("Bar!\n");
>>>>    while(1);
>>>>            asm volatile("wfi");
>>>> }
>>>>
>>>> The example code successfully finishes, I can read Foo and Bar on my
>>>> serial console. But I am not able to destroy the cell afterwards. My
>>>> system completely hangs on "jailhouse cell destroy".
>>>>
>>>> Curiously the cell can be re-loaded and started over again. Leaving out
>>>> the ldrex instruction does not trigger the bug.
>>>>
>>>>   - How can ldrex prevent my cell from being destroyed?
>>>>
>>>>     Does it change some 'internal state' where jailhouse is not aware
>>>>     about?
>> 
>> Is your inmate opting-out from the Comm Region protocol
>> (JAILHOUSE_CELL_PASSIVE_COMMREG)?
> Yes I'm using the Jailhouse's TK1 default config.
>> 
>>>>
>>>>   - Why do spinlocks not work at all in inmates?
>>>>
>>>>     spin_lock(&lock) never returns in inmates on a fresh spin lock.
>>>>     Does the ARM implementation of spinlocks require some special
>>>>     global initialisation that I don't know of?
>>>
>>> Spinlocks use ldrex/strex pairs, so if ldrex is broken, I wouldn't
>>> expect spinlocks to work either.
>>>
>> 
>> ...and Linux use them heavily. All our ARM SMP Linux inmates would be
>> broken then. There must be more involved.
> Yes, true.
>
> I just reanimated my Orange Pi zero and cross-checked the behaviour there:
>
> It just prints the "Foo!", no bar, and I'm able to destroy its cell
> afterwards. Jetson TK1 behaves different and freezes.

Is that using the same compiled inmate code?  Could you post a
disassembly of the inmate_main() function?  The compiler might be doing
something unexpected.

-- 
Måns Rullgård

-- 
You received this message because you are subscribed to the Google Groups 
"Jailhouse" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to