From: Juergen Kienhoefer <juergen@kienhoefer•com>
To: linuxppc-dev list <linuxppc-dev@lists•linuxppc.org>
Subject: Re: cache coherence problem: FIXED
Date: Tue, 18 Nov 2003 09:40:55 -0800 [thread overview]
Message-ID: <3FBA59A7.5040904@kienhoefer.com> (raw)
In-Reply-To: 1069133049.7168.123.camel@gaston
[-- Attachment #1: Type: text/plain, Size: 733 bytes --]
Ben, et al.
Thanks, the test program is fixed and working.
I appreciate your help very much!!!
See attachment
Juergen
Benjamin Herrenschmidt wrote:
>On Tue, 2003-11-18 at 16:22, Benjamin Herrenschmidt wrote:
>
>
>>On Tue, 2003-11-18 at 16:00, Juergen Kienhoefer wrote:
>>
>>
>>>Guys,
>>>Thank you very much for the ideas.
>>>Basically, what I need to do is:
>>>dcbst
>>>sync
>>>iccci
>>>
>>>
>>^^^^^^^
>>No: icbi
>>
>>
>>
>>>sync
>>>isync
>>>for every 32 bytes of the memory block I put code in.
>>>
>>>
>
>Actually, to be precise, you need:
>
> 1) A loop of dcbst's over every cache line crossed by your code
> 2) one sync
> 3) A loop of icbi's over every cache line crossed by your code
> 4) one sync, one isync
>
>Ben.
>
>
>
[-- Attachment #2: mmapexec.c --]
[-- Type: text/plain, Size: 1882 bytes --]
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/mman.h>
#include <errno.h>
#include <sys/ptrace.h>
#include <signal.h>
#include <sched.h>
static inline void clear_icache(void *p)
{
asm volatile ("dcbst 0,%0;
sync;
icbi 0,%0;
sync;
isync" : : "r" (p));
}
int main( int argc, char** argv ) {
long* loc;
int (*init)(void);
long returninstr0 = 0x38600009; // li r3,4
long returninstr1 = 0x4e800020; // blr
int returned;
int fd;
char zero;
char tempfile[20] = { "test-XXXXXX" };
printf( "start of test\n" );
fd = mkstemp( tempfile );
printf( "memfile name test-XXXXXX, fd %d\n", fd );
if (fchmod(fd, 0777) < 0){
perror("fchmod");
exit(1);
}
if( lseek( fd, 32768*1024, SEEK_SET ) != 32768*1024 ){ //32M
perror("lseek");
exit(1);
}
zero = 0;
if( write(fd, &zero, 1 ) != 1){
perror("write");
exit(1);
}
if( fcntl(fd, F_SETFD, FD_CLOEXEC ) != 0)
perror("Setting FD_CLOEXEC failed");
loc = mmap( (void *) 0x62800000, 12288,
PROT_READ | PROT_WRITE | PROT_EXEC,
MAP_SHARED | MAP_FIXED,
fd, 0x3a0000);
printf( "memory allocated at addr %x\n", loc );
printf( "data %x\n", loc[0] );
// random behaviour, sometimes works, sometimes illegal instruction
//loc = (long*)0x62800000; // set the address
//loc = (long*)0x62802000; // set the address
// always illegal instruction
loc = (long*)0x62801b44;
//loc = (long*)0x62801000;
loc[0] = returninstr0;
loc[1] = returninstr1;
printf( "new code: addr %x, %x\n", loc, loc[0] );
clear_icache( loc );
init = (int (*)(void))loc;
returned = init();
printf( "function returned %d\n", returned );
}
next prev parent reply other threads:[~2003-11-18 17:40 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-11-18 1:16 cache coherence problem Juergen Kienhoefer
2003-11-18 2:36 ` Matt Porter
2003-11-18 2:38 ` Michael R. Zucca
2003-11-19 22:35 ` linas
2003-11-18 3:02 ` Benjamin Herrenschmidt
2003-11-18 5:00 ` Juergen Kienhoefer
2003-11-18 5:22 ` Benjamin Herrenschmidt
2003-11-18 5:24 ` Benjamin Herrenschmidt
2003-11-18 17:40 ` Juergen Kienhoefer [this message]
2003-11-18 8:04 ` Wolfgang Denk
2003-11-18 9:37 ` Gabriel Paubert
2003-11-19 0:35 ` Benjamin Herrenschmidt
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=3FBA59A7.5040904@kienhoefer.com \
--to=juergen@kienhoefer$(echo .)com \
--cc=linuxppc-dev@lists$(echo .)linuxppc.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox