blob: 2b280519343ee1d9b8387de5b80adf5cd2d2ed74 [file] [log] [blame]
sewardjde4a1d02002-03-22 01:27:54 +00001
2/* Test Heimdall's ability to spot writes to code which has been
3 translated, and discard the out-of-date translations.
4
5 CORRECT output is
6
7 in p 0
8 in q 1
9 in p 2
10 in q 3
11 in p 4
12 in q 5
13 in p 6
14 in q 7
15 in p 8
16 in q 9
17
18 WRONG output (if you fail to spot code-writes to code[0 .. 4]) is
19
20 in p 0
21 in p 1
22 in p 2
23 in p 3
24 in p 4
25 in p 5
26 in p 6
27 in p 7
28 in p 8
29 in p 9
30*/
31
32#include <stdio.h>
fitzhardinge98abfc72003-12-16 02:05:15 +000033#include "valgrind.h"
sewardjde4a1d02002-03-22 01:27:54 +000034
35typedef unsigned int Addr;
36typedef unsigned char UChar;
37
38void q ( int n )
39{
40 printf("in q %d\n", n);
41}
42
43void p ( int n )
44{
45 printf("in p %d\n", n);
46}
47
fitzhardinge98abfc72003-12-16 02:05:15 +000048UChar code[10];
sewardjde4a1d02002-03-22 01:27:54 +000049
50/* Make `code' be JMP-32 dest */
51void set_dest ( Addr dest )
52{
53 unsigned int delta;
54 delta = dest - ((Addr)(&code[0]));
55 delta -= 5;
56
57 code[0] = 0xE9; /* JMP d32 */
58 code[1] = (delta & 0xFF);
59 code[2] = ((delta >> 8) & 0xFF);
60 code[3] = ((delta >> 16) & 0xFF);
61 code[4] = ((delta >> 24) & 0xFF);
fitzhardinge98abfc72003-12-16 02:05:15 +000062
63 /* XXX this should be automatic */
64 VALGRIND_DISCARD_TRANSLATIONS(code, sizeof(code));
sewardjde4a1d02002-03-22 01:27:54 +000065}
66
njn25e49d8e72002-09-23 09:36:25 +000067int main ( void )
sewardjde4a1d02002-03-22 01:27:54 +000068{
69 int i;
70 for (i = 0; i < 10; i += 2) {
71 set_dest ( (Addr)&p );
72 ( (void (*)(int)) (&code[0]) ) (i);
73 set_dest ( (Addr)&q );
74 ( (void (*)(int)) (&code[0]) ) (i+1);
75 }
njn25e49d8e72002-09-23 09:36:25 +000076 return 0;
sewardjde4a1d02002-03-22 01:27:54 +000077}