xref: /qemu/util/sys_membarrier.c (revision d6974846)
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 Bonzini membarrier(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 Bonzini void 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 Bonzini void 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