| // Copyright 2016 The Fuchsia Authors |
| // Copyright (c) 2014 Travis Geiselbrecht |
| // |
| // Use of this source code is governed by a MIT-style |
| // license that can be found in the LICENSE file or at |
| // https://opensource.org/licenses/MIT |
| |
| #pragma once |
| |
| #include <list.h> |
| #include <zircon/compiler.h> |
| #include <stdint.h> |
| |
| // forward declare |
| class VmObject; |
| |
| #define VM_PAGE_OBJECT_PIN_COUNT_BITS 5 |
| #define VM_PAGE_OBJECT_MAX_PIN_COUNT ((1ul << VM_PAGE_OBJECT_PIN_COUNT_BITS) - 1) |
| |
| // core per page structure |
| typedef struct vm_page { |
| struct { |
| uint32_t flags : 8; |
| uint32_t state : 3; |
| }; |
| uint32_t map_count; |
| |
| union { |
| struct { |
| // in allocated/just freed state, use a linked list to hold the page in a queue |
| struct list_node node; |
| } free; |
| struct { |
| // attached to a vm object |
| uint64_t offset; // unused currently |
| VmObject* obj; // unused currently |
| |
| uint8_t pin_count : VM_PAGE_OBJECT_PIN_COUNT_BITS; |
| // If true, one pin slot is used by the VmObject to keep a run |
| // contiguous. |
| bool contiguous_pin : 1; |
| } object; |
| |
| uint8_t pad[24]; // pad out to 32 bytes |
| }; |
| } vm_page_t; |
| |
| // pmm will maintain pages of this size |
| #define VM_PAGE_STRUCT_SIZE (sizeof(vm_page_t)) |
| static_assert(sizeof(vm_page_t) == 32, ""); |
| |
| enum vm_page_state { |
| VM_PAGE_STATE_FREE, |
| VM_PAGE_STATE_ALLOC, |
| VM_PAGE_STATE_WIRED, |
| VM_PAGE_STATE_HEAP, |
| VM_PAGE_STATE_OBJECT, |
| VM_PAGE_STATE_MMU, /* allocated to serve arch-specific mmu purposes */ |
| |
| _VM_PAGE_STATE_COUNT |
| }; |
| |
| // helpers |
| static inline bool page_is_free(const vm_page_t* page) { |
| return page->state == VM_PAGE_STATE_FREE; |
| } |
| |
| const char* page_state_to_string(unsigned int state); |
| void dump_page(const vm_page_t* page); |