Pml4Entry

Struct Pml4Entry 

Source
#[repr(transparent)]
pub struct Pml4Entry(u64);
Expand description

L4 PML4E — pointer to a PDPT (non-leaf; PS must be 0).

This entry never maps memory directly. Bits that are meaningful only on leaf entries (e.g., dirty, global) are ignored here.

  • Physical address (bits 51:12) is a 4 KiB-aligned PDPT.
  • NX participates in permission intersection across the walk.
  • PKU may be repurposed as OS-available when not supported.

Reference: AMD APM / Intel SDM paging structures (x86-64).

Tuple Fields§

§0: u64

Implementations§

Source§

impl Pml4Entry

Source

const PRESENT_BITS: usize = 1usize

Source

const PRESENT_OFFSET: usize = 0usize

Source

const WRITABLE_BITS: usize = 1usize

Source

const WRITABLE_OFFSET: usize = 1usize

Source

const USER_BITS: usize = 1usize

Source

const USER_OFFSET: usize = 2usize

Source

const WRITE_THROUGH_BITS: usize = 1usize

Source

const WRITE_THROUGH_OFFSET: usize = 3usize

Source

const CACHE_DISABLE_BITS: usize = 1usize

Source

const CACHE_DISABLE_OFFSET: usize = 4usize

Source

const ACCESSED_BITS: usize = 1usize

Source

const ACCESSED_OFFSET: usize = 5usize

Source

const OS_AVAILABLE_LOW_BITS: usize = 3usize

Source

const OS_AVAILABLE_LOW_OFFSET: usize = 9usize

Source

const PHYS_ADDR_51_12_BITS: usize = 40usize

Source

const PHYS_ADDR_51_12_OFFSET: usize = 12usize

Source

const OS_AVAILABLE_HIGH_BITS: usize = 7usize

Source

const OS_AVAILABLE_HIGH_OFFSET: usize = 52usize

Source

const PROTECTION_KEY_BITS: usize = 4usize

Source

const PROTECTION_KEY_OFFSET: usize = 59usize

Source

const NO_EXECUTE_BITS: usize = 1usize

Source

const NO_EXECUTE_OFFSET: usize = 63usize

Source

pub const fn new() -> Self

Creates a new default initialized bitfield.

Source

pub const fn from_bits(bits: u64) -> Self

Convert from bits.

Source

pub const fn into_bits(self) -> u64

Convert into bits.

Source

pub const fn present(&self) -> bool

Present (bit 0): valid entry if set.

When clear, the entry is not present and most other fields are ignored.

Bits: 0..1

Source

pub const fn with_present_checked(self, value: bool) -> Result<Self, ()>

Present (bit 0): valid entry if set.

When clear, the entry is not present and most other fields are ignored.

Bits: 0..1

Source

pub const fn with_present(self, value: bool) -> Self

Present (bit 0): valid entry if set.

When clear, the entry is not present and most other fields are ignored.

Bits: 0..1

Source

pub const fn set_present(&mut self, value: bool)

Present (bit 0): valid entry if set.

When clear, the entry is not present and most other fields are ignored.

Bits: 0..1

Source

pub const fn set_present_checked(&mut self, value: bool) -> Result<(), ()>

Present (bit 0): valid entry if set.

When clear, the entry is not present and most other fields are ignored.

Bits: 0..1

Source

pub const fn writable(&self) -> bool

Writable (bit 1): write permission.

Intersects with lower-level permissions; supervisor write protection, SMEP/SMAP, CR0.WP, and U/S checks apply.

Bits: 1..2

Source

pub const fn with_writable_checked(self, value: bool) -> Result<Self, ()>

Writable (bit 1): write permission.

Intersects with lower-level permissions; supervisor write protection, SMEP/SMAP, CR0.WP, and U/S checks apply.

Bits: 1..2

Source

pub const fn with_writable(self, value: bool) -> Self

Writable (bit 1): write permission.

Intersects with lower-level permissions; supervisor write protection, SMEP/SMAP, CR0.WP, and U/S checks apply.

