Line data Source code
1 : #include "fd_vm_syscall.h"
2 :
3 : int
4 : fd_vm_syscall_register( fd_sbpf_syscalls_t * syscalls,
5 : char const * name,
6 336 : fd_sbpf_syscall_func_t func ) {
7 336 : if( FD_UNLIKELY( (!syscalls) | (!name) ) ) return FD_VM_ERR_INVAL;
8 :
9 336 : fd_sbpf_syscalls_t * syscall = fd_sbpf_syscalls_insert( syscalls, (ulong)fd_murmur3_32( name, strlen( name ), 0U ) );
10 336 : if( FD_UNLIKELY( !syscall ) ) return FD_VM_ERR_INVAL; /* name (or hash of name) already in map */
11 :
12 336 : syscall->func = func;
13 336 : syscall->name = name;
14 :
15 336 : return FD_VM_SUCCESS;
16 336 : }
17 :
18 : int
19 : fd_vm_syscall_register_slot( fd_sbpf_syscalls_t * syscalls,
20 : ulong slot,
21 : fd_features_t const * features,
22 9 : uchar is_deploy ) {
23 9 : if( FD_UNLIKELY( !syscalls ) ) return FD_VM_ERR_INVAL;
24 :
25 9 : int enable_blake3_syscall = 0;
26 9 : int enable_curve25519_syscall = 0;
27 9 : int enable_poseidon_syscall = 0;
28 9 : int enable_alt_bn128_syscall = 0;
29 9 : int enable_alt_bn128_compression_syscall = 0;
30 9 : int enable_last_restart_slot_syscall = 0;
31 9 : int enable_get_sysvar_syscall = 0;
32 9 : int enable_get_epoch_stake_syscall = 0;
33 :
34 9 : if( slot ) {
35 9 : enable_blake3_syscall = FD_FEATURE_ACTIVE( slot, features, blake3_syscall_enabled );
36 9 : enable_curve25519_syscall = FD_FEATURE_ACTIVE( slot, features, curve25519_syscall_enabled );
37 9 : enable_poseidon_syscall = FD_FEATURE_ACTIVE( slot, features, enable_poseidon_syscall );
38 9 : enable_alt_bn128_syscall = FD_FEATURE_ACTIVE( slot, features, enable_alt_bn128_syscall );
39 9 : enable_alt_bn128_compression_syscall = FD_FEATURE_ACTIVE( slot, features, enable_alt_bn128_compression_syscall );
40 9 : enable_last_restart_slot_syscall = FD_FEATURE_ACTIVE( slot, features, last_restart_slot_sysvar );
41 9 : enable_get_sysvar_syscall = FD_FEATURE_ACTIVE( slot, features, get_sysvar_syscall_enabled );
42 9 : enable_get_epoch_stake_syscall = FD_FEATURE_ACTIVE( slot, features, enable_get_epoch_stake_syscall );
43 :
44 9 : } else { /* enable ALL */
45 :
46 0 : enable_blake3_syscall = 1;
47 0 : enable_curve25519_syscall = 1;
48 0 : enable_poseidon_syscall = 1;
49 0 : enable_alt_bn128_syscall = 1;
50 0 : enable_alt_bn128_compression_syscall = 1;
51 0 : enable_last_restart_slot_syscall = 1;
52 0 : enable_get_sysvar_syscall = 1;
53 0 : enable_get_epoch_stake_syscall = 1;
54 :
55 0 : }
56 :
57 9 : fd_sbpf_syscalls_clear( syscalls );
58 :
59 9 : ulong syscall_cnt = 0UL;
60 :
61 333 : # define REGISTER(name,func) do { \
62 333 : if( FD_UNLIKELY( syscall_cnt>=fd_sbpf_syscalls_key_max() ) ) return FD_VM_ERR_FULL; \
63 333 : int _err = fd_vm_syscall_register( syscalls, (name), (func) ); \
64 333 : if( FD_UNLIKELY( _err ) ) return _err; \
65 333 : syscall_cnt++; \
66 333 : } while(0)
67 :
68 : /* Firedancer only (FIXME: HMMMM) */
69 :
70 9 : REGISTER( "abort", fd_vm_syscall_abort );
71 9 : REGISTER( "sol_panic_", fd_vm_syscall_sol_panic );
72 :
73 : /* As of the activation of disable_deploy_of_alloc_free_syscall, which is activated on all networks,
74 : programs can no longer be deployed which use the sol_alloc_free_ syscall.
75 :
76 : https://github.com/anza-xyz/agave/blob/d6041c002bbcf1526de4e38bc18fa6e781c380e7/programs/bpf_loader/src/syscalls/mod.rs#L429 */
77 9 : if ( FD_LIKELY( !is_deploy ) ) {
78 9 : REGISTER( "sol_alloc_free_", fd_vm_syscall_sol_alloc_free );
79 9 : }
80 :
81 : /* https://github.com/solana-labs/solana/blob/v1.18.1/sdk/program/src/syscalls/definitions.rs#L39 */
82 :
83 9 : REGISTER( "sol_log_", fd_vm_syscall_sol_log );
84 9 : REGISTER( "sol_log_64_", fd_vm_syscall_sol_log_64 );
85 9 : REGISTER( "sol_log_compute_units_", fd_vm_syscall_sol_log_compute_units );
86 9 : REGISTER( "sol_log_pubkey", fd_vm_syscall_sol_log_pubkey );
87 9 : REGISTER( "sol_create_program_address", fd_vm_syscall_sol_create_program_address );
88 9 : REGISTER( "sol_try_find_program_address", fd_vm_syscall_sol_try_find_program_address );
89 9 : REGISTER( "sol_sha256", fd_vm_syscall_sol_sha256 );
90 9 : REGISTER( "sol_keccak256", fd_vm_syscall_sol_keccak256 );
91 9 : REGISTER( "sol_secp256k1_recover", fd_vm_syscall_sol_secp256k1_recover );
92 :
93 9 : if( enable_blake3_syscall )
94 9 : REGISTER( "sol_blake3", fd_vm_syscall_sol_blake3 );
95 :
96 9 : REGISTER( "sol_get_clock_sysvar", fd_vm_syscall_sol_get_clock_sysvar );
97 9 : REGISTER( "sol_get_epoch_schedule_sysvar", fd_vm_syscall_sol_get_epoch_schedule_sysvar );
98 :
99 9 : REGISTER( "sol_get_rent_sysvar", fd_vm_syscall_sol_get_rent_sysvar );
100 :
101 9 : if( FD_LIKELY( enable_last_restart_slot_syscall ) ) {
102 9 : REGISTER( "sol_get_last_restart_slot", fd_vm_syscall_sol_get_last_restart_slot_sysvar );
103 9 : }
104 :
105 9 : if( enable_get_sysvar_syscall ) {
106 9 : REGISTER( "sol_get_sysvar", fd_vm_syscall_sol_get_sysvar );
107 9 : }
108 :
109 9 : if( enable_get_epoch_stake_syscall ) {
110 9 : REGISTER( "sol_get_epoch_stake", fd_vm_syscall_sol_get_epoch_stake );
111 9 : }
112 :
113 9 : REGISTER( "sol_memcpy_", fd_vm_syscall_sol_memcpy );
114 9 : REGISTER( "sol_memmove_", fd_vm_syscall_sol_memmove );
115 9 : REGISTER( "sol_memcmp_", fd_vm_syscall_sol_memcmp );
116 9 : REGISTER( "sol_memset_", fd_vm_syscall_sol_memset );
117 9 : REGISTER( "sol_invoke_signed_c", fd_vm_syscall_cpi_c );
118 9 : REGISTER( "sol_invoke_signed_rust", fd_vm_syscall_cpi_rust );
119 9 : REGISTER( "sol_set_return_data", fd_vm_syscall_sol_set_return_data );
120 9 : REGISTER( "sol_get_return_data", fd_vm_syscall_sol_get_return_data );
121 9 : REGISTER( "sol_log_data", fd_vm_syscall_sol_log_data );
122 9 : REGISTER( "sol_get_processed_sibling_instruction", fd_vm_syscall_sol_get_processed_sibling_instruction );
123 9 : REGISTER( "sol_get_stack_height", fd_vm_syscall_sol_get_stack_height );
124 9 : REGISTER( "sol_get_epoch_rewards_sysvar", fd_vm_syscall_sol_get_epoch_rewards_sysvar );
125 :
126 9 : if( enable_curve25519_syscall ) {
127 9 : REGISTER( "sol_curve_validate_point", fd_vm_syscall_sol_curve_validate_point );
128 9 : REGISTER( "sol_curve_group_op", fd_vm_syscall_sol_curve_group_op );
129 9 : REGISTER( "sol_curve_multiscalar_mul", fd_vm_syscall_sol_curve_multiscalar_mul );
130 9 : }
131 :
132 : // NOTE: sol_curve_pairing_map is defined but never implemented /
133 : // used, we can ignore it for now
134 : //REGISTER( "sol_curve_pairing_map", fd_vm_syscall_sol_curve_pairing_map );
135 :
136 9 : if( enable_alt_bn128_syscall )
137 9 : REGISTER( "sol_alt_bn128_group_op", fd_vm_syscall_sol_alt_bn128_group_op );
138 :
139 : //REGISTER( "sol_big_mod_exp", fd_vm_syscall_sol_big_mod_exp );
140 :
141 9 : if( enable_poseidon_syscall )
142 9 : REGISTER( "sol_poseidon", fd_vm_syscall_sol_poseidon );
143 :
144 : //REGISTER( "sol_remaining_compute_units", fd_vm_syscall_sol_remaining_compute_units );
145 :
146 9 : if( enable_alt_bn128_compression_syscall )
147 9 : REGISTER( "sol_alt_bn128_compression", fd_vm_syscall_sol_alt_bn128_compression );
148 :
149 9 : # undef REGISTER
150 :
151 9 : return FD_VM_SUCCESS;
152 9 : }
|