1 : // Copyright 2014 Google Inc. All Rights Reserved.
2 : //
3 : // Licensed under the Apache License, Version 2.0 (the "License");
4 : // you may not use this file except in compliance with the License.
5 : // You may obtain a copy of the License at
6 : //
7 : // http://www.apache.org/licenses/LICENSE-2.0
8 : //
9 : // Unless required by applicable law or agreed to in writing, software
10 : // distributed under the License is distributed on an "AS IS" BASIS,
11 : // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 : // See the License for the specific language governing permissions and
13 : // limitations under the License.
14 : //
15 : // Declarations relating to memory intercept functions.
16 : #ifndef SYZYGY_AGENT_ASAN_MEMORY_INTERCEPTORS_H_
17 : #define SYZYGY_AGENT_ASAN_MEMORY_INTERCEPTORS_H_
18 :
19 m : namespace agent {
20 m : namespace asan {
21 :
22 : // List of the memory accessor function variants this file implements.
23 : #define ASAN_MEM_INTERCEPT_FUNCTIONS(F) \
24 m : F(1, read_access, AsanReadAccess) \
25 m : F(2, read_access, AsanReadAccess) \
26 m : F(4, read_access, AsanReadAccess) \
27 m : F(8, read_access, AsanReadAccess) \
28 m : F(10, read_access, AsanReadAccess) \
29 m : F(16, read_access, AsanReadAccess) \
30 m : F(32, read_access, AsanReadAccess) \
31 m : F(1, write_access, AsanWriteAccess) \
32 m : F(2, write_access, AsanWriteAccess) \
33 m : F(4, write_access, AsanWriteAccess) \
34 m : F(8, write_access, AsanWriteAccess) \
35 m : F(10, write_access, AsanWriteAccess) \
36 m : F(16, write_access, AsanWriteAccess) \
37 m : F(32, write_access, AsanWriteAccess)
38 :
39 : #define ASAN_STRING_INTERCEPT_FUNCTIONS(F) \
40 m : F(cmps, _repz_, ecx, AsanReadAccess, AsanReadAccess, 4, 1) \
41 m : F(cmps, _repz_, ecx, AsanReadAccess, AsanReadAccess, 2, 1) \
42 m : F(cmps, _repz_, ecx, AsanReadAccess, AsanReadAccess, 1, 1) \
43 m : F(cmps, _, 1, AsanReadAccess, AsanReadAccess, 4, 1) \
44 m : F(cmps, _, 1, AsanReadAccess, AsanReadAccess, 2, 1) \
45 m : F(cmps, _, 1, AsanReadAccess, AsanReadAccess, 1, 1) \
46 m : F(movs, _repz_, ecx, AsanWriteAccess, AsanReadAccess, 4, 0) \
47 m : F(movs, _repz_, ecx, AsanWriteAccess, AsanReadAccess, 2, 0) \
48 m : F(movs, _repz_, ecx, AsanWriteAccess, AsanReadAccess, 1, 0) \
49 m : F(movs, _, 1, AsanWriteAccess, AsanReadAccess, 4, 0) \
50 m : F(movs, _, 1, AsanWriteAccess, AsanReadAccess, 2, 0) \
51 m : F(movs, _, 1, AsanWriteAccess, AsanReadAccess, 1, 0) \
52 m : F(stos, _repz_, ecx, AsanWriteAccess, AsanUnknownAccess, 4, 0) \
53 m : F(stos, _repz_, ecx, AsanWriteAccess, AsanUnknownAccess, 2, 0) \
54 m : F(stos, _repz_, ecx, AsanWriteAccess, AsanUnknownAccess, 1, 0) \
55 m : F(stos, _, 1, AsanWriteAccess, AsanUnknownAccess, 4, 0) \
56 m : F(stos, _, 1, AsanWriteAccess, AsanUnknownAccess, 2, 0) \
57 m : F(stos, _, 1, AsanWriteAccess, AsanUnknownAccess, 1, 0)
58 :
59 m : } // namespace asan
60 m : } // namespace agent
61 :
62 m : extern "C" {
63 :
64 : #define DECLARE_MEM_INTERCEPT_FUNCTIONS(access_size, \
65 m : access_mode_str, \
66 m : access_mode_value) \
67 m : void asan_check_ ## access_size ## _byte_ ## access_mode_str(); \
68 m : void asan_check_ ## access_size ## _byte_ ## access_mode_str ## _no_flags();
69 :
70 : // Declare all the memory interceptor functions. Note that these functions have
71 : // a custom calling convention, and can't be invoked directly.
72 m : ASAN_MEM_INTERCEPT_FUNCTIONS(DECLARE_MEM_INTERCEPT_FUNCTIONS)
73 :
74 : #undef DECLARE_MEM_INTERCEPT_FUNCTIONS
75 :
76 : #define DECLARE_STRING_INTERCEPT_FUNCTIONS(func, prefix, counter, dst_mode, \
77 m : src_mode, access_size, compare) \
78 m : void asan_check ## prefix ## access_size ## _byte_ ## func ## _access();
79 :
80 : // Declare all the string instruction interceptor functions. Note that these
81 : // functions have a custom calling convention, and can't be invoked directly.
82 m : ASAN_STRING_INTERCEPT_FUNCTIONS(DECLARE_STRING_INTERCEPT_FUNCTIONS)
83 :
84 : #undef DECLARE_STRING_INTERCEPT_FUNCTIONS
85 :
86 m : }
87 :
88 : #endif // SYZYGY_AGENT_ASAN_MEMORY_INTERCEPTORS_H_
|