Bits: 1..2

Source

pub const fn set_writable(&mut self, value: bool)

Writable (bit 1): write permission.

Intersects with lower-level permissions; supervisor write protection, SMEP/SMAP, CR0.WP, and U/S checks apply.

Bits: 1..2

Source

pub const fn set_writable_checked(&mut self, value: bool) -> Result<(), ()>

Writable (bit 1): write permission.

Intersects with lower-level permissions; supervisor write protection, SMEP/SMAP, CR0.WP, and U/S checks apply.

Bits: 1..2

Source

pub const fn user(&self) -> bool

User/Supervisor (bit 2): allow user-mode access if set.

If clear, access is restricted to supervisor (ring 0).

Bits: 2..3

Source

pub const fn with_user_checked(self, value: bool) -> Result<Self, ()>

User/Supervisor (bit 2): allow user-mode access if set.

If clear, access is restricted to supervisor (ring 0).

Bits: 2..3

Source

pub const fn with_user(self, value: bool) -> Self

User/Supervisor (bit 2): allow user-mode access if set.

If clear, access is restricted to supervisor (ring 0).

Bits: 2..3

Source

pub const fn set_user(&mut self, value: bool)

User/Supervisor (bit 2): allow user-mode access if set.

If clear, access is restricted to supervisor (ring 0).

Bits: 2..3

Source

pub const fn set_user_checked(&mut self, value: bool) -> Result<(), ()>

User/Supervisor (bit 2): allow user-mode access if set.

If clear, access is restricted to supervisor (ring 0).

Bits: 2..3

Source

pub const fn write_through(&self) -> bool

Page Write-Through (PWT, bit 3): write-through caching policy.

Effective only if caching isn’t disabled for the mapping.

Bits: 3..4

Source

pub const fn with_write_through_checked(self, value: bool) -> Result<Self, ()>

Page Write-Through (PWT, bit 3): write-through caching policy.

Effective only if caching isn’t disabled for the mapping.

Bits: 3..4

Source

pub const fn with_write_through(self, value: bool) -> Self

Page Write-Through (PWT, bit 3): write-through caching policy.

Effective only if caching isn’t disabled for the mapping.

Bits: 3..4

Source

pub const fn set_write_through(&mut self, value: bool)

Page Write-Through (PWT, bit 3): write-through caching policy.

Effective only if caching isn’t disabled for the mapping.

Bits: 3..4

Source

pub const fn set_write_through_checked(&mut self, value: bool) -> Result<(), ()>

Page Write-Through (PWT, bit 3): write-through caching policy.

Effective only if caching isn’t disabled for the mapping.

Bits: 3..4

Source

pub const fn cache_disable(&self) -> bool

Page Cache Disable (PCD, bit 4): disable caching if set.

Strongly impacts performance; use for MMIO or compliance with device requirements. Effective policy is the intersection across the walk.

Bits: 4..5

Source

pub const fn with_cache_disable_checked(self, value: bool) -> Result<Self, ()>

Page Cache Disable (PCD, bit 4): disable caching if set.

Strongly impacts performance; use for MMIO or compliance with device requirements. Effective policy is the intersection across the walk.

Bits: 4..5

Source

pub const fn with_cache_disable(self, value: bool) -> Self

Page Cache Disable (PCD, bit 4): disable caching if set.

Strongly impacts performance; use for MMIO or compliance with device requirements. Effective policy is the intersection across the walk.

Bits: 4..5

Source

pub const fn set_cache_disable(&mut self, value: bool)

Page Cache Disable (PCD, bit 4): disable caching if set.

Strongly impacts performance; use for MMIO or compliance with device requirements. Effective policy is the intersection across the walk.

Bits: 4..5

Source

pub const fn set_cache_disable_checked(&mut self, value: bool) -> Result<(), ()>

Page Cache Disable (PCD, bit 4): disable caching if set.

Strongly impacts performance; use for MMIO or compliance with device requirements. Effective policy is the intersection across the walk.

Bits: 4..5

Source

pub const fn accessed(&self) -> bool

