]>
Commit | Line | Data |
---|---|---|
dcdaadb6 LV |
1 | /* |
2 | * Helper functions for guest memory tracing | |
3 | * | |
4 | * Copyright (C) 2016 Lluís Vilanova <vilanova@ac.upc.edu> | |
5 | * | |
6 | * This work is licensed under the terms of the GNU GPL, version 2 or later. | |
7 | * See the COPYING file in the top-level directory. | |
8 | */ | |
9 | ||
10 | #ifndef TRACE__MEM_INTERNAL_H | |
11 | #define TRACE__MEM_INTERNAL_H | |
12 | ||
706485d2 EC |
13 | #define TRACE_MEM_SZ_SHIFT_MASK 0x7 /* size shift mask */ |
14 | #define TRACE_MEM_SE (1ULL << 3) /* sign extended (y/n) */ | |
15 | #define TRACE_MEM_BE (1ULL << 4) /* big endian (y/n) */ | |
16 | #define TRACE_MEM_ST (1ULL << 5) /* store (y/n) */ | |
3d69b95e EC |
17 | |
18 | static inline uint8_t trace_mem_build_info( | |
19 | int size_shift, bool sign_extend, TCGMemOp endianness, bool store) | |
dcdaadb6 | 20 | { |
3d69b95e | 21 | uint8_t res; |
dcdaadb6 | 22 | |
3d69b95e EC |
23 | res = size_shift & TRACE_MEM_SZ_SHIFT_MASK; |
24 | if (sign_extend) { | |
25 | res |= TRACE_MEM_SE; | |
26 | } | |
27 | if (endianness == MO_BE) { | |
28 | res |= TRACE_MEM_BE; | |
dcdaadb6 | 29 | } |
dcdaadb6 | 30 | if (store) { |
3d69b95e | 31 | res |= TRACE_MEM_ST; |
dcdaadb6 | 32 | } |
dcdaadb6 LV |
33 | return res; |
34 | } | |
35 | ||
3d69b95e | 36 | static inline uint8_t trace_mem_get_info(TCGMemOp op, bool store) |
dcdaadb6 | 37 | { |
3d69b95e EC |
38 | return trace_mem_build_info(op & MO_SIZE, !!(op & MO_SIGN), |
39 | op & MO_BSWAP, store); | |
dcdaadb6 LV |
40 | } |
41 | ||
f9b47999 EC |
42 | static inline |
43 | uint8_t trace_mem_build_info_no_se_be(int size_shift, bool store) | |
44 | { | |
45 | return trace_mem_build_info(size_shift, false, MO_BE, store); | |
46 | } | |
47 | ||
48 | static inline | |
49 | uint8_t trace_mem_build_info_no_se_le(int size_shift, bool store) | |
50 | { | |
51 | return trace_mem_build_info(size_shift, false, MO_LE, store); | |
52 | } | |
53 | ||
175de524 | 54 | #endif /* TRACE__MEM_INTERNAL_H */ |