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