xref: /openbmc/qemu/include/qemu/userfaultfd.h (revision c0e38aa8)
10e9b5cd6SAndrey Gruzdev /*
20e9b5cd6SAndrey Gruzdev  * Linux UFFD-WP support
30e9b5cd6SAndrey Gruzdev  *
40e9b5cd6SAndrey Gruzdev  * Copyright Virtuozzo GmbH, 2020
50e9b5cd6SAndrey Gruzdev  *
60e9b5cd6SAndrey Gruzdev  * Authors:
70e9b5cd6SAndrey Gruzdev  *  Andrey Gruzdev   <andrey.gruzdev@virtuozzo.com>
80e9b5cd6SAndrey Gruzdev  *
90e9b5cd6SAndrey Gruzdev  * This work is licensed under the terms of the GNU GPL, version 2 or
100e9b5cd6SAndrey Gruzdev  * later.  See the COPYING file in the top-level directory.
110e9b5cd6SAndrey Gruzdev  */
120e9b5cd6SAndrey Gruzdev 
130e9b5cd6SAndrey Gruzdev #ifndef USERFAULTFD_H
140e9b5cd6SAndrey Gruzdev #define USERFAULTFD_H
150e9b5cd6SAndrey Gruzdev 
16*d5890ea0SPeter Xu #ifdef CONFIG_LINUX
17*d5890ea0SPeter Xu 
180e9b5cd6SAndrey Gruzdev #include "exec/hwaddr.h"
190e9b5cd6SAndrey Gruzdev #include <linux/userfaultfd.h>
200e9b5cd6SAndrey Gruzdev 
21*d5890ea0SPeter Xu /**
22*d5890ea0SPeter Xu  * uffd_open(): Open an userfaultfd handle for current context.
23*d5890ea0SPeter Xu  *
24*d5890ea0SPeter Xu  * @flags: The flags we want to pass in when creating the handle.
25*d5890ea0SPeter Xu  *
26*d5890ea0SPeter Xu  * Returns: the uffd handle if >=0, or <0 if error happens.
27*d5890ea0SPeter Xu  */
28*d5890ea0SPeter Xu int uffd_open(int flags);
290e9b5cd6SAndrey Gruzdev int uffd_query_features(uint64_t *features);
300e9b5cd6SAndrey Gruzdev int uffd_create_fd(uint64_t features, bool non_blocking);
310e9b5cd6SAndrey Gruzdev void uffd_close_fd(int uffd_fd);
320e9b5cd6SAndrey Gruzdev int uffd_register_memory(int uffd_fd, void *addr, uint64_t length,
330e9b5cd6SAndrey Gruzdev         uint64_t mode, uint64_t *ioctls);
340e9b5cd6SAndrey Gruzdev int uffd_unregister_memory(int uffd_fd, void *addr, uint64_t length);
350e9b5cd6SAndrey Gruzdev int uffd_change_protection(int uffd_fd, void *addr, uint64_t length,
360e9b5cd6SAndrey Gruzdev         bool wp, bool dont_wake);
370e9b5cd6SAndrey Gruzdev int uffd_copy_page(int uffd_fd, void *dst_addr, void *src_addr,
380e9b5cd6SAndrey Gruzdev         uint64_t length, bool dont_wake);
390e9b5cd6SAndrey Gruzdev int uffd_zero_page(int uffd_fd, void *addr, uint64_t length, bool dont_wake);
400e9b5cd6SAndrey Gruzdev int uffd_wakeup(int uffd_fd, void *addr, uint64_t length);
410e9b5cd6SAndrey Gruzdev int uffd_read_events(int uffd_fd, struct uffd_msg *msgs, int count);
420e9b5cd6SAndrey Gruzdev bool uffd_poll_events(int uffd_fd, int tmo);
430e9b5cd6SAndrey Gruzdev 
44*d5890ea0SPeter Xu #endif /* CONFIG_LINUX */
45*d5890ea0SPeter Xu 
460e9b5cd6SAndrey Gruzdev #endif /* USERFAULTFD_H */
47