Hi Andrew,

On 11 May 2015 at 12:17, Andrew Jones <[email protected]> wrote:
> > +
> > +void atomic_lock(int *lock_var)
> > +{
> > +    while (__sync_lock_test_and_set(lock_var, 1));
> > +}
> > +
> > +void atomic_unlock(int *lock_var)
> > +{
> > +    __sync_lock_release(lock_var);
> > +}
>
> Do these builtins actually do anything without enabling the
> MMU first?

>From my experience while testing on ARM, without the builtins
atomicity will fail, with our without enabling the MMU.

> > +
> > +void test_spinlock()
> > +{
> > +    int i, errors = 0;
> > +    int cpu = get_cpuid();
> > +
> > +    for (i = 0; i < LOOP_SIZE; i++) {
> > +        LOCK(&global_lock);
> > +
> > +        if (global_a == (cpu + 1) % 2) {
> > +            global_a = 1;
> > +            global_b = 0;
> > +        } else {
> > +            global_a = 0;
> > +            global_b = 1;
> > +        }
> > +
> > +        if (global_a == global_b) {
> > +            errors++;
> > +        }
> > +        UNLOCK(&global_lock);
> > +    }
> > +
> > +    printf("CPU%d: Done - Errors: %d\n", cpu, errors);
> > +}
> > +
> >  void main(void)
> >  {
> > -    printf("CPU %d on\n", get_cpuid());
> > +    if (!get_cpuid()) {
> > +            printf("Starting test\n");
> > +    }
> > +
> > +    test_spinlock();
> >      power_off();
> >  }
>
> You could have saved a ton of time by just putting these 50
> lines into a new kvm-unit-tests test. If you need the mmu
> disabled for some reason, then we can add an mmu_disable()
> to the API.
>
> drew

The main idea is to start with something very minimal and
straightforward for a standalone test similar to the QEMU's multiboot,
since the target is to mainly trigger race conditions and test
multithreaded TCG.

Thanks.

Reply via email to