1#![expect(non_camel_case_types)]
8#![expect(non_upper_case_globals)]
9#![no_std]
10pub use event_bindings::{AutounsignalEvent, Event};
11use page_bindings::vm_page_t;
12pub use zx_types::{zx_duration_mono_t, zx_instant_mono_t, zx_paddr_t};
13pub type Thread = core::ffi::c_void;
14pub type VmCowPages = *const core::ffi::c_void;
15pub type VmDebugCompressor = core::ffi::c_void;
16pub type VmPageDoublyLinkedList = usize;
17
18#[derive(PartialEq, Eq, Copy, Clone, Debug, Hash)]
19#[repr(C, align(8))]
20pub struct __BindgenOpaqueArray8<T>(pub T);
21impl<T: Copy + Default, const N: usize> Default for __BindgenOpaqueArray8<[T; N]> {
22 fn default() -> Self {
23 Self([<T as Default>::default(); N])
24 }
25}
26#[repr(C)]
27#[derive(Debug, Copy, Clone)]
28pub struct std_atomic<_Tp> {
29 pub _phantom_0: ::core::marker::PhantomData<::core::cell::UnsafeCell<_Tp>>,
30 pub _address: u8,
31}
32pub type std_atomic___base = u8;
33#[repr(C)]
34#[derive(Debug, Copy, Clone)]
35pub struct RelaxedAtomic<T> {
36 pub _phantom_0: ::core::marker::PhantomData<::core::cell::UnsafeCell<T>>,
37 pub _address: u8,
38}
39unsafe extern "C" {
40 pub fn cpp_page_queues_stop_threads(queues: *mut PageQueues);
41}
42#[repr(C)]
43pub struct PageQueues {
44 pub list_lock_: __BindgenOpaqueArray8<[u8; 24usize]>,
45 pub lock_: __BindgenOpaqueArray8<[u8; 24usize]>,
46 pub aging_event_: *mut Event,
47 pub aging_disabled_: bool,
48 pub __bindgen_padding_0: [u8; 7usize],
49 pub last_age_time_: __BindgenOpaqueArray8<[u8; 8usize]>,
50 pub last_age_reason_: PageQueues_AgeReason,
51 pub active_ratio_triggered_: bool,
52 pub __bindgen_padding_1: [u8; 3usize],
53 pub mru_event_: AutounsignalEvent,
54 pub lru_event_: AutounsignalEvent,
55 pub lru_action_: PageQueues_LruAction,
56 pub __bindgen_padding_2: [u8; 4usize],
57 pub page_queues_: __BindgenOpaqueArray8<[u8; 128usize]>,
58 pub isolate_queues_: __BindgenOpaqueArray8<[u8; 16usize]>,
59 pub lru_gen_: __BindgenOpaqueArray8<[u8; 8usize]>,
60 pub mru_gen_: __BindgenOpaqueArray8<[u8; 8usize]>,
61 pub page_queue_counts_: __BindgenOpaqueArray8<[u8; 128usize]>,
62 pub lazy_active_ratio_aging_skips_: __BindgenOpaqueArray8<[u8; 8usize]>,
63 pub consecutive_skipped_sweeps_: u32,
64 pub shutdown_threads_: u8,
65 pub __bindgen_padding_3: [u8; 3usize],
66 pub mru_thread_: *mut Thread,
67 pub lru_thread_: *mut Thread,
68 pub debug_compressor_: __BindgenOpaqueArray8<[u8; 8usize]>,
69 pub min_mru_rotate_time_: zx_duration_mono_t,
70 pub max_mru_rotate_time_: zx_duration_mono_t,
71 pub zero_fork_is_reclaimable_: u8,
72 pub anonymous_is_reclaimable_: u8,
73 pub __bindgen_padding_4: [u8; 6usize],
74 pub active_ratio_multiplier_: i64,
75}
76#[repr(i32)]
77#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
78pub enum PageQueues_AgeReason {
79 Timeout = 0,
80 ActiveRatio = 1,
81 Manual = 2,
82}
83#[repr(C)]
84#[derive(Debug, Copy, Clone)]
85pub struct PageQueues_ReclaimCounts {
86 pub total: usize,
87 pub newest: usize,
88 pub oldest: usize,
89}
90#[repr(C)]
91#[derive(Debug, Copy, Clone)]
92pub struct PageQueues_Counts {
93 pub reclaim: __BindgenOpaqueArray8<[u8; 64usize]>,
94 pub reclaim_isolate: usize,
95 pub pager_backed_dirty: usize,
96 pub anonymous: usize,
97 pub wired: usize,
98 pub anonymous_zero_fork: usize,
99 pub failed_reclaim: usize,
100 pub high_priority: usize,
101}
102#[repr(C)]
103#[derive(Debug, Copy, Clone)]
104pub struct PageQueues_ActiveInactiveCounts {
105 pub active: usize,
106 pub inactive: usize,
107}
108#[repr(i32)]
109#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
110pub enum PageQueues_LruAction {
111 None = 0,
112 EvictOnly = 1,
113 CompressOnly = 2,
114 EvictAndCompress = 3,
115}
116pub const PageQueues_PageQueue_PageQueueNone: PageQueues_PageQueue = 0;
117pub const PageQueues_PageQueue_PageQueueAnonymous: PageQueues_PageQueue = 1;
118pub const PageQueues_PageQueue_PageQueueWired: PageQueues_PageQueue = 2;
119pub const PageQueues_PageQueue_PageQueueHighPriority: PageQueues_PageQueue = 3;
120pub const PageQueues_PageQueue_PageQueueAnonymousZeroFork: PageQueues_PageQueue = 4;
121pub const PageQueues_PageQueue_PageQueuePagerBackedDirty: PageQueues_PageQueue = 5;
122pub const PageQueues_PageQueue_PageQueueFailedReclaim: PageQueues_PageQueue = 6;
123pub const PageQueues_PageQueue_PageQueueReclaimIsolate: PageQueues_PageQueue = 7;
124pub const PageQueues_PageQueue_PageQueueReclaimBase: PageQueues_PageQueue = 8;
125pub const PageQueues_PageQueue_PageQueueReclaimLast: PageQueues_PageQueue = 15;
126pub const PageQueues_PageQueue_PageQueueNumQueues: PageQueues_PageQueue = 16;
127pub type PageQueues_PageQueue = u8;
128pub const PageQueues_kNumReclaim: usize = 8;
129pub const PageQueues_kNumActiveQueues: usize = 2;
130pub const PageQueues_kActiveInactiveErrorMargin: usize = 512;
131pub const PageQueues_kNumOldestQueues: usize = 2;
132pub const PageQueues_kIsolateQueueDontNeed: usize = 0;
133pub const PageQueues_kIsolateQueueStandard: usize = 1;
134pub const PageQueues_kNumIsolateQueues: usize = 2;
135pub const PageQueues_kDefaultMinMruRotateTime: zx_duration_mono_t = 5000000000;
136pub const PageQueues_kDefaultMaxMruRotateTime: zx_duration_mono_t = 5000000000;
137pub const PageQueues_kDefaultActiveRatioMultiplier: u64 = 0;
138pub const PageQueues_kOpBatchSize: usize = 64;
139#[repr(C)]
140#[derive(Debug, Copy, Clone)]
141pub struct PageQueuesVmoBacklink {
142 pub cow: *mut VmCowPages,
143 pub page: *mut vm_page_t,
144 pub offset: u64,
145}
146unsafe extern "C" {
147 pub fn cpp_page_queues_init(queues: *mut u8);
148}
149unsafe extern "C" {
150 pub fn cpp_page_queues_set_wired(
151 queues: *mut PageQueues,
152 page: *mut vm_page_t,
153 cow: *mut VmCowPages,
154 offset: u64,
155 );
156}
157unsafe extern "C" {
158 pub fn cpp_page_queues_set_anonymous(
159 queues: *mut PageQueues,
160 page: *mut vm_page_t,
161 cow: *mut VmCowPages,
162 offset: u64,
163 skip_reclaim: bool,
164 );
165}
166unsafe extern "C" {
167 pub fn cpp_page_queues_set_reclaim(
168 queues: *mut PageQueues,
169 page: *mut vm_page_t,
170 cow: *mut VmCowPages,
171 offset: u64,
172 );
173}
174unsafe extern "C" {
175 pub fn cpp_page_queues_set_pager_backed_dirty(
176 queues: *mut PageQueues,
177 page: *mut vm_page_t,
178 cow: *mut VmCowPages,
179 offset: u64,
180 );
181}
182unsafe extern "C" {
183 pub fn cpp_page_queues_set_anonymous_zero_fork(
184 queues: *mut PageQueues,
185 page: *mut vm_page_t,
186 cow: *mut VmCowPages,
187 offset: u64,
188 );
189}
190unsafe extern "C" {
191 pub fn cpp_page_queues_set_high_priority(
192 queues: *mut PageQueues,
193 page: *mut vm_page_t,
194 cow: *mut VmCowPages,
195 offset: u64,
196 );
197}
198unsafe extern "C" {
199 pub fn cpp_page_queues_move_to_wired(queues: *mut PageQueues, page: *mut vm_page_t);
200}
201unsafe extern "C" {
202 pub fn cpp_page_queues_move_to_anonymous(
203 queues: *mut PageQueues,
204 page: *mut vm_page_t,
205 skip_reclaim: bool,
206 );
207}
208unsafe extern "C" {
209 pub fn cpp_page_queues_move_to_reclaim(queues: *mut PageQueues, page: *mut vm_page_t);
210}
211unsafe extern "C" {
212 pub fn cpp_page_queues_move_to_reclaim_dont_need(queues: *mut PageQueues, page: *mut vm_page_t);
213}
214unsafe extern "C" {
215 pub fn cpp_page_queues_move_to_pager_backed_dirty(
216 queues: *mut PageQueues,
217 page: *mut vm_page_t,
218 );
219}
220unsafe extern "C" {
221 pub fn cpp_page_queues_move_to_high_priority(queues: *mut PageQueues, page: *mut vm_page_t);
222}
223unsafe extern "C" {
224 pub fn cpp_page_queues_move_anonymous_to_anonymous_zero_fork(
225 queues: *mut PageQueues,
226 page: *mut vm_page_t,
227 );
228}
229unsafe extern "C" {
230 pub fn cpp_page_queues_compress_failed(queues: *mut PageQueues, page: *mut vm_page_t);
231}
232unsafe extern "C" {
233 pub fn cpp_page_queues_change_object_offset(
234 queues: *mut PageQueues,
235 page: *mut vm_page_t,
236 cow: *mut VmCowPages,
237 page_offset: u64,
238 );
239}
240unsafe extern "C" {
241 pub fn cpp_page_queues_change_object_offset_array(
242 queues: *mut PageQueues,
243 pages: *mut *mut vm_page_t,
244 cow: *mut VmCowPages,
245 offsets: *const u64,
246 count: usize,
247 );
248}
249unsafe extern "C" {
250 pub fn cpp_page_queues_change_object_offset_locked_list(
251 queues: *mut PageQueues,
252 page: *mut vm_page_t,
253 cow: *mut VmCowPages,
254 offset: u64,
255 );
256}
257unsafe extern "C" {
258 pub fn cpp_page_queues_remove(queues: *mut PageQueues, page: *mut vm_page_t);
259}
260unsafe extern "C" {
261 pub fn cpp_page_queues_remove_array_into_list(
262 queues: *mut PageQueues,
263 pages: *mut *mut vm_page_t,
264 count: usize,
265 out_list: *mut VmPageDoublyLinkedList,
266 );
267}
268unsafe extern "C" {
269 pub fn cpp_page_queues_mark_accessed(queues: *mut PageQueues, page: *mut vm_page_t);
270}
271unsafe extern "C" {
272 pub fn cpp_page_queues_get_lock(queues: *mut PageQueues) -> *mut ::core::ffi::c_void;
273}
274unsafe extern "C" {
275 pub fn cpp_page_queues_string_from_age_reason(reason: i32) -> *const ::core::ffi::c_char;
276}
277unsafe extern "C" {
278 pub fn cpp_page_queues_rotate_reclaim_queues(queues: *mut PageQueues);
279}
280unsafe extern "C" {
281 pub fn cpp_page_queues_pop_anonymous_zero_fork(
282 queues: *mut PageQueues,
283 out_backlink: *mut PageQueuesVmoBacklink,
284 ) -> bool;
285}
286unsafe extern "C" {
287 pub fn cpp_page_queues_peek_isolate(
288 queues: *mut PageQueues,
289 lowest_queue: usize,
290 out_backlink: *mut PageQueuesVmoBacklink,
291 ) -> bool;
292}
293unsafe extern "C" {
294 pub fn cpp_page_queues_get_cow_for_loaned_page(
295 queues: *mut PageQueues,
296 page: *mut vm_page_t,
297 out_backlink: *mut PageQueuesVmoBacklink,
298 ) -> bool;
299}
300unsafe extern "C" {
301 pub fn cpp_page_queues_get_reclaim_queue_counts(
302 queues: *const PageQueues,
303 out_counts: *mut PageQueues_ReclaimCounts,
304 );
305}
306unsafe extern "C" {
307 pub fn cpp_page_queues_queue_counts(
308 queues: *const PageQueues,
309 out_counts: *mut PageQueues_Counts,
310 );
311}
312unsafe extern "C" {
313 pub fn cpp_page_queues_get_active_inactive_counts(
314 queues: *const PageQueues,
315 out_counts: *mut PageQueues_ActiveInactiveCounts,
316 );
317}
318unsafe extern "C" {
319 pub fn cpp_page_queues_dump(queues: *mut PageQueues);
320}
321unsafe extern "C" {
322 pub fn cpp_page_queues_get_lru_pages_compressed() -> u64;
323}
324unsafe extern "C" {
325 pub fn cpp_page_queues_enable_anonymous_reclaim(queues: *mut PageQueues, zero_forks: bool);
326}
327unsafe extern "C" {
328 pub fn cpp_page_queues_reclaim_is_only_pager_backed(queues: *const PageQueues) -> bool;
329}
330unsafe extern "C" {
331 pub fn cpp_page_queues_is_page_reclaimable(page: *const vm_page_t) -> bool;
332}
333unsafe extern "C" {
334 pub fn cpp_page_queues_debug_page_is_reclaim(
335 queues: *const PageQueues,
336 page: *const vm_page_t,
337 out_queue: *mut usize,
338 ) -> bool;
339}
340unsafe extern "C" {
341 pub fn cpp_page_queues_debug_page_is_reclaim_isolate(
342 queues: *const PageQueues,
343 page: *const vm_page_t,
344 ) -> bool;
345}
346unsafe extern "C" {
347 pub fn cpp_page_queues_debug_page_is_pager_backed_dirty(
348 queues: *const PageQueues,
349 page: *const vm_page_t,
350 ) -> bool;
351}
352unsafe extern "C" {
353 pub fn cpp_page_queues_debug_page_is_anonymous(
354 queues: *const PageQueues,
355 page: *const vm_page_t,
356 ) -> bool;
357}
358unsafe extern "C" {
359 pub fn cpp_page_queues_debug_page_is_anonymous_zero_fork(
360 queues: *const PageQueues,
361 page: *const vm_page_t,
362 ) -> bool;
363}
364unsafe extern "C" {
365 pub fn cpp_page_queues_debug_page_is_any_anonymous(
366 queues: *const PageQueues,
367 page: *const vm_page_t,
368 ) -> bool;
369}
370unsafe extern "C" {
371 pub fn cpp_page_queues_debug_page_is_wired(
372 queues: *const PageQueues,
373 page: *const vm_page_t,
374 ) -> bool;
375}
376unsafe extern "C" {
377 pub fn cpp_page_queues_debug_page_is_high_priority(
378 queues: *const PageQueues,
379 page: *const vm_page_t,
380 ) -> bool;
381}
382unsafe extern "C" {
383 pub fn cpp_page_queues_start_threads(
384 queues: *mut PageQueues,
385 min_mru_rotate_time: zx_duration_mono_t,
386 max_mru_rotate_time: zx_duration_mono_t,
387 );
388}
389unsafe extern "C" {
390 pub fn cpp_page_queues_start_debug_compressor(queues: *mut PageQueues);
391}
392unsafe extern "C" {
393 pub fn cpp_page_queues_set_active_ratio_multiplier(queues: *mut PageQueues, multiplier: u32);
394}
395unsafe extern "C" {
396 pub fn cpp_page_queues_set_lru_action(queues: *mut PageQueues, action: i32);
397}
398unsafe extern "C" {
399 pub fn cpp_page_queues_disable_aging(queues: *mut PageQueues);
400}
401unsafe extern "C" {
402 pub fn cpp_page_queues_enable_aging(queues: *mut PageQueues);
403}
404unsafe extern "C" {
405 pub fn cpp_page_queues_set_aging_event(queues: *mut PageQueues, event: *mut Event);
406}
407unsafe extern "C" {
408 pub fn cpp_page_queues_debug_get_lru_thread(queues: *mut PageQueues) -> *mut Thread;
409}
410unsafe extern "C" {
411 pub fn cpp_page_queues_debug_get_mru_thread(queues: *mut PageQueues) -> *mut Thread;
412}
413unsafe extern "C" {
414 pub fn cpp_debug_compressor_init(compressor: *mut u8);
415}
416unsafe extern "C" {
417 pub fn cpp_debug_compressor_destroy(compressor: *mut VmDebugCompressor);
418}