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