Accessed (A, bit 5): set by CPU on first access via this entry.

Software may clear to track usage; not a permission bit.

Bits: 5..6

Source

pub const fn with_accessed_checked(self, value: bool) -> Result<Self, ()>

Accessed (A, bit 5): set by CPU on first access via this entry.

Software may clear to track usage; not a permission bit.

Bits: 5..6

Source

pub const fn with_accessed(self, value: bool) -> Self

Accessed (A, bit 5): set by CPU on first access via this entry.

Software may clear to track usage; not a permission bit.

Bits: 5..6

Source

pub const fn set_accessed(&mut self, value: bool)

Accessed (A, bit 5): set by CPU on first access via this entry.

Software may clear to track usage; not a permission bit.

Bits: 5..6

Source

pub const fn set_accessed_checked(&mut self, value: bool) -> Result<(), ()>

Accessed (A, bit 5): set by CPU on first access via this entry.

Software may clear to track usage; not a permission bit.

Bits: 5..6

Source

pub const fn os_available_low(&self) -> u8

OS-available low (bits 9..11): not interpreted by hardware.

Bits: 9..12

Source

pub const fn with_os_available_low_checked(self, value: u8) -> Result<Self, ()>

OS-available low (bits 9..11): not interpreted by hardware.

Bits: 9..12

Source

pub const fn with_os_available_low(self, value: u8) -> Self

OS-available low (bits 9..11): not interpreted by hardware.

Bits: 9..12

Source

pub const fn set_os_available_low(&mut self, value: u8)

OS-available low (bits 9..11): not interpreted by hardware.

Bits: 9..12

Source

pub const fn set_os_available_low_checked( &mut self, value: u8, ) -> Result<(), ()>

OS-available low (bits 9..11): not interpreted by hardware.

Bits: 9..12

Source

const fn phys_addr_51_12(&self) -> u64

Next-level table physical address (bits 12..51).

Stores the PDPT base (4 KiB-aligned). The low 12 bits are omitted.

Bits: 12..52

Source

const fn with_phys_addr_51_12_checked(self, value: u64) -> Result<Self, ()>

Next-level table physical address (bits 12..51).

Stores the PDPT base (4 KiB-aligned). The low 12 bits are omitted.

Bits: 12..52

Source

const fn with_phys_addr_51_12(self, value: u64) -> Self

Next-level table physical address (bits 12..51).

Stores the PDPT base (4 KiB-aligned). The low 12 bits are omitted.

Bits: 12..52

Source

const fn set_phys_addr_51_12(&mut self, value: u64)

Next-level table physical address (bits 12..51).

Stores the PDPT base (4 KiB-aligned). The low 12 bits are omitted.

Bits: 12..52

Source

const fn set_phys_addr_51_12_checked(&mut self, value: u64) -> Result<(), ()>

Next-level table physical address (bits 12..51).

Stores the PDPT base (4 KiB-aligned). The low 12 bits are omitted.

Bits: 12..52

Source

pub const fn os_available_high(&self) -> u8

OS-available high (bits 52..58): not interpreted by hardware.

Bits: 52..59

Source

pub const fn with_os_available_high_checked(self, value: u8) -> Result<Self, ()>

OS-available high (bits 52..58): not interpreted by hardware.

Bits: 52..59

Source

pub const fn with_os_available_high(self, value: u8) -> Self

OS-available high (bits 52..58): not interpreted by hardware.

Bits: 52..59

Source

pub const fn set_os_available_high(&mut self, value: u8)

OS-available high (bits 52..58): not interpreted by hardware.

Bits: 52..59

Source

pub const fn set_os_available_high_checked( &mut self, value: u8, ) -> Result<(), ()>

OS-available high (bits 52..58): not interpreted by hardware.

Bits: 52..59

Source

pub const fn protection_key(&self) -> u8

Protection Key / OS use (bits 59..62).

If PKU is supported and enabled, these bits select the protection key; otherwise they may be used by the OS.

Bits: 59..63

Source

