1a40161cbSPaolo Bonzini /* 2a40161cbSPaolo Bonzini * Process-global memory barriers 3a40161cbSPaolo Bonzini * 4a40161cbSPaolo Bonzini * Copyright (c) 2018 Red Hat, Inc. 5a40161cbSPaolo Bonzini * 6a40161cbSPaolo Bonzini * Author: Paolo Bonzini <pbonzini@redhat.com> 7a40161cbSPaolo Bonzini */ 8a40161cbSPaolo Bonzini 9*d6974846SBruce Rogers #include "qemu/osdep.h" 10*d6974846SBruce Rogers #include "qemu/sys_membarrier.h" 11*d6974846SBruce Rogers #include "qemu/error-report.h" 12a40161cbSPaolo Bonzini 13a40161cbSPaolo Bonzini #ifdef CONFIG_LINUX 14a40161cbSPaolo Bonzini #include <linux/membarrier.h> 15a40161cbSPaolo Bonzini #include <sys/syscall.h> 16a40161cbSPaolo Bonzini 17a40161cbSPaolo Bonzini static int membarrier(int cmd,int flags)18a40161cbSPaolo Bonzinimembarrier(int cmd, int flags) 19a40161cbSPaolo Bonzini { 20a40161cbSPaolo Bonzini return syscall(__NR_membarrier, cmd, flags); 21a40161cbSPaolo Bonzini } 22a40161cbSPaolo Bonzini #endif 23a40161cbSPaolo Bonzini smp_mb_global(void)24a40161cbSPaolo Bonzinivoid smp_mb_global(void) 25a40161cbSPaolo Bonzini { 26a40161cbSPaolo Bonzini #if defined CONFIG_WIN32 27a40161cbSPaolo Bonzini FlushProcessWriteBuffers(); 28a40161cbSPaolo Bonzini #elif defined CONFIG_LINUX 29a40161cbSPaolo Bonzini membarrier(MEMBARRIER_CMD_SHARED, 0); 30a40161cbSPaolo Bonzini #else 31a40161cbSPaolo Bonzini #error --enable-membarrier is not supported on this operating system. 32a40161cbSPaolo Bonzini #endif 33a40161cbSPaolo Bonzini } 34a40161cbSPaolo Bonzini smp_mb_global_init(void)35a40161cbSPaolo Bonzinivoid smp_mb_global_init(void) 36a40161cbSPaolo Bonzini { 37a40161cbSPaolo Bonzini #ifdef CONFIG_LINUX 38a40161cbSPaolo Bonzini int ret = membarrier(MEMBARRIER_CMD_QUERY, 0); 39a40161cbSPaolo Bonzini if (ret < 0) { 40a40161cbSPaolo Bonzini error_report("This QEMU binary requires the membarrier system call."); 41a40161cbSPaolo Bonzini error_report("Please upgrade your system to a newer version of Linux"); 42a40161cbSPaolo Bonzini exit(1); 43a40161cbSPaolo Bonzini } 44a40161cbSPaolo Bonzini if (!(ret & MEMBARRIER_CMD_SHARED)) { 45a40161cbSPaolo Bonzini error_report("This QEMU binary requires MEMBARRIER_CMD_SHARED support."); 46a40161cbSPaolo Bonzini error_report("Please upgrade your system to a newer version of Linux"); 47a40161cbSPaolo Bonzini exit(1); 48a40161cbSPaolo Bonzini } 49a40161cbSPaolo Bonzini #endif 50a40161cbSPaolo Bonzini } 51