Doubts About Cache Manager Routines

Darren Burridge bug_slayer at hotmail.com
Tue Apr 5 21:34:54 UTC 2011


Don't be such a doubting Thomas! ;-)
 
> Date: Tue, 5 Apr 2011 21:19:13 +0200
> From: Thomas.Doerfler at imd-systems.de
> To: rtems-users at rtems.org
> Subject: Re: Doubts About Cache Manager Routines
> 
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
> 
> Naufal,
> 
> maybe using a local (stack) variable as a test target is not really a
> good idea, because you will _always_ hit stuff in the neighbourhood.
> Your analysis is totally to the point regarding the effects you have.
> 
> A proper way may include:
> - - allocate a cache-aligned chunk of memory (e.g. from the heap, using
> malloc() ).
> - - use this location as your test area.
> 
> wkr,
> Thomas.
> 
> 
> Am 05.04.2011 20:49, schrieb Mohamed Naufal:
> > Hi
> > 
> > I'm trying to implement to write an sptest to check the working of
> > cache manager routines as a qualification task for the cache manager
> > support GSoC project.
> > 
> > This is what I have so far:
> > 
> > on i386:
> > 
> > rtems_task Init(rtems_task_argument arg)
> > {
> > int volatile a = 1;
> > //Writeback and invalidate
> > __asm__ __volatile__("wbinvd");
> > a = 2;
> > //Invalidate
> > __asm__ __volatile__("invd");
> > if (a == 1)
> > printf("Invalidation successful\n");
> > else
> > printf("Invalidation unsuccessful\n");
> > 
> > exit(0);
> > }
> > This doesn't work on qemu but does on real hardware.
> > 
> > Using the cache manager routines, this is what I did
> > rtems_task Init(rtems_task_argument arg)
> > {
> > int volatile a = 1;
> > 
> > rtems_cache_data_enable();
> > rtems_cache_flush_entire_data();
> > a = 2;
> > rtems_cache_invalidate_entire_data();
> > if (a == 1)
> > printf("Invalidation successful\n");
> > else
> > printf("Invalidation unsuccessful\n");
> > 
> > exit(0);
> > }
> > 
> > This doesn't work as I'd hoped. On checking, it seems
> > invalidate_data() returns to the line a=2 and thus infinite loops.My
> > understanding is that in the invalidate function, the dirty blocks
> > including the stack part which contains the return address are
> > invalidated. So it uses the return address of the flush function which
> > was the previously written out to the same memory location.
> > 
> > How do I handle this?
> > 
> > Thanks
> > Naufal
> > _______________________________________________
> > rtems-users mailing list
> > rtems-users at rtems.org
> > http://www.rtems.org/mailman/listinfo/rtems-users
> 
> 
> - -- 
> - --------------------------------------------
> IMD Ingenieurbuero fuer Microcomputertechnik
> Thomas Doerfler Herbststrasse 8
> D-82178 Puchheim Germany
> email: Thomas.Doerfler at imd-systems.de
> PGP public key available at:
> http://www.imd-systems.de/pgpkey_en.html
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v2.0.14 (MingW32)
> Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/
> 
> iEYEARECAAYFAk2bazAACgkQwHyg4bDtfjQ7GgCglF6xGTGfapGuObGXok6QjnOA
> M3MAn1nBHuZmc4nNj2Q7ryZX33KlIenU
> =bNHw
> -----END PGP SIGNATURE-----
> _______________________________________________
> rtems-users mailing list
> rtems-users at rtems.org
> http://www.rtems.org/mailman/listinfo/rtems-users
 		 	   		  
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/users/attachments/20110405/aadfb413/attachment.html>


More information about the users mailing list