summaryrefslogtreecommitdiffstats
path: root/testsuite/systemtap.base/deref.stp
blob: 3f76bfb66877846e47f0f90d78ed34462c649011 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
/*
 * deref.stp
 *
 * Check that the deref mechanisms work correctly.
 */

probe begin {  println("systemtap starting probe")  }
probe end   {  println("systemtap ending probe")    }

probe end(1) {
  log_test("kread u8", kread_u8())
  log_test("kread u16", kread_u16())
  log_test("kread u32", kread_u32())
  log_test("kread u64", kread_u64())
  log_test("kread ptr", kread_ptr())

  log_test("kread const u8", kread_const_u8())
  log_test("kread const u16", kread_const_u16())
  log_test("kread const u32", kread_const_u32())
  log_test("kread const u64", kread_const_u64())
  log_test("kread const ptr", kread_const_ptr())

  log_test("kwrite u8", kwrite_u8())
  log_test("kwrite u16", kwrite_u16())
  log_test("kwrite u32", kwrite_u32())
  log_test("kwrite u64", kwrite_u64())
  log_test("kwrite ptr", kwrite_ptr())
}

function log_test(test:string, result:long) {
  if (result)
    println("systemtap test success")
  else
    printf("systemtap test failure - %s\n", test)
}

function kread_u8:long() %{
  uint8_t local = 0x42;
  THIS->__retvalue = (local == kread(&local));
  CATCH_DEREF_FAULT();
%}

function kread_u16:long() %{
  uint16_t local = 0xBEEF;
  THIS->__retvalue = (local == kread(&local));
  CATCH_DEREF_FAULT();
%}

function kread_u32:long() %{
  uint32_t local = 0xDEADBEEF;
  THIS->__retvalue = (local == kread(&local));
  CATCH_DEREF_FAULT();
%}

function kread_u64:long() %{
  uint64_t local = 0xDEADBEEFBAADF00DLL;
  THIS->__retvalue = (local == kread(&local));
  CATCH_DEREF_FAULT();
%}

function kread_ptr:long() %{
  struct task_struct *local = current;
  THIS->__retvalue = (local == kread(&local));
  CATCH_DEREF_FAULT();
%}

function kread_const_u8:long() %{
  const uint8_t local = 0x42;
  THIS->__retvalue = (local == kread(&local));
  CATCH_DEREF_FAULT();
%}

function kread_const_u16:long() %{
  const uint16_t local = 0xBEEF;
  THIS->__retvalue = (local == kread(&local));
  CATCH_DEREF_FAULT();
%}

function kread_const_u32:long() %{
  const uint32_t local = 0xDEADBEEF;
  THIS->__retvalue = (local == kread(&local));
  CATCH_DEREF_FAULT();
%}

function kread_const_u64:long() %{
  const uint64_t local = 0xDEADBEEFBAADF00DLL;
  THIS->__retvalue = (local == kread(&local));
  CATCH_DEREF_FAULT();
%}

function kread_const_ptr:long() %{
  const struct task_struct *local = current;
  THIS->__retvalue = (local == kread(&local));
  CATCH_DEREF_FAULT();
%}

// NB: kwrite uses system macros with inline asm, with this comment:
//
//   Tell gcc we read from memory instead of writing: this is because we do not
//   write to any memory gcc knows about, so there are no aliasing issues.
//
// In this test I'm writing to memory that gcc *does* know about, thus we need
// the memory marked volatile to force gcc to re-read it.

function kwrite_u8:long() %{
  volatile uint8_t local = 0;
  kwrite(&local, 0x42);
  THIS->__retvalue = (local == 0x42);
  CATCH_DEREF_FAULT();
%}

function kwrite_u16:long() %{
  volatile uint16_t local = 0;
  kwrite(&local, 0xBEEF);
  THIS->__retvalue = (local == 0xBEEF);
  CATCH_DEREF_FAULT();
%}

function kwrite_u32:long() %{
  volatile uint32_t local = 0;
  kwrite(&local, 0xDEADBEEF);
  THIS->__retvalue = (local == 0xDEADBEEF);
  CATCH_DEREF_FAULT();
%}

function kwrite_u64:long() %{
  volatile uint64_t local = 0;
  kwrite(&local, 0xDEADBEEFBAADF00DLL);
  THIS->__retvalue = (local == 0xDEADBEEFBAADF00DLL);
  CATCH_DEREF_FAULT();
%}

function kwrite_ptr:long() %{
  struct task_struct * volatile local = NULL;
  kwrite(&local, current);
  THIS->__retvalue = (local == current);
  CATCH_DEREF_FAULT();
%}