MIPS/resources/soft/perf_func/lib/guess.c
Paul Pan 7b33e4213a a big update
1. add test soft
2. modify verilator (TODO: crossbar need to replace)
3. fix CP0: now CU0 is always 1
4. Controller: cacheop
5. Controller: fix TEN
6. mycpu_top fix CP0_i
7. fix AXI.sv
8. fix AXIReader.sv
9. fix AXIWriter.sv: getting the correct data and length
10. MU: fix cache writeback, fix mem data mux, fix writer address, fix read request
2022-07-29 18:25:58 +08:00

123 lines
2.2 KiB
C

#ifdef _ABIO32
#define LADDU "addu"
#else
#define LADDU "daddu"
#endif
static unsigned long GUESS_ADDR = ((int)0xbfc00000);
static unsigned long mask = 0xffff;
static unsigned long stride = 4;
int scan()
{
void *p;
for(p=0xffffffff90000000;p<0xffffffffa0000000;p=p+4)
{
if((((long)p)&0xffff)==0) printf("%x\n", p);
*(volatile int *)p;
}
}
int guess(unsigned long addr, unsigned long end)
{
while(addr<end)
{
printf("g%x\n", addr);
asm volatile(
".set push;\n"
".set noreorder;\n"
".set mips64;\n"
"1:lw %1,(%2);\n"
"beqzl %1,1f;\n"
"nop;\n"
"sync;\n"
LADDU " %0, %5;\n"
"and %1, %0, %4;\n"
"beqz %1,2f;\n"
"nop;\n"
"b 1b;\n"
"nop;\n"
"1:lw %1,(%0);\n"
"b 1b;\n"
"nop;\n"
"2:\n"
".set pop;\n"
:"=r"(addr):"r"(0),"r"(GUESS_ADDR),"0"(addr),"r"(mask), "r"(stride)
);
}
}
int guess1(unsigned long addr, unsigned long end)
{
while(addr<end)
{
printf("G%x\n", addr);
asm volatile(
".set push;\n"
".set noreorder;\n"
".set mips64;\n"
"1:lw %1,(%2);\n"
"beqzl %1,1f;\n"
"nop;\n"
"sync;\n"
LADDU " %0,%5;\n"
"and %1, %0, %4;\n"
"beqz %1,2f;\n"
"nop;\n"
"b 1b;\n"
"nop;\n"
"1:jr %0;\n"
"nop;\n"
"2:\n"
".set pop;\n"
:"=r"(addr):"r"(0),"r"(GUESS_ADDR),"0"(addr),"r"(mask),"r"(stride)
);
}
}
int testguess(int argc, char **argv)
{
long from, to, mode;
from = 0xbf000000;
to = 0xc0000000;
mode = 3;
while(*(volatile int *)GUESS_ADDR == 0)
GUESS_ADDR += 4;
printf("guess addr %x\n",GUESS_ADDR);
printf("begin test\n");
// scan();
if(argc>1) from = strtoul(argv[1],0,0);
if(argc>2) to = strtoul(argv[2],0,0);
if(argc>3) mask = strtoul(argv[3],0,0);
if(argc>4) stride = strtoul(argv[4],0,0);
if(argc>5) mode = strtoul(argv[5],0,0);
if(argc>2)
{
if(mode&1)
guess1(from, to);
if(mode&2)
guess(from, to);
}
else
{
if(mode&1)
guess1(0xffffffffbf000000, 0xffffffffc0000000);
if(mode&2)
guess(0xffffffffbf000000, 0xffffffffc0000000);
if(mode&1)
guess1(0xffffffff9f000000, 0xffffffffa0000000);
if(mode&2)
guess(0xffffffff9f000000, 0xffffffffa0000000);
}
return 0;
}