Trait Fence

Source
pub trait Fence {
    // Required methods
    fn remote_fence_i(&self, hart_mask: HartMask) -> SbiRet;
    fn remote_sfence_vma(
        &self,
        hart_mask: HartMask,
        start_addr: usize,
        size: usize,
    ) -> SbiRet;
    fn remote_sfence_vma_asid(
        &self,
        hart_mask: HartMask,
        start_addr: usize,
        size: usize,
        asid: usize,
    ) -> SbiRet;

    // Provided methods
    fn remote_hfence_gvma_vmid(
        &self,
        hart_mask: HartMask,
        start_addr: usize,
        size: usize,
        vmid: usize,
    ) -> SbiRet { ... }
    fn remote_hfence_gvma(
        &self,
        hart_mask: HartMask,
        start_addr: usize,
        size: usize,
    ) -> SbiRet { ... }
    fn remote_hfence_vvma_asid(
        &self,
        hart_mask: HartMask,
        start_addr: usize,
        size: usize,
        asid: usize,
    ) -> SbiRet { ... }
    fn remote_hfence_vvma(
        &self,
        hart_mask: HartMask,
        start_addr: usize,
        size: usize,
    ) -> SbiRet { ... }
}
Expand description

Remote Fence support extension.

The remote fence function acts as a full TLB flush if

  • start_addr and size are both 0, or
  • size is equal to usize::MAX.

Required Methods§

Source

fn remote_fence_i(&self, hart_mask: HartMask) -> SbiRet

Instructs remote harts to execute FENCE.I instruction.

§Return value

Returns SbiRet::success() when a remote fence was sent to all the targeted harts successfully.

Source

fn remote_sfence_vma( &self, hart_mask: HartMask, start_addr: usize, size: usize, ) -> SbiRet

Instructs the remote harts to execute one or more SFENCE.VMA instructions, covering the range of virtual addresses between start_addr and size.

§Return value

The possible return error codes returned in SbiRet.error are shown in the table below:

Return codeDescription
SbiRet::success()A remote fence was sent to all the targeted harts successfully.
SbiRet::invalid_address()start_addr or size is not valid.
Source

fn remote_sfence_vma_asid( &self, hart_mask: HartMask, start_addr: usize, size: usize, asid: usize, ) -> SbiRet

Instruct the remote harts to execute one or more SFENCE.VMA instructions, covering the range of virtual addresses between start_addr and size. This covers only the given address space by asid.

§Return value

The possible return error codes returned in SbiRet.error are shown in the table below:

Return codeDescription
SbiRet::success()A remote fence was sent to all the targeted harts successfully.
SbiRet::invalid_address()start_addr or size is not valid.

Provided Methods§

Source

fn remote_hfence_gvma_vmid( &self, hart_mask: HartMask, start_addr: usize, size: usize, vmid: usize, ) -> SbiRet

Instruct the remote harts to execute one or more HFENCE.GVMA instructions, covering the range of guest physical addresses between start_addr and size only for the given virtual machine by vmid.

This function call is only valid on harts implementing the RISC-V hypervisor extension.

§Return value

The possible return error codes returned in SbiRet.error are shown in the table below:

Return codeDescription
SbiRet::success()A remote fence was sent to all the targeted harts successfully.
SbiRet::not_supported()This function is not supported as it is not implemented or one of the target harts do not support the RISC-V hypervisor extension.
SbiRet::invalid_address()start_addr or size is not valid.
Source

fn remote_hfence_gvma( &self, hart_mask: HartMask, start_addr: usize, size: usize, ) -> SbiRet

Instruct the remote harts to execute one or more HFENCE.GVMA instructions, covering the range of guest physical addresses between start_addr and size for all the guests.

This function call is only valid on harts implementing the RISC-V hypervisor extension.

§Return value

The possible return error codes returned in SbiRet.error are shown in the table below:

Return codeDescription
SbiRet::success()A remote fence was sent to all the targeted harts successfully.
SbiRet::not_supported()This function is not supported as it is not implemented or one of the target harts do not support the RISC-V hypervisor extension.
SbiRet::invalid_address()start_addr or size is not valid.
Source

fn remote_hfence_vvma_asid( &self, hart_mask: HartMask, start_addr: usize, size: usize, asid: usize, ) -> SbiRet

Instruct the remote harts to execute one or more HFENCE.VVMA instructions, covering the range of guest virtual addresses between start_addr and size for the given address space by asid and current virtual machine (by vmid in hgatp CSR) of calling hart.

This function call is only valid on harts implementing the RISC-V hypervisor extension.

§Return value

The possible return error codes returned in SbiRet.error are shown in the table below:

Return codeDescription
SbiRet::success()A remote fence was sent to all the targeted harts successfully.
SbiRet::not_supported()This function is not supported as it is not implemented or one of the target harts do not support the RISC-V hypervisor extension.
SbiRet::invalid_address()start_addr or size is not valid.
Source

fn remote_hfence_vvma( &self, hart_mask: HartMask, start_addr: usize, size: usize, ) -> SbiRet

Instruct the remote harts to execute one or more HFENCE.VVMA instructions, covering the range of guest virtual addresses between start_addr and size for current virtual machine (by vmid in hgatp CSR) of calling hart.

This function call is only valid on harts implementing the RISC-V hypervisor extension.

§Return value

The possible return error codes returned in SbiRet.error are shown in the table below:

Return codeDescription
SbiRet::success()A remote fence was sent to all the targeted harts successfully.
SbiRet::not_supported()This function is not supported as it is not implemented or one of the target harts do not support the RISC-V hypervisor extension.
SbiRet::invalid_address()start_addr or size is not valid.

Implementations on Foreign Types§

Source§

impl<T: Rfence> Rfence for Option<T>

Source§

fn remote_fence_i(&self, hart_mask: HartMask) -> SbiRet

Source§

fn remote_sfence_vma( &self, hart_mask: HartMask, start_addr: usize, size: usize, ) -> SbiRet

Source§

fn remote_sfence_vma_asid( &self, hart_mask: HartMask, start_addr: usize, size: usize, asid: usize, ) -> SbiRet

Source§

fn remote_hfence_gvma_vmid( &self, hart_mask: HartMask, start_addr: usize, size: usize, vmid: usize, ) -> SbiRet

Source§

fn remote_hfence_gvma( &self, hart_mask: HartMask, start_addr: usize, size: usize, ) -> SbiRet

Source§

fn remote_hfence_vvma_asid( &self, hart_mask: HartMask, start_addr: usize, size: usize, asid: usize, ) -> SbiRet

Source§

fn remote_hfence_vvma( &self, hart_mask: HartMask, start_addr: usize, size: usize, ) -> SbiRet

Source§

impl<T: Rfence> Rfence for &T

Source§

fn remote_fence_i(&self, hart_mask: HartMask) -> SbiRet

Source§

fn remote_sfence_vma( &self, hart_mask: HartMask, start_addr: usize, size: usize, ) -> SbiRet

Source§

fn remote_sfence_vma_asid( &self, hart_mask: HartMask, start_addr: usize, size: usize, asid: usize, ) -> SbiRet

Source§

fn remote_hfence_gvma_vmid( &self, hart_mask: HartMask, start_addr: usize, size: usize, vmid: usize, ) -> SbiRet

Source§

fn remote_hfence_gvma( &self, hart_mask: HartMask, start_addr: usize, size: usize, ) -> SbiRet

Source§

fn remote_hfence_vvma_asid( &self, hart_mask: HartMask, start_addr: usize, size: usize, asid: usize, ) -> SbiRet

Source§

fn remote_hfence_vvma( &self, hart_mask: HartMask, start_addr: usize, size: usize, ) -> SbiRet

Implementors§