Skip to content

Commit

Permalink
Adds dense syscall keys
Browse files Browse the repository at this point in the history
  • Loading branch information
Lichtso committed Dec 16, 2024
1 parent df158ff commit d1b8459
Showing 1 changed file with 73 additions and 54 deletions.
127 changes: 73 additions & 54 deletions programs/bpf_loader/src/syscalls/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ use {
solana_sbpf::{
declare_builtin_function,
memory_region::{AccessType, MemoryMapping},
program::{BuiltinFunction, BuiltinProgram, FunctionRegistry, SBPFVersion},
program::{BuiltinProgram, FunctionRegistry, SBPFVersion},
vm::Config,
},
solana_sdk::{
Expand Down Expand Up @@ -233,11 +233,11 @@ fn consume_compute_meter(invoke_context: &InvokeContext, amount: u64) -> Result<
}

macro_rules! register_feature_gated_function {
($result:expr, $is_feature_active:expr, $name:expr, $call:expr $(,)?) => {
($result:expr, $is_feature_active:expr, $name:expr, $key:expr, $call:expr $(,)?) => {
if $is_feature_active {
$result.register_function_hashed($name, $call)
$result.register_function($name, $key, $call)
} else {
Ok(0)
Ok(())
}
};
}
Expand All @@ -252,16 +252,16 @@ pub fn morph_into_deployment_environment_v1(
// config.enabled_sbpf_versions =
// *config.enabled_sbpf_versions.end()..=*config.enabled_sbpf_versions.end();

let mut result = FunctionRegistry::<BuiltinFunction<InvokeContext>>::default();
let mut result = BuiltinProgram::new_loader_with_dense_registration(config);

for (key, (name, value)) in from.get_function_registry(SBPFVersion::V0).iter() {
for (key, (name, value)) in from.get_function_registry(SBPFVersion::V3).iter() {
// Deployment of programs with sol_alloc_free is disabled. So do not register the syscall.
if name != *b"sol_alloc_free_" {
result.register_function(key, name, value)?;
result.register_function(unsafe { std::str::from_utf8_unchecked(name) }, key, value)?;
}
}

Ok(BuiltinProgram::new_loader(config, result))
Ok(result)
}

pub fn create_program_runtime_environment_v1<'a>(
Expand Down Expand Up @@ -324,186 +324,205 @@ pub fn create_program_runtime_environment_v1<'a>(
aligned_memory_mapping: !feature_set.is_active(&bpf_account_data_direct_mapping::id()),
// Warning, do not use `Config::default()` so that configuration here is explicit.
};
let mut result = FunctionRegistry::<BuiltinFunction<InvokeContext>>::default();
let mut result = BuiltinProgram::new_loader_with_dense_registration(config);

// Abort
result.register_function_hashed(*b"abort", SyscallAbort::vm)?;
result.register_function("abort", 1, SyscallAbort::vm)?;

// Panic
result.register_function_hashed(*b"sol_panic_", SyscallPanic::vm)?;
result.register_function("sol_panic_", 2, SyscallPanic::vm)?;

// Logging
result.register_function_hashed(*b"sol_log_", SyscallLog::vm)?;
result.register_function_hashed(*b"sol_log_64_", SyscallLogU64::vm)?;
result.register_function_hashed(*b"sol_log_compute_units_", SyscallLogBpfComputeUnits::vm)?;
result.register_function_hashed(*b"sol_log_pubkey", SyscallLogPubkey::vm)?;
result.register_function("sol_log_", 7, SyscallLog::vm)?;
result.register_function("sol_log_64_", 8, SyscallLogU64::vm)?;
result.register_function("sol_log_pubkey", 9, SyscallLogPubkey::vm)?;
result.register_function("sol_log_compute_units_", 10, SyscallLogBpfComputeUnits::vm)?;

// Program defined addresses (PDA)
result.register_function_hashed(
*b"sol_create_program_address",
result.register_function(
"sol_create_program_address",
32,
SyscallCreateProgramAddress::vm,
)?;
result.register_function_hashed(
*b"sol_try_find_program_address",
result.register_function(
"sol_try_find_program_address",
33,
SyscallTryFindProgramAddress::vm,
)?;

// Sha256
result.register_function_hashed(*b"sol_sha256", SyscallHash::vm::<Sha256Hasher>)?;
result.register_function("sol_sha256", 17, SyscallHash::vm::<Sha256Hasher>)?;

// Keccak256
result.register_function_hashed(*b"sol_keccak256", SyscallHash::vm::<Keccak256Hasher>)?;
result.register_function("sol_keccak256", 18, SyscallHash::vm::<Keccak256Hasher>)?;

// Secp256k1 Recover
result.register_function_hashed(*b"sol_secp256k1_recover", SyscallSecp256k1Recover::vm)?;
result.register_function("sol_secp256k1_recover", 19, SyscallSecp256k1Recover::vm)?;

// Blake3
register_feature_gated_function!(
result,
blake3_syscall_enabled,
*b"sol_blake3",
"sol_blake3",
20,
SyscallHash::vm::<Blake3Hasher>,
)?;

// Elliptic Curve Operations
register_feature_gated_function!(
result,
curve25519_syscall_enabled,
*b"sol_curve_validate_point",
"sol_curve_validate_point",
24,
SyscallCurvePointValidation::vm,
)?;
register_feature_gated_function!(
result,
curve25519_syscall_enabled,
*b"sol_curve_group_op",
"sol_curve_group_op",
25,
SyscallCurveGroupOps::vm,
)?;
register_feature_gated_function!(
result,
curve25519_syscall_enabled,
*b"sol_curve_multiscalar_mul",
"sol_curve_multiscalar_mul",
26,
SyscallCurveMultiscalarMultiplication::vm,
)?;

// Sysvars
result.register_function_hashed(*b"sol_get_clock_sysvar", SyscallGetClockSysvar::vm)?;
result.register_function_hashed(
*b"sol_get_epoch_schedule_sysvar",
result.register_function("sol_get_clock_sysvar", 36, SyscallGetClockSysvar::vm)?;
result.register_function(
"sol_get_epoch_schedule_sysvar",
37,
SyscallGetEpochScheduleSysvar::vm,
)?;
register_feature_gated_function!(
result,
!disable_fees_sysvar,
*b"sol_get_fees_sysvar",
"sol_get_fees_sysvar",
40,
SyscallGetFeesSysvar::vm,
)?;
result.register_function_hashed(*b"sol_get_rent_sysvar", SyscallGetRentSysvar::vm)?;
result.register_function("sol_get_rent_sysvar", 41, SyscallGetRentSysvar::vm)?;

register_feature_gated_function!(
result,
last_restart_slot_syscall_enabled,
*b"sol_get_last_restart_slot",
"sol_get_last_restart_slot",
38,
SyscallGetLastRestartSlotSysvar::vm,
)?;

register_feature_gated_function!(
result,
epoch_rewards_syscall_enabled,
*b"sol_get_epoch_rewards_sysvar",
"sol_get_epoch_rewards_sysvar",
39,
SyscallGetEpochRewardsSysvar::vm,
)?;

// Memory ops
result.register_function_hashed(*b"sol_memcpy_", SyscallMemcpy::vm)?;
result.register_function_hashed(*b"sol_memmove_", SyscallMemmove::vm)?;
result.register_function_hashed(*b"sol_memcmp_", SyscallMemcmp::vm)?;
result.register_function_hashed(*b"sol_memset_", SyscallMemset::vm)?;
result.register_function("sol_memcpy_", 3, SyscallMemcpy::vm)?;
result.register_function("sol_memmove_", 4, SyscallMemmove::vm)?;
result.register_function("sol_memset_", 5, SyscallMemset::vm)?;
result.register_function("sol_memcmp_", 6, SyscallMemcmp::vm)?;

// Processed sibling instructions
result.register_function_hashed(
*b"sol_get_processed_sibling_instruction",
result.register_function(
"sol_get_processed_sibling_instruction",
22,
SyscallGetProcessedSiblingInstruction::vm,
)?;

// Stack height
result.register_function_hashed(*b"sol_get_stack_height", SyscallGetStackHeight::vm)?;
result.register_function("sol_get_stack_height", 23, SyscallGetStackHeight::vm)?;

// Return data
result.register_function_hashed(*b"sol_set_return_data", SyscallSetReturnData::vm)?;
result.register_function_hashed(*b"sol_get_return_data", SyscallGetReturnData::vm)?;
result.register_function("sol_set_return_data", 14, SyscallSetReturnData::vm)?;
result.register_function("sol_get_return_data", 15, SyscallGetReturnData::vm)?;

// Cross-program invocation
result.register_function_hashed(*b"sol_invoke_signed_c", SyscallInvokeSignedC::vm)?;
result.register_function_hashed(*b"sol_invoke_signed_rust", SyscallInvokeSignedRust::vm)?;
result.register_function("sol_invoke_signed_c", 12, SyscallInvokeSignedC::vm)?;
result.register_function("sol_invoke_signed_rust", 13, SyscallInvokeSignedRust::vm)?;

// Memory allocator
register_feature_gated_function!(
result,
!disable_deploy_of_alloc_free_syscall,
*b"sol_alloc_free_",
"sol_alloc_free_",
11,
SyscallAllocFree::vm,
)?;

// Alt_bn128
register_feature_gated_function!(
result,
enable_alt_bn128_syscall,
*b"sol_alt_bn128_group_op",
"sol_alt_bn128_group_op",
28,
SyscallAltBn128::vm,
)?;

// Big_mod_exp
register_feature_gated_function!(
result,
enable_big_mod_exp_syscall,
*b"sol_big_mod_exp",
"sol_big_mod_exp",
30,
SyscallBigModExp::vm,
)?;

// Poseidon
register_feature_gated_function!(
result,
enable_poseidon_syscall,
*b"sol_poseidon",
"sol_poseidon",
21,
SyscallPoseidon::vm,
)?;

// Accessing remaining compute units
register_feature_gated_function!(
result,
remaining_compute_units_syscall_enabled,
*b"sol_remaining_compute_units",
"sol_remaining_compute_units",
31,
SyscallRemainingComputeUnits::vm
)?;

// Alt_bn128_compression
register_feature_gated_function!(
result,
enable_alt_bn128_compression_syscall,
*b"sol_alt_bn128_compression",
"sol_alt_bn128_compression",
29,
SyscallAltBn128Compression::vm,
)?;

// Sysvar getter
register_feature_gated_function!(
result,
get_sysvar_syscall_enabled,
*b"sol_get_sysvar",
"sol_get_sysvar",
34,
SyscallGetSysvar::vm,
)?;

// Get Epoch Stake
register_feature_gated_function!(
result,
enable_get_epoch_stake_syscall,
*b"sol_get_epoch_stake",
"sol_get_epoch_stake",
35,
SyscallGetEpochStake::vm,
)?;

// Log data
result.register_function_hashed(*b"sol_log_data", SyscallLogData::vm)?;
result.register_function("sol_log_data", 16, SyscallLogData::vm)?;

Ok(BuiltinProgram::new_loader(config, result))
Ok(result)
}

pub fn create_program_runtime_environment_v2<'a>(
Expand Down

0 comments on commit d1b8459

Please sign in to comment.