xref: /openbmc/qemu/include/user/page-protection.h (revision 65cb7129f4160c7e07a0da107f888ec73ae96776)
1634f1455SPhilippe Mathieu-Daudé /*
2634f1455SPhilippe Mathieu-Daudé  * QEMU page protection declarations.
3634f1455SPhilippe Mathieu-Daudé  *
4634f1455SPhilippe Mathieu-Daudé  *  Copyright (c) 2003 Fabrice Bellard
5634f1455SPhilippe Mathieu-Daudé  *
6634f1455SPhilippe Mathieu-Daudé  * SPDX-License-Identifier: LGPL-2.1+
7634f1455SPhilippe Mathieu-Daudé  */
8634f1455SPhilippe Mathieu-Daudé #ifndef USER_PAGE_PROTECTION_H
9634f1455SPhilippe Mathieu-Daudé #define USER_PAGE_PROTECTION_H
10634f1455SPhilippe Mathieu-Daudé 
11634f1455SPhilippe Mathieu-Daudé #ifndef CONFIG_USER_ONLY
12634f1455SPhilippe Mathieu-Daudé #error Cannot include this header from system emulation
13634f1455SPhilippe Mathieu-Daudé #endif
14634f1455SPhilippe Mathieu-Daudé 
15970ae60eSPhilippe Mathieu-Daudé #include "cpu-param.h"
16970ae60eSPhilippe Mathieu-Daudé #include "exec/target_long.h"
17634f1455SPhilippe Mathieu-Daudé #include "exec/translation-block.h"
18634f1455SPhilippe Mathieu-Daudé 
19634f1455SPhilippe Mathieu-Daudé void page_protect(tb_page_addr_t page_addr);
20634f1455SPhilippe Mathieu-Daudé int page_unprotect(tb_page_addr_t address, uintptr_t pc);
2162ef949bSPhilippe Mathieu-Daudé 
22*f47dcf51SPhilippe Mathieu-Daudé int page_get_flags(target_ulong address);
23*f47dcf51SPhilippe Mathieu-Daudé 
2462ef949bSPhilippe Mathieu-Daudé /**
2562ef949bSPhilippe Mathieu-Daudé  * page_set_flags:
2662ef949bSPhilippe Mathieu-Daudé  * @start: first byte of range
2762ef949bSPhilippe Mathieu-Daudé  * @last: last byte of range
2862ef949bSPhilippe Mathieu-Daudé  * @flags: flags to set
2962ef949bSPhilippe Mathieu-Daudé  * Context: holding mmap lock
3062ef949bSPhilippe Mathieu-Daudé  *
3162ef949bSPhilippe Mathieu-Daudé  * Modify the flags of a page and invalidate the code if necessary.
3262ef949bSPhilippe Mathieu-Daudé  * The flag PAGE_WRITE_ORG is positioned automatically depending
3362ef949bSPhilippe Mathieu-Daudé  * on PAGE_WRITE.  The mmap_lock should already be held.
3462ef949bSPhilippe Mathieu-Daudé  */
3562ef949bSPhilippe Mathieu-Daudé void page_set_flags(target_ulong start, target_ulong last, int flags);
3662ef949bSPhilippe Mathieu-Daudé 
3762ef949bSPhilippe Mathieu-Daudé void page_reset_target_data(target_ulong start, target_ulong last);
3862ef949bSPhilippe Mathieu-Daudé 
3962ef949bSPhilippe Mathieu-Daudé /**
40187b7ca9SPhilippe Mathieu-Daudé  * page_check_range
41187b7ca9SPhilippe Mathieu-Daudé  * @start: first byte of range
42187b7ca9SPhilippe Mathieu-Daudé  * @len: length of range
43187b7ca9SPhilippe Mathieu-Daudé  * @flags: flags required for each page
44187b7ca9SPhilippe Mathieu-Daudé  *
45187b7ca9SPhilippe Mathieu-Daudé  * Return true if every page in [@start, @start+@len) has @flags set.
46187b7ca9SPhilippe Mathieu-Daudé  * Return false if any page is unmapped.  Thus testing flags == 0 is
47187b7ca9SPhilippe Mathieu-Daudé  * equivalent to testing for flags == PAGE_VALID.
48187b7ca9SPhilippe Mathieu-Daudé  */
49187b7ca9SPhilippe Mathieu-Daudé bool page_check_range(target_ulong start, target_ulong last, int flags);
50187b7ca9SPhilippe Mathieu-Daudé 
51187b7ca9SPhilippe Mathieu-Daudé /**
5262ef949bSPhilippe Mathieu-Daudé  * page_check_range_empty:
5362ef949bSPhilippe Mathieu-Daudé  * @start: first byte of range
5462ef949bSPhilippe Mathieu-Daudé  * @last: last byte of range
5562ef949bSPhilippe Mathieu-Daudé  * Context: holding mmap lock
5662ef949bSPhilippe Mathieu-Daudé  *
5762ef949bSPhilippe Mathieu-Daudé  * Return true if the entire range [@start, @last] is unmapped.
5862ef949bSPhilippe Mathieu-Daudé  * The memory lock must be held so that the caller will can ensure
5962ef949bSPhilippe Mathieu-Daudé  * the result stays true until a new mapping can be installed.
6062ef949bSPhilippe Mathieu-Daudé  */
6162ef949bSPhilippe Mathieu-Daudé bool page_check_range_empty(target_ulong start, target_ulong last);
6262ef949bSPhilippe Mathieu-Daudé 
6362ef949bSPhilippe Mathieu-Daudé /**
6462ef949bSPhilippe Mathieu-Daudé  * page_find_range_empty
6562ef949bSPhilippe Mathieu-Daudé  * @min: first byte of search range
6662ef949bSPhilippe Mathieu-Daudé  * @max: last byte of search range
6762ef949bSPhilippe Mathieu-Daudé  * @len: size of the hole required
6862ef949bSPhilippe Mathieu-Daudé  * @align: alignment of the hole required (power of 2)
6962ef949bSPhilippe Mathieu-Daudé  *
7062ef949bSPhilippe Mathieu-Daudé  * If there is a range [x, x+@len) within [@min, @max] such that
7162ef949bSPhilippe Mathieu-Daudé  * x % @align == 0, then return x.  Otherwise return -1.
7262ef949bSPhilippe Mathieu-Daudé  * The memory lock must be held, as the caller will want to ensure
7362ef949bSPhilippe Mathieu-Daudé  * the returned range stays empty until a new mapping can be installed.
7462ef949bSPhilippe Mathieu-Daudé  */
7562ef949bSPhilippe Mathieu-Daudé target_ulong page_find_range_empty(target_ulong min, target_ulong max,
7662ef949bSPhilippe Mathieu-Daudé                                    target_ulong len, target_ulong align);
7762ef949bSPhilippe Mathieu-Daudé 
7862ef949bSPhilippe Mathieu-Daudé /**
7962ef949bSPhilippe Mathieu-Daudé  * page_get_target_data(address)
8062ef949bSPhilippe Mathieu-Daudé  * @address: guest virtual address
8162ef949bSPhilippe Mathieu-Daudé  *
8262ef949bSPhilippe Mathieu-Daudé  * Return TARGET_PAGE_DATA_SIZE bytes of out-of-band data to associate
8362ef949bSPhilippe Mathieu-Daudé  * with the guest page at @address, allocating it if necessary.  The
8462ef949bSPhilippe Mathieu-Daudé  * caller should already have verified that the address is valid.
8562ef949bSPhilippe Mathieu-Daudé  *
8662ef949bSPhilippe Mathieu-Daudé  * The memory will be freed when the guest page is deallocated,
8762ef949bSPhilippe Mathieu-Daudé  * e.g. with the munmap system call.
8862ef949bSPhilippe Mathieu-Daudé  */
8962ef949bSPhilippe Mathieu-Daudé __attribute__((returns_nonnull))
9062ef949bSPhilippe Mathieu-Daudé void *page_get_target_data(target_ulong address);
9162ef949bSPhilippe Mathieu-Daudé 
92970ae60eSPhilippe Mathieu-Daudé typedef int (*walk_memory_regions_fn)(void *, target_ulong,
93970ae60eSPhilippe Mathieu-Daudé                                       target_ulong, unsigned long);
94970ae60eSPhilippe Mathieu-Daudé 
95970ae60eSPhilippe Mathieu-Daudé int walk_memory_regions(void *, walk_memory_regions_fn);
96970ae60eSPhilippe Mathieu-Daudé 
97970ae60eSPhilippe Mathieu-Daudé void page_dump(FILE *f);
98634f1455SPhilippe Mathieu-Daudé 
99634f1455SPhilippe Mathieu-Daudé #endif
100