| OLD | NEW | 
|---|
| 1 // Copyright 2014 Google Inc. All Rights Reserved. | 1 // Copyright 2014 Google Inc. All Rights Reserved. | 
| 2 // | 2 // | 
| 3 // Licensed under the Apache License, Version 2.0 (the "License"); | 3 // Licensed under the Apache License, Version 2.0 (the "License"); | 
| 4 // you may not use this file except in compliance with 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 | 5 // You may obtain a copy of the License at | 
| 6 // | 6 // | 
| 7 //     http://www.apache.org/licenses/LICENSE-2.0 | 7 //     http://www.apache.org/licenses/LICENSE-2.0 | 
| 8 // | 8 // | 
| 9 // Unless required by applicable law or agreed to in writing, software | 9 // Unless required by applicable law or agreed to in writing, software | 
| 10 // distributed under the License is distributed on an "AS IS" BASIS, | 10 // distributed under the License is distributed on an "AS IS" BASIS, | 
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 71     /* (0x20) disabled. Thus any marker starting with 0xc0 is a historic */  \ | 71     /* (0x20) disabled. Thus any marker starting with 0xc0 is a historic */  \ | 
| 72     /* block start marker. */  \ | 72     /* block start marker. */  \ | 
| 73     F(kHeapHistoricBlockStartMarker0, 0xC0)  \ | 73     F(kHeapHistoricBlockStartMarker0, 0xC0)  \ | 
| 74     F(kHeapHistoricBlockStartMarker1, 0xC1)  \ | 74     F(kHeapHistoricBlockStartMarker1, 0xC1)  \ | 
| 75     F(kHeapHistoricBlockStartMarker2, 0xC2)  \ | 75     F(kHeapHistoricBlockStartMarker2, 0xC2)  \ | 
| 76     F(kHeapHistoricBlockStartMarker3, 0xC3)  \ | 76     F(kHeapHistoricBlockStartMarker3, 0xC3)  \ | 
| 77     F(kHeapHistoricBlockStartMarker4, 0xC4)  \ | 77     F(kHeapHistoricBlockStartMarker4, 0xC4)  \ | 
| 78     F(kHeapHistoricBlockStartMarker5, 0xC5)  \ | 78     F(kHeapHistoricBlockStartMarker5, 0xC5)  \ | 
| 79     F(kHeapHistoricBlockStartMarker6, 0xC6)  \ | 79     F(kHeapHistoricBlockStartMarker6, 0xC6)  \ | 
| 80     F(kHeapHistoricBlockStartMarker7, 0xC7)  \ | 80     F(kHeapHistoricBlockStartMarker7, 0xC7)  \ | 
| 81     /* Nested block start bytes have the bit 0x80 set. */  \ |  | 
| 82     F(kHeapHistoricNestedBlockStartMarker0, 0xC8)  \ |  | 
| 83     F(kHeapHistoricNestedBlockStartMarker1, 0xC9)  \ |  | 
| 84     F(kHeapHistoricNestedBlockStartMarker2, 0xCA)  \ |  | 
| 85     F(kHeapHistoricNestedBlockStartMarker3, 0xCB)  \ |  | 
| 86     F(kHeapHistoricNestedBlockStartMarker4, 0xCC)  \ |  | 
| 87     F(kHeapHistoricNestedBlockStartMarker5, 0xCD)  \ |  | 
| 88     F(kHeapHistoricNestedBlockStartMarker6, 0xCE)  \ |  | 
| 89     F(kHeapHistoricNestedBlockStartMarker7, 0xCF)  \ |  | 
| 90     /* These are 'historic' markers associated with block left/right */  \ | 81     /* These are 'historic' markers associated with block left/right */  \ | 
| 91     /* redzones and freed data. They consist of the same values as the */  \ | 82     /* redzones and freed data. They consist of the same values as the */  \ | 
| 92     /* active markers, minus the active block bit. */  \ | 83     /* active markers, minus the active block bit. */  \ | 
| 93     F(kHeapHistoricBlockEndMarker, 0xD4)  \ | 84     F(kHeapHistoricBlockEndMarker, 0xD4)  \ | 
| 94     F(kHeapHistoricNestedBlockEndMarker, 0xD5)  \ |  | 
| 95     F(kHeapHistoricLeftPaddingMarker, 0xDA)  \ | 85     F(kHeapHistoricLeftPaddingMarker, 0xDA)  \ | 
| 96     F(kHeapHistoricRightPaddingMarker, 0xDB)  \ | 86     F(kHeapHistoricRightPaddingMarker, 0xDB)  \ | 
| 97     F(kHeapHistoricFreedMarker, 0xDD)  \ | 87     F(kHeapHistoricFreedMarker, 0xDD)  \ | 
| 98     /* Any marker starting with 0xe0 marks the beginning of a block. The */  \ | 88     /* Any marker starting with 0xe0 marks the beginning of a block. The */  \ | 
| 99     /* trailing 4 bits of the marker are used to encode additional */  \ | 89     /* trailing 4 bits of the marker are used to encode additional */  \ | 
| 100     /* metadata about the block itself. This is necessary to allow */  \ | 90     /* metadata about the block itself. This is necessary to allow */  \ | 
| 101     /* full introspection of blocks via the shadow. All 'active' block */  \ | 91     /* full introspection of blocks via the shadow. All 'active' block */  \ | 
| 102     /* start bytes have the bit 0x20 set. */  \ | 92     /* start bytes have the bit 0x20 set. */  \ | 
| 103     F(kHeapBlockStartMarker0, 0xE0)  \ | 93     F(kHeapBlockStartMarker0, 0xE0)  \ | 
| 104     F(kHeapBlockStartMarker1, 0xE1)  \ | 94     F(kHeapBlockStartMarker1, 0xE1)  \ | 
| 105     F(kHeapBlockStartMarker2, 0xE2)  \ | 95     F(kHeapBlockStartMarker2, 0xE2)  \ | 
| 106     F(kHeapBlockStartMarker3, 0xE3)  \ | 96     F(kHeapBlockStartMarker3, 0xE3)  \ | 
| 107     F(kHeapBlockStartMarker4, 0xE4)  \ | 97     F(kHeapBlockStartMarker4, 0xE4)  \ | 
| 108     F(kHeapBlockStartMarker5, 0xE5)  \ | 98     F(kHeapBlockStartMarker5, 0xE5)  \ | 
| 109     F(kHeapBlockStartMarker6, 0xE6)  \ | 99     F(kHeapBlockStartMarker6, 0xE6)  \ | 
| 110     F(kHeapBlockStartMarker7, 0xE7)  \ | 100     F(kHeapBlockStartMarker7, 0xE7)  \ | 
| 111     /* Nested block start bytes have the bit 0x80 set. */  \ |  | 
| 112     F(kHeapNestedBlockStartMarker0, 0xE8)  \ |  | 
| 113     F(kHeapNestedBlockStartMarker1, 0xE9)  \ |  | 
| 114     F(kHeapNestedBlockStartMarker2, 0xEA)  \ |  | 
| 115     F(kHeapNestedBlockStartMarker3, 0xEB)  \ |  | 
| 116     F(kHeapNestedBlockStartMarker4, 0xEC)  \ |  | 
| 117     F(kHeapNestedBlockStartMarker5, 0xED)  \ |  | 
| 118     F(kHeapNestedBlockStartMarker6, 0xEE)  \ |  | 
| 119     F(kHeapNestedBlockStartMarker7, 0xEF)  \ |  | 
| 120     /* The data in this block maps to internal memory structures. */  \ | 101     /* The data in this block maps to internal memory structures. */  \ | 
| 121     F(kAsanMemoryMarker, 0xF1)  \ | 102     F(kAsanMemoryMarker, 0xF1)  \ | 
| 122     /* The address covered by this byte are simply invalid and unable to */  \ | 103     /* The address covered by this byte are simply invalid and unable to */  \ | 
| 123     /* be accessed by user code. */  \ | 104     /* be accessed by user code. */  \ | 
| 124     F(kInvalidAddressMarker, 0xF2)  \ | 105     F(kInvalidAddressMarker, 0xF2)  \ | 
| 125     /* The bytes are part of a block that has been allocated by the */  \ | 106     /* The bytes are part of a block that has been allocated by the */  \ | 
| 126     /* instrumented code, but subsequently redzoned via the runtime API. */  \ | 107     /* instrumented code, but subsequently redzoned via the runtime API. */  \ | 
| 127     F(kUserRedzoneMarker, 0xF3)  \ | 108     F(kUserRedzoneMarker, 0xF3)  \ | 
| 128     /* This marker marks the end of a block in memory, and is part of a */  \ | 109     /* This marker marks the end of a block in memory, and is part of a */  \ | 
| 129     /* right redzone. */  \ | 110     /* right redzone. */  \ | 
| 130     F(kHeapBlockEndMarker, 0xF4)  \ | 111     F(kHeapBlockEndMarker, 0xF4)  \ | 
| 131     F(kHeapNestedBlockEndMarker, 0xF5)  \ |  | 
| 132     /* The bytes are part of a left redzone (block header padding). */  \ | 112     /* The bytes are part of a left redzone (block header padding). */  \ | 
| 133     /* This is the same value as used by Asan itself. */  \ | 113     /* This is the same value as used by Asan itself. */  \ | 
| 134     F(kHeapLeftPaddingMarker, 0xFA)  \ | 114     F(kHeapLeftPaddingMarker, 0xFA)  \ | 
| 135     /* The bytes are part of a right redzone (block trailer and padding). */  \ | 115     /* The bytes are part of a right redzone (block trailer and padding). */  \ | 
| 136     /* This is the same value as used by Asan itself. */  \ | 116     /* This is the same value as used by Asan itself. */  \ | 
| 137     F(kHeapRightPaddingMarker, 0xFB)  \ | 117     F(kHeapRightPaddingMarker, 0xFB)  \ | 
| 138     /* These bytes are part of memory that is destined to be used by the */  \ | 118     /* These bytes are part of memory that is destined to be used by the */  \ | 
| 139     /* heap, has been reserved from the OS, but not yet handed out to */  \ | 119     /* heap, has been reserved from the OS, but not yet handed out to */  \ | 
| 140     /* the code under test. */  \ | 120     /* the code under test. */  \ | 
| 141     F(kAsanReservedMarker, 0xFC)  \ | 121     F(kAsanReservedMarker, 0xFC)  \ | 
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 203   // @param marker The shadow marker to query. | 183   // @param marker The shadow marker to query. | 
| 204   // @returns true if the marker describes a historic block start marker. | 184   // @returns true if the marker describes a historic block start marker. | 
| 205   static bool IsHistoricBlockStart(ShadowMarkerValue marker); | 185   static bool IsHistoricBlockStart(ShadowMarkerValue marker); | 
| 206 | 186 | 
| 207   // @param marker The shadow marker to query. | 187   // @param marker The shadow marker to query. | 
| 208   // @returns true if the marker describes a block header marker, historic or | 188   // @returns true if the marker describes a block header marker, historic or | 
| 209   //     active. | 189   //     active. | 
| 210   static bool IsBlockStart(ShadowMarkerValue marker); | 190   static bool IsBlockStart(ShadowMarkerValue marker); | 
| 211 | 191 | 
| 212   // @param marker The shadow marker to query. | 192   // @param marker The shadow marker to query. | 
| 213   // @returns true if the markers describes a nested block start marker, |  | 
| 214   //     historic or active. |  | 
| 215   static bool IsNestedBlockStart(ShadowMarkerValue marker); |  | 
| 216 |  | 
| 217   // @param marker The shadow marker to query. |  | 
| 218   // @returns the extra data encoded in a block start marker. | 193   // @returns the extra data encoded in a block start marker. | 
| 219   // @note This should only be called for block start markers. | 194   // @note This should only be called for block start markers. | 
| 220   static uint8_t GetBlockStartData(ShadowMarkerValue marker); | 195   static uint8_t GetBlockStartData(ShadowMarkerValue marker); | 
| 221 | 196 | 
| 222   // @param marker The shadow marker to query. | 197   // @param marker The shadow marker to query. | 
| 223   // @returns true if the marker describes an active block start marker. | 198   // @returns true if the marker describes an active block start marker. | 
| 224   static bool IsActiveBlockEnd(ShadowMarkerValue marker); | 199   static bool IsActiveBlockEnd(ShadowMarkerValue marker); | 
| 225 | 200 | 
| 226   // @param marker The shadow marker to query. | 201   // @param marker The shadow marker to query. | 
| 227   // @returns true if the marker describes a historic block start marker. | 202   // @returns true if the marker describes a historic block start marker. | 
| 228   static bool IsHistoricBlockEnd(ShadowMarkerValue marker); | 203   static bool IsHistoricBlockEnd(ShadowMarkerValue marker); | 
| 229 | 204 | 
| 230   // @param marker The shadow marker to query. | 205   // @param marker The shadow marker to query. | 
| 231   // @returns true if the marker describes a block header marker, historic or | 206   // @returns true if the marker describes a block header marker, historic or | 
| 232   //     active. | 207   //     active. | 
| 233   static bool IsBlockEnd(ShadowMarkerValue marker); | 208   static bool IsBlockEnd(ShadowMarkerValue marker); | 
| 234 | 209 | 
| 235   // @param marker The shadow marker to query. | 210   // @param marker The shadow marker to query. | 
| 236   // @returns true if the markers describes a nested block end marker, |  | 
| 237   //     historic or active. |  | 
| 238   static bool IsNestedBlockEnd(ShadowMarkerValue marker); |  | 
| 239 |  | 
| 240   // @param marker The shadow marker to query. |  | 
| 241   // @returns true if the marker describes a historic left redzone. | 211   // @returns true if the marker describes a historic left redzone. | 
| 242   //     Note that block start markers are part of a left redzone. | 212   //     Note that block start markers are part of a left redzone. | 
| 243   static bool IsHistoricLeftRedzone(ShadowMarkerValue marker); | 213   static bool IsHistoricLeftRedzone(ShadowMarkerValue marker); | 
| 244 | 214 | 
| 245   // @param marker The shadow marker to query. | 215   // @param marker The shadow marker to query. | 
| 246   // @returns true if the marker describes an active left redzone. | 216   // @returns true if the marker describes an active left redzone. | 
| 247   //     Note that block start markers are part of a left redzone. | 217   //     Note that block start markers are part of a left redzone. | 
| 248   static bool IsActiveLeftRedzone(ShadowMarkerValue marker); | 218   static bool IsActiveLeftRedzone(ShadowMarkerValue marker); | 
| 249 | 219 | 
| 250   // @param marker The shadow marker to query. | 220   // @param marker The shadow marker to query. | 
| (...skipping 27 matching lines...) Expand all  Loading... | 
| 278   //     equivalent historic type. | 248   //     equivalent historic type. | 
| 279    static ShadowMarker ToHistoric(ShadowMarkerValue marker); | 249    static ShadowMarker ToHistoric(ShadowMarkerValue marker); | 
| 280 | 250 | 
| 281   // @} | 251   // @} | 
| 282 | 252 | 
| 283   // @name For building shadow markers. | 253   // @name For building shadow markers. | 
| 284   // @{ | 254   // @{ | 
| 285 | 255 | 
| 286   // Builds a block start marker. | 256   // Builds a block start marker. | 
| 287   // @param active True if the block is active, false if its historic. | 257   // @param active True if the block is active, false if its historic. | 
| 288   // @param nested True if the block is nested, false otherwise. |  | 
| 289   // @param data The data to be appended to the marker. This can only consist | 258   // @param data The data to be appended to the marker. This can only consist | 
| 290   //     of 3 bits of data. | 259   //     of 3 bits of data. | 
| 291   // @returns the generated block start marker. | 260   // @returns the generated block start marker. | 
| 292    static ShadowMarker BuildBlockStart(bool active, bool nested, uint8_t data); | 261   static ShadowMarker BuildBlockStart(bool active, uint8_t data); | 
| 293 | 262 | 
| 294   // Builds a block end marker. | 263   // Builds a block end marker. | 
| 295   // @param active True if the block is active, false if its historic. | 264   // @param active True if the block is active, false if its historic. | 
| 296   // @param nested True if the block is nested, false otherwise. |  | 
| 297   // @returns the generated block end marker. | 265   // @returns the generated block end marker. | 
| 298   static ShadowMarker BuildBlockEnd(bool active, bool nested); | 266   static ShadowMarker BuildBlockEnd(bool active); | 
| 299 | 267 | 
| 300   // @} | 268   // @} | 
| 301 }; | 269 }; | 
| 302 | 270 | 
| 303 }  // namespace asan | 271 }  // namespace asan | 
| 304 }  // namespace agent | 272 }  // namespace agent | 
| 305 | 273 | 
| 306 #endif  // SYZYGY_AGENT_ASAN_SHADOW_MARKER_H_ | 274 #endif  // SYZYGY_AGENT_ASAN_SHADOW_MARKER_H_ | 
| OLD | NEW | 
|---|