]>
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 | ||
291987c3 EC |
13 | #define TRACE_MEM_SZ_SHIFT_MASK 0xf /* size shift mask */ |
14 | #define TRACE_MEM_SE (1ULL << 4) /* sign extended (y/n) */ | |
15 | #define TRACE_MEM_BE (1ULL << 5) /* big endian (y/n) */ | |
16 | #define TRACE_MEM_ST (1ULL << 6) /* store (y/n) */ | |
504f73f7 | 17 | #define TRACE_MEM_MMU_SHIFT 8 /* mmu idx */ |
3d69b95e | 18 | |
504f73f7 AB |
19 | static inline uint16_t trace_mem_build_info( |
20 | int size_shift, bool sign_extend, MemOp endianness, | |
21 | bool store, unsigned int mmu_idx) | |
dcdaadb6 | 22 | { |
504f73f7 | 23 | uint16_t res; |
dcdaadb6 | 24 | |
3d69b95e EC |
25 | res = size_shift & TRACE_MEM_SZ_SHIFT_MASK; |
26 | if (sign_extend) { | |
27 | res |= TRACE_MEM_SE; | |
28 | } | |
29 | if (endianness == MO_BE) { | |
30 | res |= TRACE_MEM_BE; | |
dcdaadb6 | 31 | } |
dcdaadb6 | 32 | if (store) { |
3d69b95e | 33 | res |= TRACE_MEM_ST; |
dcdaadb6 | 34 | } |
504f73f7 AB |
35 | #ifdef CONFIG_SOFTMMU |
36 | res |= mmu_idx << TRACE_MEM_MMU_SHIFT; | |
37 | #endif | |
dcdaadb6 LV |
38 | return res; |
39 | } | |
40 | ||
504f73f7 AB |
41 | static inline uint16_t trace_mem_get_info(MemOp op, |
42 | unsigned int mmu_idx, | |
43 | bool store) | |
dcdaadb6 | 44 | { |
3d69b95e | 45 | return trace_mem_build_info(op & MO_SIZE, !!(op & MO_SIGN), |
504f73f7 AB |
46 | op & MO_BSWAP, store, |
47 | mmu_idx); | |
dcdaadb6 LV |
48 | } |
49 | ||
175de524 | 50 | #endif /* TRACE__MEM_INTERNAL_H */ |