xref: /qemu/accel/tcg/backend-ldst.h (revision fc524567087c2537b5103cdfc1d41e4f442892b6)
1*9638cb59SPhilippe Mathieu-Daudé /*
2*9638cb59SPhilippe Mathieu-Daudé  * Internal memory barrier helpers for QEMU (target agnostic)
3*9638cb59SPhilippe Mathieu-Daudé  *
4*9638cb59SPhilippe Mathieu-Daudé  *  Copyright (c) 2003 Fabrice Bellard
5*9638cb59SPhilippe Mathieu-Daudé  *
6*9638cb59SPhilippe Mathieu-Daudé  * SPDX-License-Identifier: LGPL-2.1-or-later
7*9638cb59SPhilippe Mathieu-Daudé  */
8*9638cb59SPhilippe Mathieu-Daudé 
9*9638cb59SPhilippe Mathieu-Daudé #ifndef ACCEL_TCG_BACKEND_LDST_H
10*9638cb59SPhilippe Mathieu-Daudé #define ACCEL_TCG_BACKEND_LDST_H
11*9638cb59SPhilippe Mathieu-Daudé 
12*9638cb59SPhilippe Mathieu-Daudé #include "tcg-target-mo.h"
13*9638cb59SPhilippe Mathieu-Daudé 
14*9638cb59SPhilippe Mathieu-Daudé /**
15*9638cb59SPhilippe Mathieu-Daudé  * tcg_req_mo:
16*9638cb59SPhilippe Mathieu-Daudé  * @guest_mo: Guest default memory order
17*9638cb59SPhilippe Mathieu-Daudé  * @type: TCGBar
18*9638cb59SPhilippe Mathieu-Daudé  *
19*9638cb59SPhilippe Mathieu-Daudé  * Filter @type to the barrier that is required for the guest
20*9638cb59SPhilippe Mathieu-Daudé  * memory ordering vs the host memory ordering.  A non-zero
21*9638cb59SPhilippe Mathieu-Daudé  * result indicates that some barrier is required.
22*9638cb59SPhilippe Mathieu-Daudé  */
23*9638cb59SPhilippe Mathieu-Daudé #define tcg_req_mo(guest_mo, type) \
24*9638cb59SPhilippe Mathieu-Daudé     ((type) & guest_mo & ~TCG_TARGET_DEFAULT_MO)
25*9638cb59SPhilippe Mathieu-Daudé 
26*9638cb59SPhilippe Mathieu-Daudé /**
27*9638cb59SPhilippe Mathieu-Daudé  * cpu_req_mo:
28*9638cb59SPhilippe Mathieu-Daudé  * @cpu: CPUState
29*9638cb59SPhilippe Mathieu-Daudé  * @type: TCGBar
30*9638cb59SPhilippe Mathieu-Daudé  *
31*9638cb59SPhilippe Mathieu-Daudé  * If tcg_req_mo indicates a barrier for @type is required
32*9638cb59SPhilippe Mathieu-Daudé  * for the guest memory model, issue a host memory barrier.
33*9638cb59SPhilippe Mathieu-Daudé  */
34*9638cb59SPhilippe Mathieu-Daudé #define cpu_req_mo(cpu, type)     \
35*9638cb59SPhilippe Mathieu-Daudé     do {                          \
36*9638cb59SPhilippe Mathieu-Daudé         if (tcg_req_mo(cpu->cc->tcg_ops->guest_default_memory_order, type)) { \
37*9638cb59SPhilippe Mathieu-Daudé             smp_mb();             \
38*9638cb59SPhilippe Mathieu-Daudé         }                         \
39*9638cb59SPhilippe Mathieu-Daudé     } while (0)
40*9638cb59SPhilippe Mathieu-Daudé 
41*9638cb59SPhilippe Mathieu-Daudé #endif
42