Lluís Vilanova | dcdaadb | 2016-06-09 19:31:47 +0200 | [diff] [blame] | 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 | |
Emilio G. Cota | 706485d | 2018-05-22 18:26:50 -0400 | [diff] [blame] | 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) */ |
Emilio G. Cota | 3d69b95 | 2018-05-22 18:26:49 -0400 | [diff] [blame] | 17 | |
| 18 | static inline uint8_t trace_mem_build_info( |
Tony Nguyen | 14776ab | 2019-08-24 04:10:58 +1000 | [diff] [blame] | 19 | int size_shift, bool sign_extend, MemOp endianness, bool store) |
Lluís Vilanova | dcdaadb | 2016-06-09 19:31:47 +0200 | [diff] [blame] | 20 | { |
Emilio G. Cota | 3d69b95 | 2018-05-22 18:26:49 -0400 | [diff] [blame] | 21 | uint8_t res; |
Lluís Vilanova | dcdaadb | 2016-06-09 19:31:47 +0200 | [diff] [blame] | 22 | |
Emilio G. Cota | 3d69b95 | 2018-05-22 18:26:49 -0400 | [diff] [blame] | 23 | res = size_shift & TRACE_MEM_SZ_SHIFT_MASK; |
| 24 | if (sign_extend) { |
| 25 | res |= TRACE_MEM_SE; |
Lluís Vilanova | dcdaadb | 2016-06-09 19:31:47 +0200 | [diff] [blame] | 26 | } |
Emilio G. Cota | 3d69b95 | 2018-05-22 18:26:49 -0400 | [diff] [blame] | 27 | if (endianness == MO_BE) { |
| 28 | res |= TRACE_MEM_BE; |
| 29 | } |
Lluís Vilanova | dcdaadb | 2016-06-09 19:31:47 +0200 | [diff] [blame] | 30 | if (store) { |
Emilio G. Cota | 3d69b95 | 2018-05-22 18:26:49 -0400 | [diff] [blame] | 31 | res |= TRACE_MEM_ST; |
Lluís Vilanova | dcdaadb | 2016-06-09 19:31:47 +0200 | [diff] [blame] | 32 | } |
Lluís Vilanova | dcdaadb | 2016-06-09 19:31:47 +0200 | [diff] [blame] | 33 | return res; |
| 34 | } |
| 35 | |
Tony Nguyen | 14776ab | 2019-08-24 04:10:58 +1000 | [diff] [blame] | 36 | static inline uint8_t trace_mem_get_info(MemOp op, bool store) |
Lluís Vilanova | dcdaadb | 2016-06-09 19:31:47 +0200 | [diff] [blame] | 37 | { |
Emilio G. Cota | 3d69b95 | 2018-05-22 18:26:49 -0400 | [diff] [blame] | 38 | return trace_mem_build_info(op & MO_SIZE, !!(op & MO_SIGN), |
| 39 | op & MO_BSWAP, store); |
Lluís Vilanova | dcdaadb | 2016-06-09 19:31:47 +0200 | [diff] [blame] | 40 | } |
| 41 | |
Emilio G. Cota | f9b4799 | 2018-05-22 18:26:51 -0400 | [diff] [blame] | 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 | |
Markus Armbruster | 175de52 | 2016-06-29 15:29:06 +0200 | [diff] [blame] | 54 | #endif /* TRACE__MEM_INTERNAL_H */ |