Skip to content

Commit

Permalink
tests/trace: Add a few tests of DAWR (data watchpoint) functionality
Browse files Browse the repository at this point in the history
Signed-off-by: Paul Mackerras <[email protected]>
  • Loading branch information
paulusmack committed Jan 16, 2025
1 parent e4f5fba commit dd8c59a
Show file tree
Hide file tree
Showing 4 changed files with 107 additions and 1 deletion.
Binary file modified tests/test_trace.bin
Binary file not shown.
1 change: 1 addition & 0 deletions tests/test_trace.console_out
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,4 @@ test 07:PASS
test 08:PASS
test 09:PASS
test 10:PASS
test 11:PASS
14 changes: 14 additions & 0 deletions tests/trace/head.S
Original file line number Diff line number Diff line change
Expand Up @@ -237,3 +237,17 @@ test10:
nop
1: li %r3,-1
blr

.global test11
test11:
stdx %r3,%r3,%r4
stw %r3,6(%r4)
dcbt 0,%r4
dcbf 0,%r4
dcbtst 0,%r4
sync
ld %r3,0(%r4)
lwz %r3,6(%r4)
lwz %r3,27(%r4)
stb %r3,26(%r4)
blr
93 changes: 92 additions & 1 deletion tests/trace/trace.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,17 @@ extern unsigned long callit(unsigned long arg1, unsigned long arg2,
#define MSR_SE 0x400
#define MSR_BE 0x200

#define DSISR 18
#define DAR 19
#define SRR0 26
#define SRR1 27
#define SPRG0 272
#define SPRG1 273
#define CIABR 187
#define DAWR0 180
#define DAWR1 181
#define DAWRX0 188
#define DAWRX1 189
#define SIAR 780
#define SDAR 781

Expand Down Expand Up @@ -232,6 +238,7 @@ int trace_test_9(void)

extern unsigned long test10(unsigned long, unsigned long);

/* test CIABR */
int trace_test_10(void)
{
unsigned long ret;
Expand Down Expand Up @@ -265,6 +272,89 @@ int trace_test_10(void)
return 0;
}

/* test DAWR[X]{0,1} */
#define MRD_SHIFT 10
#define HRAMMC 0x80
#define DW 0x40
#define DR 0x20
#define WT 0x10
#define WTI 0x08
#define PRIVM_HYP 0x04
#define PRIVM_PNH 0x02
#define PRIVM_PRO 0x01

extern unsigned long test11(unsigned long, unsigned long);

int trace_test_11(void)
{
unsigned long ret;
unsigned long regs[2];
unsigned long x[4];

mtspr(DAWR0, (unsigned long)&x[0]);
mtspr(DAWRX0, (0 << MRD_SHIFT) + DW + PRIVM_HYP);
ret = callit(0, (unsigned long) &x, test11, mfmsr(), regs);
if (ret != 0x300)
return ret + 1;
if (mfspr(SRR0) != (unsigned long) &test11 || mfspr(DSISR) != 0x02400000 ||
mfspr(DAR) != (unsigned long)&x[0])
return 2;

mtspr(DAWR0, (unsigned long)&x[1]);
ret = callit(0, (unsigned long) &x, test11, mfmsr(), regs);
if (ret != 0x300)
return ret + 3;
if (mfspr(SRR0) != (unsigned long) &test11 + 4 || mfspr(DSISR) != 0x02400000 ||
mfspr(DAR) != (unsigned long)&x[1])
return 4;

mtspr(DAWR0, (unsigned long)&x[0]);
mtspr(DAWRX0, (0 << MRD_SHIFT) + DR + PRIVM_HYP);
ret = callit(0, (unsigned long) &x, test11, mfmsr(), regs);
if (ret != 0x300)
return ret + 5;
if (mfspr(SRR0) != (unsigned long) &test11 + 24 || mfspr(DSISR) != 0x00400000)
return 6;

mtspr(DAWR0, (unsigned long)&x[1]);
ret = callit(0, (unsigned long) &x, test11, mfmsr(), regs);
if (ret != 0x300)
return ret + 7;
if (mfspr(SRR0) != (unsigned long) &test11 + 28 || mfspr(DSISR) != 0x00400000)
return 8;

mtspr(DAWR0, (unsigned long)&x[3]);
ret = callit(0, (unsigned long) &x, test11, mfmsr(), regs);
if (ret != 0x300)
return ret + 9;
if (mfspr(SRR0) != (unsigned long) &test11 + 32 || mfspr(DSISR) != 0x00400000)
return 10;

mtspr(DAWR0, (unsigned long)&x[2]);
mtspr(DAWRX0, (1 << MRD_SHIFT) + DW + PRIVM_HYP);
ret = callit(0, (unsigned long) &x, test11, mfmsr(), regs);
if (ret != 0x300)
return ret + 11;
if (mfspr(SRR0) != (unsigned long) &test11 + 36 || mfspr(DSISR) != 0x02400000)
return 12;

mtspr(DAWR0, (unsigned long)&x[0]);
mtspr(DAWRX0, (3 << MRD_SHIFT) + DR + DW + WT + PRIVM_HYP);
ret = callit(0, (unsigned long) &x, test11, mfmsr(), regs);
if (ret != 0)
return ret + 13;

mtspr(DAWR0, (unsigned long)&x[0]);
mtspr(DAWRX0, (3 << MRD_SHIFT) + DR + DW + WT + WTI + PRIVM_HYP);
ret = callit(0, (unsigned long) &x, test11, mfmsr(), regs);
if (ret != 0x300)
return ret + 14;
if (mfspr(SRR0) != (unsigned long) &test11 || mfspr(DSISR) != 0x02400000)
return 15;

return 0;
}

int fail = 0;

void do_test(int num, int (*test)(void))
Expand All @@ -277,7 +367,7 @@ void do_test(int num, int (*test)(void))
print_string("PASS\r\n");
} else {
fail = 1;
print_string("FAIL ");
print_string(" FAIL ");
print_hex(ret, 4);
print_string("\r\n");
}
Expand All @@ -297,6 +387,7 @@ int main(void)
do_test(8, trace_test_8);
do_test(9, trace_test_9);
do_test(10, trace_test_10);
do_test(11, trace_test_11);

return fail;
}

0 comments on commit dd8c59a

Please sign in to comment.