declare syscalls with macro (#24564)
This commit is contained in:
parent
948abf00ac
commit
38bdb401a3
|
@ -515,19 +515,31 @@ fn translate_string_and_do(
|
||||||
|
|
||||||
type SyscallContext<'a, 'b> = Rc<RefCell<&'a mut InvokeContext<'b>>>;
|
type SyscallContext<'a, 'b> = Rc<RefCell<&'a mut InvokeContext<'b>>>;
|
||||||
|
|
||||||
/// Abort syscall functions, called when the BPF program calls `abort()`
|
macro_rules! declare_syscall {
|
||||||
/// LLVM will insert calls to `abort()` if it detects an untenable situation,
|
($(#[$attr:meta])* $name:ident, $call:item) => {
|
||||||
/// `abort()` is not intended to be called explicitly by the program.
|
$(#[$attr])*
|
||||||
/// Causes the BPF program to be halted immediately
|
pub struct $name<'a, 'b> {
|
||||||
pub struct SyscallAbort<'a, 'b> {
|
|
||||||
invoke_context: SyscallContext<'a, 'b>,
|
invoke_context: SyscallContext<'a, 'b>,
|
||||||
}
|
}
|
||||||
impl<'a, 'b> SyscallAbort<'a, 'b> {
|
impl<'a, 'b> $name<'a, 'b> {
|
||||||
pub fn init(invoke_context: SyscallContext<'a, 'b>) -> Box<(dyn SyscallObject<BpfError> + 'a)> {
|
pub fn init(
|
||||||
|
invoke_context: SyscallContext<'a, 'b>,
|
||||||
|
) -> Box<(dyn SyscallObject<BpfError> + 'a)> {
|
||||||
Box::new(Self { invoke_context })
|
Box::new(Self { invoke_context })
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
impl<'a, 'b> SyscallObject<BpfError> for $name<'a, 'b> {
|
||||||
|
$call
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
impl<'a, 'b> SyscallObject<BpfError> for SyscallAbort<'a, 'b> {
|
|
||||||
|
declare_syscall!(
|
||||||
|
/// Abort syscall functions, called when the BPF program calls `abort()`
|
||||||
|
/// LLVM will insert calls to `abort()` if it detects an untenable situation,
|
||||||
|
/// `abort()` is not intended to be called explicitly by the program.
|
||||||
|
/// Causes the BPF program to be halted immediately
|
||||||
|
SyscallAbort,
|
||||||
fn call(
|
fn call(
|
||||||
&mut self,
|
&mut self,
|
||||||
_arg1: u64,
|
_arg1: u64,
|
||||||
|
@ -546,20 +558,12 @@ impl<'a, 'b> SyscallObject<BpfError> for SyscallAbort<'a, 'b> {
|
||||||
);
|
);
|
||||||
*result = Err(SyscallError::Abort.into());
|
*result = Err(SyscallError::Abort.into());
|
||||||
}
|
}
|
||||||
}
|
);
|
||||||
|
|
||||||
/// Panic syscall function, called when the BPF program calls 'sol_panic_()`
|
declare_syscall!(
|
||||||
/// Causes the BPF program to be halted immediately
|
/// Panic syscall function, called when the BPF program calls 'sol_panic_()`
|
||||||
/// Log a user's info message
|
/// Causes the BPF program to be halted immediately
|
||||||
pub struct SyscallPanic<'a, 'b> {
|
SyscallPanic,
|
||||||
invoke_context: SyscallContext<'a, 'b>,
|
|
||||||
}
|
|
||||||
impl<'a, 'b> SyscallPanic<'a, 'b> {
|
|
||||||
pub fn init(invoke_context: SyscallContext<'a, 'b>) -> Box<(dyn SyscallObject<BpfError> + 'a)> {
|
|
||||||
Box::new(Self { invoke_context })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl<'a, 'b> SyscallObject<BpfError> for SyscallPanic<'a, 'b> {
|
|
||||||
fn call(
|
fn call(
|
||||||
&mut self,
|
&mut self,
|
||||||
file: u64,
|
file: u64,
|
||||||
|
@ -592,18 +596,11 @@ impl<'a, 'b> SyscallObject<BpfError> for SyscallPanic<'a, 'b> {
|
||||||
&mut |string: &str| Err(SyscallError::Panic(string.to_string(), line, column).into()),
|
&mut |string: &str| Err(SyscallError::Panic(string.to_string(), line, column).into()),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
);
|
||||||
|
|
||||||
/// Log a user's info message
|
declare_syscall!(
|
||||||
pub struct SyscallLog<'a, 'b> {
|
/// Log a user's info message
|
||||||
invoke_context: SyscallContext<'a, 'b>,
|
SyscallLog,
|
||||||
}
|
|
||||||
impl<'a, 'b> SyscallLog<'a, 'b> {
|
|
||||||
pub fn init(invoke_context: SyscallContext<'a, 'b>) -> Box<(dyn SyscallObject<BpfError> + 'a)> {
|
|
||||||
Box::new(Self { invoke_context })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl<'a, 'b> SyscallObject<BpfError> for SyscallLog<'a, 'b> {
|
|
||||||
fn call(
|
fn call(
|
||||||
&mut self,
|
&mut self,
|
||||||
addr: u64,
|
addr: u64,
|
||||||
|
@ -649,18 +646,11 @@ impl<'a, 'b> SyscallObject<BpfError> for SyscallLog<'a, 'b> {
|
||||||
);
|
);
|
||||||
*result = Ok(0);
|
*result = Ok(0);
|
||||||
}
|
}
|
||||||
}
|
);
|
||||||
|
|
||||||
/// Log 5 64-bit values
|
declare_syscall!(
|
||||||
pub struct SyscallLogU64<'a, 'b> {
|
/// Log 5 64-bit values
|
||||||
invoke_context: SyscallContext<'a, 'b>,
|
SyscallLogU64,
|
||||||
}
|
|
||||||
impl<'a, 'b> SyscallLogU64<'a, 'b> {
|
|
||||||
pub fn init(invoke_context: SyscallContext<'a, 'b>) -> Box<(dyn SyscallObject<BpfError> + 'a)> {
|
|
||||||
Box::new(Self { invoke_context })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl<'a, 'b> SyscallObject<BpfError> for SyscallLogU64<'a, 'b> {
|
|
||||||
fn call(
|
fn call(
|
||||||
&mut self,
|
&mut self,
|
||||||
arg1: u64,
|
arg1: u64,
|
||||||
|
@ -689,18 +679,11 @@ impl<'a, 'b> SyscallObject<BpfError> for SyscallLogU64<'a, 'b> {
|
||||||
);
|
);
|
||||||
*result = Ok(0);
|
*result = Ok(0);
|
||||||
}
|
}
|
||||||
}
|
);
|
||||||
|
|
||||||
/// Log current compute consumption
|
declare_syscall!(
|
||||||
pub struct SyscallLogBpfComputeUnits<'a, 'b> {
|
/// Log current compute consumption
|
||||||
invoke_context: SyscallContext<'a, 'b>,
|
SyscallLogBpfComputeUnits,
|
||||||
}
|
|
||||||
impl<'a, 'b> SyscallLogBpfComputeUnits<'a, 'b> {
|
|
||||||
pub fn init(invoke_context: SyscallContext<'a, 'b>) -> Box<(dyn SyscallObject<BpfError> + 'a)> {
|
|
||||||
Box::new(Self { invoke_context })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl<'a, 'b> SyscallObject<BpfError> for SyscallLogBpfComputeUnits<'a, 'b> {
|
|
||||||
fn call(
|
fn call(
|
||||||
&mut self,
|
&mut self,
|
||||||
_arg1: u64,
|
_arg1: u64,
|
||||||
|
@ -734,18 +717,11 @@ impl<'a, 'b> SyscallObject<BpfError> for SyscallLogBpfComputeUnits<'a, 'b> {
|
||||||
);
|
);
|
||||||
*result = Ok(0);
|
*result = Ok(0);
|
||||||
}
|
}
|
||||||
}
|
);
|
||||||
|
|
||||||
/// Log 5 64-bit values
|
declare_syscall!(
|
||||||
pub struct SyscallLogPubkey<'a, 'b> {
|
/// Log 5 64-bit values
|
||||||
invoke_context: SyscallContext<'a, 'b>,
|
SyscallLogPubkey,
|
||||||
}
|
|
||||||
impl<'a, 'b> SyscallLogPubkey<'a, 'b> {
|
|
||||||
pub fn init(invoke_context: SyscallContext<'a, 'b>) -> Box<(dyn SyscallObject<BpfError> + 'a)> {
|
|
||||||
Box::new(Self { invoke_context })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl<'a, 'b> SyscallObject<BpfError> for SyscallLogPubkey<'a, 'b> {
|
|
||||||
fn call(
|
fn call(
|
||||||
&mut self,
|
&mut self,
|
||||||
pubkey_addr: u64,
|
pubkey_addr: u64,
|
||||||
|
@ -776,23 +752,16 @@ impl<'a, 'b> SyscallObject<BpfError> for SyscallLogPubkey<'a, 'b> {
|
||||||
stable_log::program_log(&invoke_context.get_log_collector(), &pubkey.to_string());
|
stable_log::program_log(&invoke_context.get_log_collector(), &pubkey.to_string());
|
||||||
*result = Ok(0);
|
*result = Ok(0);
|
||||||
}
|
}
|
||||||
}
|
);
|
||||||
|
|
||||||
/// Dynamic memory allocation syscall called when the BPF program calls
|
declare_syscall!(
|
||||||
/// `sol_alloc_free_()`. The allocator is expected to allocate/free
|
/// Dynamic memory allocation syscall called when the BPF program calls
|
||||||
/// from/to a given chunk of memory and enforce size restrictions. The
|
/// `sol_alloc_free_()`. The allocator is expected to allocate/free
|
||||||
/// memory chunk is given to the allocator during allocator creation and
|
/// from/to a given chunk of memory and enforce size restrictions. The
|
||||||
/// information about that memory (start address and size) is passed
|
/// memory chunk is given to the allocator during allocator creation and
|
||||||
/// to the VM to use for enforcement.
|
/// information about that memory (start address and size) is passed
|
||||||
pub struct SyscallAllocFree<'a, 'b> {
|
/// to the VM to use for enforcement.
|
||||||
invoke_context: SyscallContext<'a, 'b>,
|
SyscallAllocFree,
|
||||||
}
|
|
||||||
impl<'a, 'b> SyscallAllocFree<'a, 'b> {
|
|
||||||
pub fn init(invoke_context: SyscallContext<'a, 'b>) -> Box<(dyn SyscallObject<BpfError> + 'a)> {
|
|
||||||
Box::new(Self { invoke_context })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl<'a, 'b> SyscallObject<BpfError> for SyscallAllocFree<'a, 'b> {
|
|
||||||
fn call(
|
fn call(
|
||||||
&mut self,
|
&mut self,
|
||||||
size: u64,
|
size: u64,
|
||||||
|
@ -844,7 +813,7 @@ impl<'a, 'b> SyscallObject<BpfError> for SyscallAllocFree<'a, 'b> {
|
||||||
Ok(0)
|
Ok(0)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
);
|
||||||
|
|
||||||
fn translate_and_check_program_address_inputs<'a>(
|
fn translate_and_check_program_address_inputs<'a>(
|
||||||
seeds_addr: u64,
|
seeds_addr: u64,
|
||||||
|
@ -883,16 +852,9 @@ fn translate_and_check_program_address_inputs<'a>(
|
||||||
Ok((seeds, program_id))
|
Ok((seeds, program_id))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Create a program address
|
declare_syscall!(
|
||||||
struct SyscallCreateProgramAddress<'a, 'b> {
|
/// Create a program address
|
||||||
invoke_context: SyscallContext<'a, 'b>,
|
SyscallCreateProgramAddress,
|
||||||
}
|
|
||||||
impl<'a, 'b> SyscallCreateProgramAddress<'a, 'b> {
|
|
||||||
pub fn init(invoke_context: SyscallContext<'a, 'b>) -> Box<(dyn SyscallObject<BpfError> + 'a)> {
|
|
||||||
Box::new(Self { invoke_context })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl<'a, 'b> SyscallObject<BpfError> for SyscallCreateProgramAddress<'a, 'b> {
|
|
||||||
fn call(
|
fn call(
|
||||||
&mut self,
|
&mut self,
|
||||||
seeds_addr: u64,
|
seeds_addr: u64,
|
||||||
|
@ -946,18 +908,11 @@ impl<'a, 'b> SyscallObject<BpfError> for SyscallCreateProgramAddress<'a, 'b> {
|
||||||
address.copy_from_slice(new_address.as_ref());
|
address.copy_from_slice(new_address.as_ref());
|
||||||
*result = Ok(0);
|
*result = Ok(0);
|
||||||
}
|
}
|
||||||
}
|
);
|
||||||
|
|
||||||
/// Create a program address
|
declare_syscall!(
|
||||||
struct SyscallTryFindProgramAddress<'a, 'b> {
|
/// Create a program address
|
||||||
invoke_context: SyscallContext<'a, 'b>,
|
SyscallTryFindProgramAddress,
|
||||||
}
|
|
||||||
impl<'a, 'b> SyscallTryFindProgramAddress<'a, 'b> {
|
|
||||||
pub fn init(invoke_context: SyscallContext<'a, 'b>) -> Box<(dyn SyscallObject<BpfError> + 'a)> {
|
|
||||||
Box::new(Self { invoke_context })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl<'a, 'b> SyscallObject<BpfError> for SyscallTryFindProgramAddress<'a, 'b> {
|
|
||||||
fn call(
|
fn call(
|
||||||
&mut self,
|
&mut self,
|
||||||
seeds_addr: u64,
|
seeds_addr: u64,
|
||||||
|
@ -1029,18 +984,11 @@ impl<'a, 'b> SyscallObject<BpfError> for SyscallTryFindProgramAddress<'a, 'b> {
|
||||||
}
|
}
|
||||||
*result = Ok(1);
|
*result = Ok(1);
|
||||||
}
|
}
|
||||||
}
|
);
|
||||||
|
|
||||||
/// SHA256
|
declare_syscall!(
|
||||||
pub struct SyscallSha256<'a, 'b> {
|
/// SHA256
|
||||||
invoke_context: SyscallContext<'a, 'b>,
|
SyscallSha256,
|
||||||
}
|
|
||||||
impl<'a, 'b> SyscallSha256<'a, 'b> {
|
|
||||||
pub fn init(invoke_context: SyscallContext<'a, 'b>) -> Box<(dyn SyscallObject<BpfError> + 'a)> {
|
|
||||||
Box::new(Self { invoke_context })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl<'a, 'b> SyscallObject<BpfError> for SyscallSha256<'a, 'b> {
|
|
||||||
fn call(
|
fn call(
|
||||||
&mut self,
|
&mut self,
|
||||||
vals_addr: u64,
|
vals_addr: u64,
|
||||||
|
@ -1133,7 +1081,7 @@ impl<'a, 'b> SyscallObject<BpfError> for SyscallSha256<'a, 'b> {
|
||||||
hash_result.copy_from_slice(&hasher.result().to_bytes());
|
hash_result.copy_from_slice(&hasher.result().to_bytes());
|
||||||
*result = Ok(0);
|
*result = Ok(0);
|
||||||
}
|
}
|
||||||
}
|
);
|
||||||
|
|
||||||
fn get_sysvar<T: std::fmt::Debug + Sysvar + SysvarId + Clone>(
|
fn get_sysvar<T: std::fmt::Debug + Sysvar + SysvarId + Clone>(
|
||||||
sysvar: Result<Arc<T>, InstructionError>,
|
sysvar: Result<Arc<T>, InstructionError>,
|
||||||
|
@ -1156,16 +1104,9 @@ fn get_sysvar<T: std::fmt::Debug + Sysvar + SysvarId + Clone>(
|
||||||
Ok(SUCCESS)
|
Ok(SUCCESS)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get a Clock sysvar
|
declare_syscall!(
|
||||||
struct SyscallGetClockSysvar<'a, 'b> {
|
/// Get a Clock sysvar
|
||||||
invoke_context: SyscallContext<'a, 'b>,
|
SyscallGetClockSysvar,
|
||||||
}
|
|
||||||
impl<'a, 'b> SyscallGetClockSysvar<'a, 'b> {
|
|
||||||
pub fn init(invoke_context: SyscallContext<'a, 'b>) -> Box<(dyn SyscallObject<BpfError> + 'a)> {
|
|
||||||
Box::new(Self { invoke_context })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl<'a, 'b> SyscallObject<BpfError> for SyscallGetClockSysvar<'a, 'b> {
|
|
||||||
fn call(
|
fn call(
|
||||||
&mut self,
|
&mut self,
|
||||||
var_addr: u64,
|
var_addr: u64,
|
||||||
|
@ -1190,17 +1131,11 @@ impl<'a, 'b> SyscallObject<BpfError> for SyscallGetClockSysvar<'a, 'b> {
|
||||||
&mut invoke_context,
|
&mut invoke_context,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
);
|
||||||
/// Get a EpochSchedule sysvar
|
|
||||||
struct SyscallGetEpochScheduleSysvar<'a, 'b> {
|
declare_syscall!(
|
||||||
invoke_context: SyscallContext<'a, 'b>,
|
/// Get a EpochSchedule sysvar
|
||||||
}
|
SyscallGetEpochScheduleSysvar,
|
||||||
impl<'a, 'b> SyscallGetEpochScheduleSysvar<'a, 'b> {
|
|
||||||
pub fn init(invoke_context: SyscallContext<'a, 'b>) -> Box<(dyn SyscallObject<BpfError> + 'a)> {
|
|
||||||
Box::new(Self { invoke_context })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl<'a, 'b> SyscallObject<BpfError> for SyscallGetEpochScheduleSysvar<'a, 'b> {
|
|
||||||
fn call(
|
fn call(
|
||||||
&mut self,
|
&mut self,
|
||||||
var_addr: u64,
|
var_addr: u64,
|
||||||
|
@ -1225,18 +1160,11 @@ impl<'a, 'b> SyscallObject<BpfError> for SyscallGetEpochScheduleSysvar<'a, 'b> {
|
||||||
&mut invoke_context,
|
&mut invoke_context,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
);
|
||||||
/// Get a Fees sysvar
|
|
||||||
struct SyscallGetFeesSysvar<'a, 'b> {
|
declare_syscall!(
|
||||||
invoke_context: SyscallContext<'a, 'b>,
|
/// Get a Fees sysvar
|
||||||
}
|
SyscallGetFeesSysvar,
|
||||||
impl<'a, 'b> SyscallGetFeesSysvar<'a, 'b> {
|
|
||||||
pub fn init(invoke_context: SyscallContext<'a, 'b>) -> Box<(dyn SyscallObject<BpfError> + 'a)> {
|
|
||||||
Box::new(Self { invoke_context })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#[allow(deprecated)]
|
|
||||||
impl<'a, 'b> SyscallObject<BpfError> for SyscallGetFeesSysvar<'a, 'b> {
|
|
||||||
fn call(
|
fn call(
|
||||||
&mut self,
|
&mut self,
|
||||||
var_addr: u64,
|
var_addr: u64,
|
||||||
|
@ -1253,6 +1181,8 @@ impl<'a, 'b> SyscallObject<BpfError> for SyscallGetFeesSysvar<'a, 'b> {
|
||||||
.map_err(|_| SyscallError::InvokeContextBorrowFailed),
|
.map_err(|_| SyscallError::InvokeContextBorrowFailed),
|
||||||
result
|
result
|
||||||
);
|
);
|
||||||
|
#[allow(deprecated)]
|
||||||
|
{
|
||||||
*result = get_sysvar(
|
*result = get_sysvar(
|
||||||
invoke_context.get_sysvar_cache().get_fees(),
|
invoke_context.get_sysvar_cache().get_fees(),
|
||||||
var_addr,
|
var_addr,
|
||||||
|
@ -1261,17 +1191,12 @@ impl<'a, 'b> SyscallObject<BpfError> for SyscallGetFeesSysvar<'a, 'b> {
|
||||||
&mut invoke_context,
|
&mut invoke_context,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
/// Get a Rent sysvar
|
|
||||||
struct SyscallGetRentSysvar<'a, 'b> {
|
|
||||||
invoke_context: SyscallContext<'a, 'b>,
|
|
||||||
}
|
|
||||||
impl<'a, 'b> SyscallGetRentSysvar<'a, 'b> {
|
|
||||||
pub fn init(invoke_context: SyscallContext<'a, 'b>) -> Box<(dyn SyscallObject<BpfError> + 'a)> {
|
|
||||||
Box::new(Self { invoke_context })
|
|
||||||
}
|
}
|
||||||
}
|
);
|
||||||
impl<'a, 'b> SyscallObject<BpfError> for SyscallGetRentSysvar<'a, 'b> {
|
|
||||||
|
declare_syscall!(
|
||||||
|
/// Get a Rent sysvar
|
||||||
|
SyscallGetRentSysvar,
|
||||||
fn call(
|
fn call(
|
||||||
&mut self,
|
&mut self,
|
||||||
var_addr: u64,
|
var_addr: u64,
|
||||||
|
@ -1296,18 +1221,11 @@ impl<'a, 'b> SyscallObject<BpfError> for SyscallGetRentSysvar<'a, 'b> {
|
||||||
&mut invoke_context,
|
&mut invoke_context,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
);
|
||||||
|
|
||||||
// Keccak256
|
declare_syscall!(
|
||||||
pub struct SyscallKeccak256<'a, 'b> {
|
// Keccak256
|
||||||
invoke_context: SyscallContext<'a, 'b>,
|
SyscallKeccak256,
|
||||||
}
|
|
||||||
impl<'a, 'b> SyscallKeccak256<'a, 'b> {
|
|
||||||
pub fn init(invoke_context: SyscallContext<'a, 'b>) -> Box<(dyn SyscallObject<BpfError> + 'a)> {
|
|
||||||
Box::new(Self { invoke_context })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl<'a, 'b> SyscallObject<BpfError> for SyscallKeccak256<'a, 'b> {
|
|
||||||
fn call(
|
fn call(
|
||||||
&mut self,
|
&mut self,
|
||||||
vals_addr: u64,
|
vals_addr: u64,
|
||||||
|
@ -1400,7 +1318,7 @@ impl<'a, 'b> SyscallObject<BpfError> for SyscallKeccak256<'a, 'b> {
|
||||||
hash_result.copy_from_slice(&hasher.result().to_bytes());
|
hash_result.copy_from_slice(&hasher.result().to_bytes());
|
||||||
*result = Ok(0);
|
*result = Ok(0);
|
||||||
}
|
}
|
||||||
}
|
);
|
||||||
|
|
||||||
/// This function is incorrect due to arithmetic overflow and only exists for
|
/// This function is incorrect due to arithmetic overflow and only exists for
|
||||||
/// backwards compatibility. Instead use program_stubs::is_nonoverlapping.
|
/// backwards compatibility. Instead use program_stubs::is_nonoverlapping.
|
||||||
|
@ -1428,16 +1346,9 @@ fn mem_op_consume<'a, 'b>(
|
||||||
invoke_context.get_compute_meter().consume(cost)
|
invoke_context.get_compute_meter().consume(cost)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// memcpy
|
declare_syscall!(
|
||||||
pub struct SyscallMemcpy<'a, 'b> {
|
/// memcpy
|
||||||
invoke_context: SyscallContext<'a, 'b>,
|
SyscallMemcpy,
|
||||||
}
|
|
||||||
impl<'a, 'b> SyscallMemcpy<'a, 'b> {
|
|
||||||
pub fn init(invoke_context: SyscallContext<'a, 'b>) -> Box<(dyn SyscallObject<BpfError> + 'a)> {
|
|
||||||
Box::new(Self { invoke_context })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl<'a, 'b> SyscallObject<BpfError> for SyscallMemcpy<'a, 'b> {
|
|
||||||
fn call(
|
fn call(
|
||||||
&mut self,
|
&mut self,
|
||||||
dst_addr: u64,
|
dst_addr: u64,
|
||||||
|
@ -1526,17 +1437,11 @@ impl<'a, 'b> SyscallObject<BpfError> for SyscallMemcpy<'a, 'b> {
|
||||||
}
|
}
|
||||||
*result = Ok(0);
|
*result = Ok(0);
|
||||||
}
|
}
|
||||||
}
|
);
|
||||||
/// memmove
|
|
||||||
pub struct SyscallMemmove<'a, 'b> {
|
declare_syscall!(
|
||||||
invoke_context: SyscallContext<'a, 'b>,
|
/// memmove
|
||||||
}
|
SyscallMemmove,
|
||||||
impl<'a, 'b> SyscallMemmove<'a, 'b> {
|
|
||||||
pub fn init(invoke_context: SyscallContext<'a, 'b>) -> Box<(dyn SyscallObject<BpfError> + 'a)> {
|
|
||||||
Box::new(Self { invoke_context })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl<'a, 'b> SyscallObject<BpfError> for SyscallMemmove<'a, 'b> {
|
|
||||||
fn call(
|
fn call(
|
||||||
&mut self,
|
&mut self,
|
||||||
dst_addr: u64,
|
dst_addr: u64,
|
||||||
|
@ -1580,17 +1485,11 @@ impl<'a, 'b> SyscallObject<BpfError> for SyscallMemmove<'a, 'b> {
|
||||||
}
|
}
|
||||||
*result = Ok(0);
|
*result = Ok(0);
|
||||||
}
|
}
|
||||||
}
|
);
|
||||||
/// memcmp
|
|
||||||
pub struct SyscallMemcmp<'a, 'b> {
|
declare_syscall!(
|
||||||
invoke_context: SyscallContext<'a, 'b>,
|
/// memcmp
|
||||||
}
|
SyscallMemcmp,
|
||||||
impl<'a, 'b> SyscallMemcmp<'a, 'b> {
|
|
||||||
pub fn init(invoke_context: SyscallContext<'a, 'b>) -> Box<(dyn SyscallObject<BpfError> + 'a)> {
|
|
||||||
Box::new(Self { invoke_context })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl<'a, 'b> SyscallObject<BpfError> for SyscallMemcmp<'a, 'b> {
|
|
||||||
fn call(
|
fn call(
|
||||||
&mut self,
|
&mut self,
|
||||||
s1_addr: u64,
|
s1_addr: u64,
|
||||||
|
@ -1661,17 +1560,11 @@ impl<'a, 'b> SyscallObject<BpfError> for SyscallMemcmp<'a, 'b> {
|
||||||
*cmp_result = 0;
|
*cmp_result = 0;
|
||||||
*result = Ok(0);
|
*result = Ok(0);
|
||||||
}
|
}
|
||||||
}
|
);
|
||||||
/// memset
|
|
||||||
pub struct SyscallMemset<'a, 'b> {
|
declare_syscall!(
|
||||||
invoke_context: SyscallContext<'a, 'b>,
|
/// memset
|
||||||
}
|
SyscallMemset,
|
||||||
impl<'a, 'b> SyscallMemset<'a, 'b> {
|
|
||||||
pub fn init(invoke_context: SyscallContext<'a, 'b>) -> Box<(dyn SyscallObject<BpfError> + 'a)> {
|
|
||||||
Box::new(Self { invoke_context })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl<'a, 'b> SyscallObject<BpfError> for SyscallMemset<'a, 'b> {
|
|
||||||
fn call(
|
fn call(
|
||||||
&mut self,
|
&mut self,
|
||||||
s_addr: u64,
|
s_addr: u64,
|
||||||
|
@ -1705,18 +1598,11 @@ impl<'a, 'b> SyscallObject<BpfError> for SyscallMemset<'a, 'b> {
|
||||||
}
|
}
|
||||||
*result = Ok(0);
|
*result = Ok(0);
|
||||||
}
|
}
|
||||||
}
|
);
|
||||||
|
|
||||||
/// secp256k1_recover
|
declare_syscall!(
|
||||||
pub struct SyscallSecp256k1Recover<'a, 'b> {
|
/// secp256k1_recover
|
||||||
invoke_context: SyscallContext<'a, 'b>,
|
SyscallSecp256k1Recover,
|
||||||
}
|
|
||||||
impl<'a, 'b> SyscallSecp256k1Recover<'a, 'b> {
|
|
||||||
pub fn init(invoke_context: SyscallContext<'a, 'b>) -> Box<(dyn SyscallObject<BpfError> + 'a)> {
|
|
||||||
Box::new(Self { invoke_context })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl<'a, 'b> SyscallObject<BpfError> for SyscallSecp256k1Recover<'a, 'b> {
|
|
||||||
fn call(
|
fn call(
|
||||||
&mut self,
|
&mut self,
|
||||||
hash_addr: u64,
|
hash_addr: u64,
|
||||||
|
@ -1823,17 +1709,10 @@ impl<'a, 'b> SyscallObject<BpfError> for SyscallSecp256k1Recover<'a, 'b> {
|
||||||
secp256k1_recover_result.copy_from_slice(&public_key[1..65]);
|
secp256k1_recover_result.copy_from_slice(&public_key[1..65]);
|
||||||
*result = Ok(SUCCESS);
|
*result = Ok(SUCCESS);
|
||||||
}
|
}
|
||||||
}
|
);
|
||||||
|
|
||||||
pub struct SyscallZkTokenElgamalOp<'a, 'b> {
|
declare_syscall!(
|
||||||
invoke_context: SyscallContext<'a, 'b>,
|
SyscallZkTokenElgamalOp,
|
||||||
}
|
|
||||||
impl<'a, 'b> SyscallZkTokenElgamalOp<'a, 'b> {
|
|
||||||
pub fn init(invoke_context: SyscallContext<'a, 'b>) -> Box<(dyn SyscallObject<BpfError> + 'a)> {
|
|
||||||
Box::new(Self { invoke_context })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl<'a, 'b> SyscallObject<BpfError> for SyscallZkTokenElgamalOp<'a, 'b> {
|
|
||||||
fn call(
|
fn call(
|
||||||
&mut self,
|
&mut self,
|
||||||
op: u64,
|
op: u64,
|
||||||
|
@ -1890,17 +1769,10 @@ impl<'a, 'b> SyscallObject<BpfError> for SyscallZkTokenElgamalOp<'a, 'b> {
|
||||||
*result = Ok(1);
|
*result = Ok(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
);
|
||||||
|
|
||||||
pub struct SyscallZkTokenElgamalOpWithLoHi<'a, 'b> {
|
declare_syscall!(
|
||||||
invoke_context: SyscallContext<'a, 'b>,
|
SyscallZkTokenElgamalOpWithLoHi,
|
||||||
}
|
|
||||||
impl<'a, 'b> SyscallZkTokenElgamalOpWithLoHi<'a, 'b> {
|
|
||||||
pub fn init(invoke_context: SyscallContext<'a, 'b>) -> Box<(dyn SyscallObject<BpfError> + 'a)> {
|
|
||||||
Box::new(Self { invoke_context })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl<'a, 'b> SyscallObject<BpfError> for SyscallZkTokenElgamalOpWithLoHi<'a, 'b> {
|
|
||||||
fn call(
|
fn call(
|
||||||
&mut self,
|
&mut self,
|
||||||
op: u64,
|
op: u64,
|
||||||
|
@ -1965,17 +1837,10 @@ impl<'a, 'b> SyscallObject<BpfError> for SyscallZkTokenElgamalOpWithLoHi<'a, 'b>
|
||||||
*result = Ok(1);
|
*result = Ok(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
);
|
||||||
|
|
||||||
pub struct SyscallZkTokenElgamalOpWithScalar<'a, 'b> {
|
declare_syscall!(
|
||||||
invoke_context: SyscallContext<'a, 'b>,
|
SyscallZkTokenElgamalOpWithScalar,
|
||||||
}
|
|
||||||
impl<'a, 'b> SyscallZkTokenElgamalOpWithScalar<'a, 'b> {
|
|
||||||
pub fn init(invoke_context: SyscallContext<'a, 'b>) -> Box<(dyn SyscallObject<BpfError> + 'a)> {
|
|
||||||
Box::new(Self { invoke_context })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl<'a, 'b> SyscallObject<BpfError> for SyscallZkTokenElgamalOpWithScalar<'a, 'b> {
|
|
||||||
fn call(
|
fn call(
|
||||||
&mut self,
|
&mut self,
|
||||||
op: u64,
|
op: u64,
|
||||||
|
@ -2024,18 +1889,11 @@ impl<'a, 'b> SyscallObject<BpfError> for SyscallZkTokenElgamalOpWithScalar<'a, '
|
||||||
*result = Ok(1);
|
*result = Ok(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
);
|
||||||
|
|
||||||
// Blake3
|
declare_syscall!(
|
||||||
pub struct SyscallBlake3<'a, 'b> {
|
// Blake3
|
||||||
invoke_context: SyscallContext<'a, 'b>,
|
SyscallBlake3,
|
||||||
}
|
|
||||||
impl<'a, 'b> SyscallBlake3<'a, 'b> {
|
|
||||||
pub fn init(invoke_context: SyscallContext<'a, 'b>) -> Box<(dyn SyscallObject<BpfError> + 'a)> {
|
|
||||||
Box::new(Self { invoke_context })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl<'a, 'b> SyscallObject<BpfError> for SyscallBlake3<'a, 'b> {
|
|
||||||
fn call(
|
fn call(
|
||||||
&mut self,
|
&mut self,
|
||||||
vals_addr: u64,
|
vals_addr: u64,
|
||||||
|
@ -2136,7 +1994,7 @@ impl<'a, 'b> SyscallObject<BpfError> for SyscallBlake3<'a, 'b> {
|
||||||
hash_result.copy_from_slice(&hasher.result().to_bytes());
|
hash_result.copy_from_slice(&hasher.result().to_bytes());
|
||||||
*result = Ok(0);
|
*result = Ok(0);
|
||||||
}
|
}
|
||||||
}
|
);
|
||||||
|
|
||||||
// Cross-program invocation syscalls
|
// Cross-program invocation syscalls
|
||||||
|
|
||||||
|
@ -2181,16 +2039,9 @@ trait SyscallInvokeSigned<'a, 'b> {
|
||||||
) -> Result<Vec<Pubkey>, EbpfError<BpfError>>;
|
) -> Result<Vec<Pubkey>, EbpfError<BpfError>>;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Cross-SyscallInvokeSignedRust invocation called from Rust
|
declare_syscall!(
|
||||||
pub struct SyscallInvokeSignedRust<'a, 'b> {
|
/// Cross-program invocation called from Rust
|
||||||
invoke_context: SyscallContext<'a, 'b>,
|
SyscallInvokeSignedRust,
|
||||||
}
|
|
||||||
impl<'a, 'b> SyscallInvokeSignedRust<'a, 'b> {
|
|
||||||
pub fn init(invoke_context: SyscallContext<'a, 'b>) -> Box<(dyn SyscallObject<BpfError> + 'a)> {
|
|
||||||
Box::new(Self { invoke_context })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl<'a, 'b> SyscallObject<BpfError> for SyscallInvokeSignedRust<'a, 'b> {
|
|
||||||
fn call(
|
fn call(
|
||||||
&mut self,
|
&mut self,
|
||||||
instruction_addr: u64,
|
instruction_addr: u64,
|
||||||
|
@ -2211,7 +2062,7 @@ impl<'a, 'b> SyscallObject<BpfError> for SyscallInvokeSignedRust<'a, 'b> {
|
||||||
memory_mapping,
|
memory_mapping,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
);
|
||||||
|
|
||||||
impl<'a, 'b> SyscallInvokeSigned<'a, 'b> for SyscallInvokeSignedRust<'a, 'b> {
|
impl<'a, 'b> SyscallInvokeSigned<'a, 'b> for SyscallInvokeSignedRust<'a, 'b> {
|
||||||
fn get_context_mut(&self) -> Result<RefMut<&'a mut InvokeContext<'b>>, EbpfError<BpfError>> {
|
fn get_context_mut(&self) -> Result<RefMut<&'a mut InvokeContext<'b>>, EbpfError<BpfError>> {
|
||||||
|
@ -2479,16 +2330,9 @@ struct SolSignerSeedsC {
|
||||||
len: u64,
|
len: u64,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Cross-program invocation called from C
|
declare_syscall!(
|
||||||
pub struct SyscallInvokeSignedC<'a, 'b> {
|
/// Cross-program invocation called from C
|
||||||
invoke_context: SyscallContext<'a, 'b>,
|
SyscallInvokeSignedC,
|
||||||
}
|
|
||||||
impl<'a, 'b> SyscallInvokeSignedC<'a, 'b> {
|
|
||||||
pub fn init(invoke_context: SyscallContext<'a, 'b>) -> Box<(dyn SyscallObject<BpfError> + 'a)> {
|
|
||||||
Box::new(Self { invoke_context })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl<'a, 'b> SyscallObject<BpfError> for SyscallInvokeSignedC<'a, 'b> {
|
|
||||||
fn call(
|
fn call(
|
||||||
&mut self,
|
&mut self,
|
||||||
instruction_addr: u64,
|
instruction_addr: u64,
|
||||||
|
@ -2509,7 +2353,7 @@ impl<'a, 'b> SyscallObject<BpfError> for SyscallInvokeSignedC<'a, 'b> {
|
||||||
memory_mapping,
|
memory_mapping,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
);
|
||||||
|
|
||||||
impl<'a, 'b> SyscallInvokeSigned<'a, 'b> for SyscallInvokeSignedC<'a, 'b> {
|
impl<'a, 'b> SyscallInvokeSigned<'a, 'b> for SyscallInvokeSignedC<'a, 'b> {
|
||||||
fn get_context_mut(&self) -> Result<RefMut<&'a mut InvokeContext<'b>>, EbpfError<BpfError>> {
|
fn get_context_mut(&self) -> Result<RefMut<&'a mut InvokeContext<'b>>, EbpfError<BpfError>> {
|
||||||
|
@ -3079,16 +2923,9 @@ fn call<'a, 'b: 'a>(
|
||||||
Ok(SUCCESS)
|
Ok(SUCCESS)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return data handling
|
declare_syscall!(
|
||||||
pub struct SyscallSetReturnData<'a, 'b> {
|
/// Set return data
|
||||||
invoke_context: SyscallContext<'a, 'b>,
|
SyscallSetReturnData,
|
||||||
}
|
|
||||||
impl<'a, 'b> SyscallSetReturnData<'a, 'b> {
|
|
||||||
pub fn init(invoke_context: SyscallContext<'a, 'b>) -> Box<(dyn SyscallObject<BpfError> + 'a)> {
|
|
||||||
Box::new(Self { invoke_context })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl<'a, 'b> SyscallObject<BpfError> for SyscallSetReturnData<'a, 'b> {
|
|
||||||
fn call(
|
fn call(
|
||||||
&mut self,
|
&mut self,
|
||||||
addr: u64,
|
addr: u64,
|
||||||
|
@ -3160,17 +2997,11 @@ impl<'a, 'b> SyscallObject<BpfError> for SyscallSetReturnData<'a, 'b> {
|
||||||
|
|
||||||
*result = Ok(0);
|
*result = Ok(0);
|
||||||
}
|
}
|
||||||
}
|
);
|
||||||
|
|
||||||
pub struct SyscallGetReturnData<'a, 'b> {
|
declare_syscall!(
|
||||||
invoke_context: SyscallContext<'a, 'b>,
|
/// Get return data
|
||||||
}
|
SyscallGetReturnData,
|
||||||
impl<'a, 'b> SyscallGetReturnData<'a, 'b> {
|
|
||||||
pub fn init(invoke_context: SyscallContext<'a, 'b>) -> Box<(dyn SyscallObject<BpfError> + 'a)> {
|
|
||||||
Box::new(Self { invoke_context })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl<'a, 'b> SyscallObject<BpfError> for SyscallGetReturnData<'a, 'b> {
|
|
||||||
fn call(
|
fn call(
|
||||||
&mut self,
|
&mut self,
|
||||||
return_data_addr: u64,
|
return_data_addr: u64,
|
||||||
|
@ -3253,18 +3084,11 @@ impl<'a, 'b> SyscallObject<BpfError> for SyscallGetReturnData<'a, 'b> {
|
||||||
// Return the actual length, rather the length returned
|
// Return the actual length, rather the length returned
|
||||||
*result = Ok(return_data.len() as u64);
|
*result = Ok(return_data.len() as u64);
|
||||||
}
|
}
|
||||||
}
|
);
|
||||||
|
|
||||||
// Log data handling
|
declare_syscall!(
|
||||||
pub struct SyscallLogData<'a, 'b> {
|
/// Log data handling
|
||||||
invoke_context: SyscallContext<'a, 'b>,
|
SyscallLogData,
|
||||||
}
|
|
||||||
impl<'a, 'b> SyscallLogData<'a, 'b> {
|
|
||||||
pub fn init(invoke_context: SyscallContext<'a, 'b>) -> Box<(dyn SyscallObject<BpfError> + 'a)> {
|
|
||||||
Box::new(Self { invoke_context })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl<'a, 'b> SyscallObject<BpfError> for SyscallLogData<'a, 'b> {
|
|
||||||
fn call(
|
fn call(
|
||||||
&mut self,
|
&mut self,
|
||||||
addr: u64,
|
addr: u64,
|
||||||
|
@ -3339,17 +3163,11 @@ impl<'a, 'b> SyscallObject<BpfError> for SyscallLogData<'a, 'b> {
|
||||||
|
|
||||||
*result = Ok(0);
|
*result = Ok(0);
|
||||||
}
|
}
|
||||||
}
|
);
|
||||||
|
|
||||||
pub struct SyscallGetProcessedSiblingInstruction<'a, 'b> {
|
declare_syscall!(
|
||||||
invoke_context: SyscallContext<'a, 'b>,
|
/// Get a processed sigling instruction
|
||||||
}
|
SyscallGetProcessedSiblingInstruction,
|
||||||
impl<'a, 'b> SyscallGetProcessedSiblingInstruction<'a, 'b> {
|
|
||||||
pub fn init(invoke_context: SyscallContext<'a, 'b>) -> Box<(dyn SyscallObject<BpfError> + 'a)> {
|
|
||||||
Box::new(Self { invoke_context })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl<'a, 'b> SyscallObject<BpfError> for SyscallGetProcessedSiblingInstruction<'a, 'b> {
|
|
||||||
fn call(
|
fn call(
|
||||||
&mut self,
|
&mut self,
|
||||||
index: u64,
|
index: u64,
|
||||||
|
@ -3473,17 +3291,11 @@ impl<'a, 'b> SyscallObject<BpfError> for SyscallGetProcessedSiblingInstruction<'
|
||||||
}
|
}
|
||||||
*result = Ok(false as u64);
|
*result = Ok(false as u64);
|
||||||
}
|
}
|
||||||
}
|
);
|
||||||
|
|
||||||
pub struct SyscallGetStackHeight<'a, 'b> {
|
declare_syscall!(
|
||||||
invoke_context: SyscallContext<'a, 'b>,
|
/// Get current call stack height
|
||||||
}
|
SyscallGetStackHeight,
|
||||||
impl<'a, 'b> SyscallGetStackHeight<'a, 'b> {
|
|
||||||
pub fn init(invoke_context: SyscallContext<'a, 'b>) -> Box<(dyn SyscallObject<BpfError> + 'a)> {
|
|
||||||
Box::new(Self { invoke_context })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl<'a, 'b> SyscallObject<BpfError> for SyscallGetStackHeight<'a, 'b> {
|
|
||||||
fn call(
|
fn call(
|
||||||
&mut self,
|
&mut self,
|
||||||
_arg1: u64,
|
_arg1: u64,
|
||||||
|
@ -3511,7 +3323,7 @@ impl<'a, 'b> SyscallObject<BpfError> for SyscallGetStackHeight<'a, 'b> {
|
||||||
|
|
||||||
*result = Ok(invoke_context.get_stack_height() as u64);
|
*result = Ok(invoke_context.get_stack_height() as u64);
|
||||||
}
|
}
|
||||||
}
|
);
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
|
|
Loading…
Reference in New Issue