Skip to content

Commit

Permalink
flamenco, vm: implement last restart slot syscall
Browse files Browse the repository at this point in the history
  • Loading branch information
topointon-jump committed Jul 31, 2024
1 parent 4907384 commit b942955
Show file tree
Hide file tree
Showing 5 changed files with 54 additions and 12 deletions.
2 changes: 1 addition & 1 deletion src/flamenco/runtime/sysvar/fd_sysvar_last_restart_slot.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ fd_sysvar_last_restart_slot_init( fd_exec_slot_ctx_t * slot_ctx ) {
0UL );
}

static fd_sol_sysvar_last_restart_slot_t *
fd_sol_sysvar_last_restart_slot_t *
fd_sysvar_last_restart_slot_read( fd_sol_sysvar_last_restart_slot_t * result,
fd_exec_slot_ctx_t const * slot_ctx ) {

Expand Down
8 changes: 8 additions & 0 deletions src/flamenco/runtime/sysvar/fd_sysvar_last_restart_slot.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,14 @@ fd_sysvar_last_restart_slot_init( fd_exec_slot_ctx_t * slot_ctx );
void
fd_sysvar_last_restart_slot_update( fd_exec_slot_ctx_t * slot_ctx );

/* fd_sysvar_last_restart_slot queries the last restart slot sysvar from the given slot
context. The sysvar is written into *result (may be uninitialized).
Returns result on success, NULL otherwise. */

fd_sol_sysvar_last_restart_slot_t *
fd_sysvar_last_restart_slot_read( fd_sol_sysvar_last_restart_slot_t * result,
fd_exec_slot_ctx_t const * slot_ctx );

FD_PROTOTYPES_END

#endif /* HEADER_fd_src_flamenco_runtime_fd_sysvar_last_restart_slot_h */
9 changes: 8 additions & 1 deletion src/flamenco/vm/syscall/fd_vm_syscall.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ fd_vm_syscall_register_slot( fd_sbpf_syscalls_t * syscalls,
int enable_curve25519_syscall = 0;
int enable_poseidon_syscall = 0;
int enable_alt_bn128_compression_syscall = 0;
int enable_last_restart_slot_syscall = 0;

int disable_fees_sysvar = 0;

Expand All @@ -36,6 +37,7 @@ fd_vm_syscall_register_slot( fd_sbpf_syscalls_t * syscalls,
enable_curve25519_syscall = FD_FEATURE_ACTIVE( slot_ctx, curve25519_syscall_enabled );
enable_poseidon_syscall = FD_FEATURE_ACTIVE( slot_ctx, enable_poseidon_syscall );
enable_alt_bn128_compression_syscall = FD_FEATURE_ACTIVE( slot_ctx, enable_alt_bn128_compression_syscall );
enable_last_restart_slot_syscall = FD_FEATURE_ACTIVE( slot_ctx, last_restart_slot_sysvar );

disable_fees_sysvar = !FD_FEATURE_ACTIVE( slot_ctx, disable_fees_sysvar );

Expand All @@ -46,6 +48,7 @@ fd_vm_syscall_register_slot( fd_sbpf_syscalls_t * syscalls,
enable_curve25519_syscall = 1;
enable_poseidon_syscall = 1;
enable_alt_bn128_compression_syscall = 1;
enable_last_restart_slot_syscall = 1;

}

Expand Down Expand Up @@ -98,7 +101,11 @@ fd_vm_syscall_register_slot( fd_sbpf_syscalls_t * syscalls,
REGISTER( "sol_get_fees_sysvar", fd_vm_syscall_sol_get_fees_sysvar );

REGISTER( "sol_get_rent_sysvar", fd_vm_syscall_sol_get_rent_sysvar );
//REGISTER( "sol_get_last_restart_slot", fd_vm_syscall_sol_get_last_restart_slot );

if( FD_LIKELY( enable_last_restart_slot_syscall ) ) {
REGISTER( "sol_get_last_restart_slot", fd_vm_syscall_sol_get_last_restart_slot_sysvar );
}

REGISTER( "sol_memcpy_", fd_vm_syscall_sol_memcpy );
REGISTER( "sol_memmove_", fd_vm_syscall_sol_memmove );
REGISTER( "sol_memcmp_", fd_vm_syscall_sol_memcmp );
Expand Down
23 changes: 13 additions & 10 deletions src/flamenco/vm/syscall/fd_vm_syscall.h
Original file line number Diff line number Diff line change
Expand Up @@ -402,11 +402,12 @@ FD_VM_SYSCALL_DECL( sol_memmove );
syscall(FIXME) "sol_get_epoch_schedule_sysvar"
syscall(FIXME) "sol_get_fees_sysvar"
syscall(FIXME) "sol_get_rent_sysvar"
syscall(FIXME) "sol_get_last_restart_slot_sysvar"
Get various sysvar values
Inputs:
r1 - out, {clock,schedule,fees,rent} VM pointer
r1 - out, {clock,schedule,fees,rent,last_restart_slot} VM pointer
r2 - ignored
r3 - ignored
r4 - ignored
Expand All @@ -422,20 +423,22 @@ FD_VM_SYSCALL_DECL( sol_memmove );
FD_VM_ERR_SIGSEGV: bad address range. *_ret unchanged. vm->cu
decremented and vm->cu>0. out should have:
| align | sz
clock | 8 | 40
schedule | 1 | 40 ... FIXME: CHECK THIS IS CORRECT!
fees | 8 | 8
rent | 8 | 24
| align | sz
clock | 8 | 40
schedule | 1 | 40 ... FIXME: CHECK THIS IS CORRECT!
fees | 8 | 8
rent | 8 | 24
last restart slot | 8 | 8
Strict alignment is only required when the VM has check_align set.
FD_VM_SUCCESS: success. *_ret=0. vm->cu decremented and vm->cu>0.
On return, *out will hold the value of the appropriate sysvar. */

FD_VM_SYSCALL_DECL( sol_get_clock_sysvar );
FD_VM_SYSCALL_DECL( sol_get_epoch_schedule_sysvar );
FD_VM_SYSCALL_DECL( sol_get_fees_sysvar );
FD_VM_SYSCALL_DECL( sol_get_rent_sysvar );
FD_VM_SYSCALL_DECL( sol_get_clock_sysvar );
FD_VM_SYSCALL_DECL( sol_get_epoch_schedule_sysvar );
FD_VM_SYSCALL_DECL( sol_get_fees_sysvar );
FD_VM_SYSCALL_DECL( sol_get_rent_sysvar );
FD_VM_SYSCALL_DECL( sol_get_last_restart_slot_sysvar );

/* syscall(FIXME) "sol_get_stack_height"
Expand Down
24 changes: 24 additions & 0 deletions src/flamenco/vm/syscall/fd_vm_syscall_runtime.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
#include "../../runtime/sysvar/fd_sysvar_epoch_schedule.h"
#include "../../runtime/sysvar/fd_sysvar_fees.h"
#include "../../runtime/sysvar/fd_sysvar_rent.h"
#include "../../runtime/sysvar/fd_sysvar_last_restart_slot.h"
#include "../../runtime/context/fd_exec_txn_ctx.h"
#include "../../runtime/context/fd_exec_instr_ctx.h"

Expand Down Expand Up @@ -151,6 +152,29 @@ fd_vm_syscall_sol_get_rent_sysvar( /**/ void * _vm,
return FD_VM_SUCCESS;
}

/* https://github.com/anza-xyz/agave/blob/36323b6dcd3e29e4d6fe6d73d716a3f33927148b/programs/bpf_loader/src/syscalls/sysvar.rs#L144 */
int
fd_vm_syscall_sol_get_last_restart_slot_sysvar( /**/ void * _vm,
/**/ ulong out_vaddr,
FD_PARAM_UNUSED ulong r2,
FD_PARAM_UNUSED ulong r3,
FD_PARAM_UNUSED ulong r4,
FD_PARAM_UNUSED ulong r5,
/**/ ulong * _ret ) {
fd_vm_t * vm = (fd_vm_t *)_vm;

FD_VM_CU_UPDATE( vm, fd_ulong_sat_add( FD_VM_SYSVAR_BASE_COST, FD_SOL_SYSVAR_LAST_RESTART_SLOT_FOOTPRINT ) );

fd_sol_sysvar_last_restart_slot_t * out =
FD_VM_MEM_HADDR_ST( vm, out_vaddr, FD_SOL_SYSVAR_LAST_RESTART_SLOT_ALIGN, FD_SOL_SYSVAR_LAST_RESTART_SLOT_FOOTPRINT );
if( FD_UNLIKELY( fd_sysvar_last_restart_slot_read( out, vm->instr_ctx->slot_ctx ) == NULL ) ) {
return FD_VM_ERR_ABORT;
}

*_ret = 0UL;
return FD_VM_SUCCESS;
}

int
fd_vm_syscall_sol_get_stack_height( /**/ void * _vm,
FD_PARAM_UNUSED ulong r1,
Expand Down

0 comments on commit b942955

Please sign in to comment.