pub trait Fence: Send + Sync {
// 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
The remote fence function acts as a full TLB flush if
start_addr
andsize
are both 0, orsize
is equal tousize::MAX
.
Required Methods§
sourcefn remote_fence_i(&self, hart_mask: HartMask) -> SbiRet
fn remote_fence_i(&self, hart_mask: HartMask) -> SbiRet
Instructs remote harts to execute FENCE.I
instruction.
Return value
Returns SbiRet::success()
when remote fence was sent to all the targeted harts successfully.
sourcefn remote_sfence_vma(
&self,
hart_mask: HartMask,
start_addr: usize,
size: usize
) -> SbiRet
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 code | Description |
---|---|
SbiRet::success() | Remote fence was sent to all the targeted harts successfully. |
SbiRet::invalid_address() | start_addr or size is not valid. |
sourcefn remote_sfence_vma_asid(
&self,
hart_mask: HartMask,
start_addr: usize,
size: usize,
asid: usize
) -> SbiRet
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 code | Description |
---|---|
SbiRet::success() | Remote fence was sent to all the targeted harts successfully. |
SbiRet::invalid_address() | start_addr or size is not valid. |
Provided Methods§
sourcefn remote_hfence_gvma_vmid(
&self,
hart_mask: HartMask,
start_addr: usize,
size: usize,
vmid: usize
) -> SbiRet
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 for harts implementing hypervisor extension.
Return value
The possible return error codes returned in SbiRet.error
are shown in the table below:
Return code | Description |
---|---|
SbiRet::success() | 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 hart doesn’t support hypervisor extension. |
SbiRet::invalid_address() | start_addr or size is not valid. |
sourcefn remote_hfence_gvma(
&self,
hart_mask: HartMask,
start_addr: usize,
size: usize
) -> SbiRet
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 for harts implementing hypervisor extension.
Return value
The possible return error codes returned in SbiRet.error
are shown in the table below:
Return code | Description |
---|---|
SbiRet::success() | 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 hart does not support hypervisor extension. |
SbiRet::invalid_address() | start_addr or size is not valid. |
sourcefn remote_hfence_vvma_asid(
&self,
hart_mask: HartMask,
start_addr: usize,
size: usize,
asid: usize
) -> SbiRet
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 for harts implementing hypervisor extension.
Return value
The possible return error codes returned in SbiRet.error
are shown in the table below:
Return code | Description |
---|---|
SbiRet::success() | 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 hart does not support hypervisor extension. |
SbiRet::invalid_address() | start_addr or size is not valid. |
sourcefn remote_hfence_vvma(
&self,
hart_mask: HartMask,
start_addr: usize,
size: usize
) -> SbiRet
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 for harts implementing hypervisor extension.
Return value
The possible return error codes returned in SbiRet.error
are shown in the table below:
Return code | Description |
---|---|
SbiRet::success() | 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 hart doesn’t support hypervisor extension. |
SbiRet::invalid_address() | start_addr or size is not valid. |