pub const fn with_protection_key_checked(self, value: u8) -> Result<Self, ()>

Protection Key / OS use (bits 59..62).

If PKU is supported and enabled, these bits select the protection key; otherwise they may be used by the OS.

Bits: 59..63

Source

pub const fn with_protection_key(self, value: u8) -> Self

Protection Key / OS use (bits 59..62).

If PKU is supported and enabled, these bits select the protection key; otherwise they may be used by the OS.

Bits: 59..63

Source

pub const fn set_protection_key(&mut self, value: u8)

Protection Key / OS use (bits 59..62).

If PKU is supported and enabled, these bits select the protection key; otherwise they may be used by the OS.

Bits: 59..63

Source

pub const fn set_protection_key_checked(&mut self, value: u8) -> Result<(), ()>

Protection Key / OS use (bits 59..62).

If PKU is supported and enabled, these bits select the protection key; otherwise they may be used by the OS.

Bits: 59..63

Source

pub const fn no_execute(&self) -> bool

No-Execute (NX, bit 63 / XD on Intel).

When set and EFER.NXE is enabled, instruction fetch is disallowed through this entry (permission intersection applies).

Bits: 63..64

Source

pub const fn with_no_execute_checked(self, value: bool) -> Result<Self, ()>

No-Execute (NX, bit 63 / XD on Intel).

When set and EFER.NXE is enabled, instruction fetch is disallowed through this entry (permission intersection applies).

Bits: 63..64

Source

pub const fn with_no_execute(self, value: bool) -> Self

No-Execute (NX, bit 63 / XD on Intel).

When set and EFER.NXE is enabled, instruction fetch is disallowed through this entry (permission intersection applies).

Bits: 63..64

Source

pub const fn set_no_execute(&mut self, value: bool)

No-Execute (NX, bit 63 / XD on Intel).

When set and EFER.NXE is enabled, instruction fetch is disallowed through this entry (permission intersection applies).

Bits: 63..64

Source

pub const fn set_no_execute_checked(&mut self, value: bool) -> Result<(), ()>

No-Execute (NX, bit 63 / XD on Intel).

When set and EFER.NXE is enabled, instruction fetch is disallowed through this entry (permission intersection applies).

Bits: 63..64

Source§

impl Pml4Entry

Source

pub const fn zero() -> Self

Create a zero (non-present) entry with all bits cleared.

Source

pub const fn next_table(self) -> Option<PhysicalPage<Size4K>>

If present, return the physical page of the next-level PDPT.

Returns None if the entry is not present. The returned page is always 4 KiB-aligned as required for page-table bases.

Source

pub const fn present_with( flags: VirtualMemoryPageBits, next_pdpt_page: PhysicalPage<Size4K>, ) -> Self

Build a PML4 entry that points to the given PDPT page and applies the provided flags.

§Requirements
  • flags.large_page() must be false (PS=0). Enforced via debug_assert!.
  • This function sets present=1 and the physical base to next_pdpt_page.base().
Source

pub const fn with_physical_address(self, phys: PhysicalPage<Size4K>) -> Self

Set the PDPT base address (must be 4 KiB-aligned).

Source

pub const fn set_physical_address(&mut self, phys: PhysicalPage<Size4K>)

Set the PDPT base address (must be 4 KiB-aligned).

Source

pub const fn physical_address(self) -> PhysicalPage<Size4K>

Get the PDPT base address (4 KiB-aligned).

Trait Implementations§

Source§

impl Clone for Pml4Entry

Source§

fn clone(&self) -> Pml4Entry

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Pml4Entry

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for Pml4Entry

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl From<Pml4Entry> for VirtualMemoryPageBits

Source§

fn from(e: Pml4Entry) -> Self

Converts to this type from the input type.
Source§

impl From<Pml4Entry> for u64

Source§

fn from(v: Pml4Entry) -> u64

Converts to this type from the input type.
Source§

impl From<u64> for Pml4Entry

Source§

fn from(v: u64) -> Self

Converts to this type from the input type.
Source§

impl Copy for Pml4Entry

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.