LCOV - code coverage report
Current view: top level - flamenco/vm/syscall - fd_vm_syscall.h (source / functions) Hit Total Coverage
Test: cov.lcov Lines: 41 45 91.1 %
Date: 2026-11-11 12:40:43 Functions: 0 0 -

          Line data    Source code
       1             : #ifndef HEADER_fd_src_flamenco_vm_syscall_fd_vm_syscall_h
       2             : #define HEADER_fd_src_flamenco_vm_syscall_fd_vm_syscall_h
       3             : 
       4             : #include "../fd_vm_private.h"
       5             : #include "fd_vm_syscall_macros.h"
       6             : #include "fd_vm_cpi.h"                /* FIXME: REFINE THIS MORE */
       7             : #include "../../runtime/fd_runtime.h" /* FIXME: REFINE THIS MORE */
       8             : #include "../../runtime/context/fd_exec_instr_ctx.h"
       9             : #include "../../log_collector/fd_log_collector.h"
      10             : 
      11             : #define FD_VM_RETURN_DATA_MAX  (1024UL) /* FIXME: DOCUMENT AND DOES THIS BELONG HERE? */
      12             : 
      13             : /* The maximum number of seeds a PDA can have
      14             :    https://github.com/solana-labs/solana/blob/2afde1b028ed4593da5b6c735729d8994c4bfac6/sdk/program/src/pubkey.rs#L21 */
      15             : #define FD_VM_PDA_SEEDS_MAX    (16UL)
      16             : /* The maximum length of a PDA seed
      17             :    https://github.com/solana-labs/solana/blob/2afde1b028ed4593da5b6c735729d8994c4bfac6/sdk/program/src/pubkey.rs#L19 */
      18             : #define FD_VM_PDA_SEED_MEM_MAX (32UL)
      19             : 
      20             : /* PYTHON3 CODE FOR COMPUTING THE SYSCALL MURMUR3 HASH (e.g. sol_get_epoch_stake):
      21             :   ```
      22             :   import mmh3
      23             :   import ctypes
      24             : 
      25             :   def compute_murmur3_hash(input_string):
      26             :       # Compute the Murmur3 hash of the input string
      27             :       hash_value = mmh3.hash(input_string)
      28             :       # Convert the hash value to a 32-bit unsigned integer
      29             :       u32_hash_value = ctypes.c_uint32(hash_value).value
      30             :       return u32_hash_value
      31             : 
      32             :   input_string = b"sol_get_epoch_stake"
      33             :   hash_value = compute_murmur3_hash(input_string)
      34             :   print(f"The Murmur3 hash of '{input_string}' as u32 is: {hex(hash_value)}")
      35             : 
      36             :   Output:
      37             :   The Murmur3 hash of 'b'sol_get_epoch_stake'' as u32 is: 0x5be92f4a
      38             :   ```
      39             : */
      40             : 
      41             : /* https://github.com/solana-labs/solana/blob/2afde1b028ed4593da5b6c735729d8994c4bfac6/sdk/program/src/pubkey.rs#L22 */
      42             : 
      43             : /* FIXME: CONSIDER NOT PREFIXING SYSCALLS WITH SOL_? (OR MAYBE THIS
      44             :    IS NECESSARY TO DISAMBIGUATE SOLANA SYSCALLS FROM NON-SOLANA?
      45             :    SYSCALLS? */
      46             : 
      47             : /* FD_VM_SYSCALL_DECL declares a prototype of a syscall.  When a
      48             :    syscall implementation is called, the syscall will see a precise
      49             :    reporting VM's state at time of the syscall.  Notably:
      50             : 
      51             :    - vm->pc will be at the syscall instruction
      52             :    - vm->ic will include the syscall instruction
      53             :    - vm->cu will include the 1 cu cost of the syscall instruction.
      54             :      Further, it will be positive.
      55             : 
      56             :    r1,r2,r3,r4,r5 are the values in r1,r2,r3,r4,r5 at time of the
      57             :    syscall.
      58             : 
      59             :    When a syscall implementation returns FD_VM_SUCCESS, vm->reg[0] holds
      60             :    the application return value.
      61             : 
      62             :    When an syscall implementation returns FD_VM_SYSCALL_ERR*, the
      63             :    syscall is considered to have faulted the VM.  It ideally should not
      64             :    have set vm->reg[0] (or changed any vm state, except vm->cu, though
      65             :    that often isn't practical, and not critical to consensus).
      66             : 
      67             :    It is the syscall's responsibility to deduct from vm->cu its specific
      68             :    cost model (not including the syscall instruction itself).  As such,
      69             :    when a syscall returns COMPUTE_BUDGET_EXCEEDED, it should have set
      70             :    vm->cu to zero. When it returns anything else, it should have set cu
      71             :    to something in [0,cu_at_function_entry] (upper bound inclusive,
      72             :    despite most syscalls deducing base CUs first thing, some don't,
      73             :    e.g., sol_sha256).
      74             : 
      75             :    To mitigate risks of from syscall implementations that do not
      76             :    strictly enforce this and other similar risks that can affect
      77             :    bookkeeping, on return from a syscall, the VM will:
      78             : 
      79             :    - Ignore updates to pc, ic and frame_cnt.
      80             :    - Ignore updates to cu that increase it.
      81             :    - Treat updates to cu that zero it as SIGCOST.
      82             :    - Treat SIGCOST returns that didn't update cu to zero as zeroing it.
      83             : 
      84             :    FIXME: ADD NO SETTING OF R0 ON VM_ERR IN VM_INTERP. */
      85             : 
      86             : #define FD_VM_SYSCALL_DECL(name)   \
      87             : int                                \
      88             : fd_vm_syscall_##name( void *  _vm, \
      89             :                       ulong   r1,  \
      90             :                       ulong   r2,  \
      91             :                       ulong   r3,  \
      92             :                       ulong   r4,  \
      93             :                       ulong   r5 )
      94             : 
      95             : FD_PROTOTYPES_BEGIN
      96             : 
      97             : /* fd_vm_syscall_util *************************************************/
      98             : 
      99             : /* syscall(b6fc1a11) "abort"
     100             :    Abort program execution and fail transaction.
     101             : 
     102             :    Inputs:
     103             : 
     104             :      r1 - ignored
     105             :      r2 - ignored
     106             :      r3 - ignored
     107             :      r4 - ignored
     108             :      r5 - ignored
     109             : 
     110             :    Return:
     111             : 
     112             :      FD_VM_SYSCALL_ERR_ABORT: vm->reg[0] unchanged.  vm->cu unchanged.
     113             : 
     114             :    FIXME: SHOULD THIS BE NAMED "SOL_ABORT"? */
     115             : 
     116             : FD_VM_SYSCALL_DECL( abort );
     117             : 
     118             : /* syscall(686093bb) "sol_panic_"
     119             :    Log panic message, abort program execution, and fail transaction.
     120             : 
     121             :    Inputs:
     122             : 
     123             :      r1 - file, byte VM pointer, indexed [0,file_sz), not necessarily
     124             :           \0 terminated and may contain \0 within,
     125             :      r2 - file_sz, may be 0,
     126             :      r3 - line (currently ignored)
     127             :      r4 - column (currently ignored)
     128             :      r5 - ignored
     129             : 
     130             :    Return:
     131             : 
     132             :      FD_VM_SYSCALL_ERR_COMPUTE_BUDGET_EXCEEDED: insufficient compute
     133             :      budget.  vm->reg[0] unchanged.  vm->cu==0.
     134             : 
     135             :      FD_VM_SYSCALL_ERR_SEGFAULT: invalid file address range.
     136             : 
     137             :      FD_VM_SYSCALL_ERR_INVALID_LENGTH: file_sz exceeds LONG_MAX.
     138             : 
     139             :      FD_VM_SYSCALL_ERR_INVALID_STRING: Bad filepath string, file is not
     140             :      a valid sequence of utf8 bytes.  vm->reg[0] unchanged and vm->cu>=0.
     141             : 
     142             :      FD_VM_SYSCALL_ERR_PANIC: vm->reg[0] unchanged.  vm->cu
     143             :      decremented and vm->cu>=0. */
     144             : 
     145             : FD_VM_SYSCALL_DECL( sol_panic );
     146             : 
     147             : /* syscall(207559bd) "sol_log_"
     148             :    Write message encoded as (msg, msg_sz) to log, prefixed with
     149             :    "Program log: ".
     150             : 
     151             :    Inputs:
     152             : 
     153             :      r1 - msg, byte VM pointer, indexed [0,msg_sz),
     154             :      r2 - msg_sz, may be 0,
     155             :      r3 - ignored
     156             :      r4 - ignored
     157             :      r5 - ignored
     158             : 
     159             :    Return:
     160             : 
     161             :      FD_VM_SYSCALL_ERR_COMPUTE_BUDGET_EXCEEDED: insufficient compute
     162             :      budget.  vm->reg[0] unchanged.  vm->cu==0.
     163             : 
     164             :      FD_VM_SYSCALL_ERR_SEGFAULT: invalid message address range.
     165             : 
     166             :      FD_VM_SYSCALL_ERR_INVALID_LENGTH: msg_sz exceeds LONG_MAX.
     167             : 
     168             :      FD_VM_SYSCALL_ERR_INVALID_STRING: bad message string.  vm->reg[0]
     169             :      unchanged. vm->cu decremented and vm->cu>=0.
     170             : 
     171             :      FD_VM_SUCCESS: success.  vm->reg[0]==0.  vm->cu decremented and
     172             :      vm->cu>=0.
     173             : 
     174             :      IMPORTANT SAFETY TIP!  The log message will be silently truncated
     175             :      if there was not enough room for the message in the syscall log
     176             :      when called. */
     177             : 
     178             : FD_VM_SYSCALL_DECL( sol_log );
     179             : 
     180             : /* syscall(5c2a3178) "sol_log_64_"
     181             :    Write r1:5 to the log as a hexadecimal
     182             : 
     183             :    Inputs:
     184             : 
     185             :      r1 - ulong
     186             :      r2 - ulong
     187             :      r3 - ulong
     188             :      r4 - ulong
     189             :      r5 - ulong
     190             : 
     191             :    Return:
     192             : 
     193             :      FD_VM_SYSCALL_ERR_COMPUTE_BUDGET_EXCEEDED: insufficient compute
     194             :      budget.  vm->reg[0] unchanged.  vm->cu==0.
     195             : 
     196             :      FD_VM_SUCCESS: success.  vm->reg[0]=0.  vm->cu decremented and
     197             :      vm->cu>=0.
     198             : 
     199             :      IMPORTANT SAFETY TIP!  The log message will be silently truncated
     200             :      if there was not enough room for the message in the syscall log
     201             :      when called. */
     202             : 
     203             : FD_VM_SYSCALL_DECL( sol_log_64 );
     204             : 
     205             : /* syscall(7ef088ca) "sol_log_pubkey"
     206             :    Write the base58 encoding of 32 byte array to the log.
     207             : 
     208             :    Inputs:
     209             : 
     210             :      r1 - pubkey, byte VM pointer, indexed [0,32)
     211             :      r2 - ignored
     212             :      r3 - ignored
     213             :      r4 - ignored
     214             :      r5 - ignored
     215             : 
     216             :    Return:
     217             : 
     218             :      FD_VM_SYSCALL_ERR_COMPUTE_BUDGET_EXCEEDED: insufficient compute
     219             :      budget.  vm->reg[0] unchanged.  vm->cu==0.
     220             : 
     221             :      FD_VM_SYSCALL_ERR_SEGFAULT: bad address range.  vm->reg[0] unchanged.
     222             :      vm->cu decremented and vm->cu>=0.
     223             : 
     224             :      FD_VM_SUCCESS: success.  vm->reg[0]==0.  vm->cu decremented and
     225             :      vm->cu>=0.
     226             : 
     227             :      IMPORTANT SAFETY TIP!  The log message will be silently truncated
     228             :      if there was not enough room for the message in the syscall log
     229             :      when called. */
     230             : 
     231             : FD_VM_SYSCALL_DECL( sol_log_pubkey );
     232             : 
     233             : /* syscall(52ba5096) "sol_log_compute_units_"
     234             :    Write remaining compute unit count to log.
     235             : 
     236             :    Inputs:
     237             : 
     238             :      r1 - ignored
     239             :      r2 - ignored
     240             :      r3 - ignored
     241             :      r4 - ignored
     242             :      r5 - ignored
     243             : 
     244             :    Return:
     245             : 
     246             :      FD_VM_SYSCALL_ERR_COMPUTE_BUDGET_EXCEEDED: insufficient compute
     247             :      budget.  vm->reg[0] unchanged.  vm->cu==0.
     248             : 
     249             :      FD_VM_SUCCESS: success.  vm->reg[0]=0.  vm->cu decremented
     250             :      and vm->cu>=0.  The value logged will be the value of cu when
     251             :      between when the syscall completed and the next iteration starts
     252             :      and will be >=0.
     253             : 
     254             :      IMPORTANT SAFETY TIP!  The log message will be silently truncated
     255             :      if there was not enough room for the message in the syscall log
     256             :      when called. */
     257             : 
     258             : FD_VM_SYSCALL_DECL( sol_log_compute_units );
     259             : 
     260             : /* syscall(7317b434) "sol_log_data"
     261             :    Write the base64 encoded cnt data slices to the log.
     262             : 
     263             :    Inputs:
     264             : 
     265             :      r1 - slice, ulong pair VM pointer, indexed [0,cnt),
     266             :      r2 - cnt, may be 0,
     267             :      r3 - ignored
     268             :      r4 - ignored
     269             :      r5 - ignored
     270             : 
     271             :      slice[i] holds the ulong pair:
     272             :        mem, byte VM pointer, indexed [0,sz),
     273             :        sz, may be 0
     274             : 
     275             :    Return:
     276             : 
     277             :      FD_VM_SYSCALL_ERR_COMPUTE_BUDGET_EXCEEDED: insufficient compute budget.
     278             :      vm->reg[0] unchanged. vm->cu==0.
     279             : 
     280             :      FD_VM_SYSCALL_ERR_SEGFAULT: bad address range.  vm->reg[0] unchanged.  vm->cu
     281             :      decremented and vm->cu>=0.
     282             : 
     283             :      FD_VM_SUCCESS: success.  vm->reg[0]=0.  vm->cu decremented and vm->cu>=0.
     284             : 
     285             :      IMPORTANT SAFETY TIP!  The log message will be silently truncated
     286             :      if there was not enough room for the message in the syscall log
     287             :      when called. */
     288             : 
     289             : FD_VM_SYSCALL_DECL( sol_log_data );
     290             : 
     291             : /* syscall(83f00e8f) "sol_alloc_free_"
     292             :    DEPRECATED ... dynamic heap allocation support
     293             : 
     294             :    Inputs:
     295             : 
     296             :      r1 - sz, ignored if vaddr is not 0
     297             :      r2 - free_vaddr, byte VM pointer
     298             :      r3 - ignored
     299             :      r4 - ignored
     300             :      r5 - ignored
     301             : 
     302             :    Return:
     303             : 
     304             :      All cases return FD_VM_SUCCESS and leave vm->cu unchanged.
     305             : 
     306             :      If free_vaddr is 0, this is "malloc"-like:
     307             : 
     308             :        Let the VM heap region cover bytes [heap_start,heap_end) with
     309             :        heap_start<=heap_end.  If the request was satisfied, on return,
     310             :        vm->reg[0] will point to a range of heap bytes [vm->reg[0],vm->reg[0]+sz) that
     311             :        does not overlap with any other current allocation such that
     312             :        heap_start<=vm->reg[0]<=vm->reg[0]+sz<=heap_end.  This includes the zero sz
     313             :        case (note that the zero sz case might return the same value as a
     314             :        previous zero sz case and/or return the exact value of heap_end).
     315             : 
     316             :        If the request cannot be satisfied, vm->reg[0]=0 on return and the
     317             :        heap unchanged.
     318             : 
     319             :        IMPORTANT SAFETY TIP!  If the VM has check_align set, this
     320             :        location will have at least 8 byte alignment.  Otherwise, this
     321             :        location will have no particular alignment.  Note that this
     322             :        implies allocations done by this syscall do not conform to the
     323             :        usual alignment requirements of a standard malloc call for older
     324             :        VM code.
     325             : 
     326             :      If vaddr is not-zero, this is "free"-like.  Since the underlying
     327             :      implementation is necessarily a bump allocator (see implementation
     328             :      for more details), the specific value is ignored and vm->reg[0]=0 on
     329             :      return. */
     330             : 
     331             : FD_VM_SYSCALL_DECL( sol_alloc_free );
     332             : 
     333             : /* syscall(717cc4a3) "sol_memcpy_"
     334             :    Copy sz bytes from src to dst.  src and dst should not overlap.
     335             : 
     336             :    Inputs:
     337             : 
     338             :      r1 - dst, byte VM pointer, indexed [0,sz),
     339             :      r2 - src, byte VM pointer, indexed [0,sz),
     340             :      r3 - sz,
     341             :      r4 - ignored
     342             :      r5 - ignored
     343             : 
     344             :   Return:
     345             : 
     346             :      FD_VM_SYSCALL_ERR_COMPUTE_BUDGET_EXCEEDED: insufficient compute
     347             :      budget.  vm->reg[0] unchanged.  vm->cu==0.
     348             : 
     349             :      FD_VM_SYSCALL_ERR_COPY_OVERLAPPING: address ranges for src and dst
     350             :      overlap (either partially or fully).  Empty address ranges are
     351             :      considered to **never** overlap.  vm->reg[0]==0.  vm->cu decremented and
     352             :      vm->cu>=0.
     353             : 
     354             :      FD_VM_SYSCALL_ERR_SEGFAULT: bad address range.  vm->reg[0]==0.  vm->cu
     355             :      decremented and vm->cu>=0.
     356             : 
     357             :      FD_VM_SUCCESS: success.  vm->reg[0]==0.  vm->cu decremented and
     358             :      vm->cu>=0. On return, dst[i]==src[i] for i in [0,sz). */
     359             : 
     360             : FD_VM_SYSCALL_DECL( sol_memcpy );
     361             : 
     362             : /* syscall(5fdcde31) "sol_memcmp_"
     363             :    Compare sz bytes at m0 to m1
     364             : 
     365             :    Inputs:
     366             : 
     367             :      r1 - m0, byte VM pointer, indexed [0,sz), FIXME: WHEN IS NULL OKAY?
     368             :      r2 - m1, byte VM pointer, indexed [0,sz), FIXME: WHEN IS NULL OKAY?
     369             :      r3 - sz, FIXME: IS SZ 0 OKAY?
     370             :      r4 - out, int VM pointer
     371             :      r5 - ignored
     372             : 
     373             :   Return:
     374             : 
     375             :      FD_VM_SYSCALL_ERR_COMPUTE_BUDGET_EXCEEDED: insufficient compute budget.
     376             :      vm->reg[0]==0. vm->cu==0.
     377             : 
     378             :      FD_VM_SYSCALL_ERR_SEGFAULT: bad address range (including out not 4 byte
     379             :      aligned).  vm->reg[0]==0.  vm->cu decremented and vm->cu>=0.
     380             :      Strict alignment is only required when the VM has check_align set.
     381             : 
     382             :      FD_VM_SUCCESS: success.  vm->reg[0]=0.  vm->cu decremented and vm->cu>=0.
     383             :      On return, *_out will hold a positive / zero / negative number if
     384             :      the region at m0 lexicographically compares strictly greater than /
     385             :      equal to / strictly less than the region at m1 when treated as
     386             :      uchars.  Specifically, if the regions are different, *_out will be
     387             :      (int)m0[i] - (int)m1[i] where i is the first differing byte.
     388             : 
     389             :      IMPORTANT SAFETY TIP!  Note that, strangely, this returns the result
     390             :      in memory instead of via vm->reg[0] like a libc-style memcmp would. */
     391             : 
     392             : FD_VM_SYSCALL_DECL( sol_memcmp );
     393             : 
     394             : /* syscall(3770fb22) "sol_memset_"
     395             :    Set sz bytes at dst to the byte value c.
     396             : 
     397             :    Inputs:
     398             : 
     399             :      r1 - dst, byte VM pointer, indexed [0,sz), FIXME: WHEN IS NULL OKAY?
     400             :      r2 - c, bits [8,64) ignored (FIXME: CHECK SOLANA DOES THIS)
     401             :      r3 - sz, may be 0,
     402             :      r4 - ignored
     403             :      r5 - ignored
     404             : 
     405             :   Return:
     406             : 
     407             :      FD_VM_SYSCALL_ERR_COMPUTE_BUDGET_EXCEEDED: insufficient compute budget.
     408             :      vm->reg[0]==0. vm->cu==0.
     409             : 
     410             :      FD_VM_SYSCALL_ERR_SEGFAULT: bad address range.  vm->reg[0]==0.  vm->cu
     411             :      decremented and vm->cu>=0.
     412             : 
     413             :      FD_VM_SUCCESS: success.  vm->reg[0]=0.  vm->cu decremented and vm->cu>=0.
     414             :      On return, dst[i]==(uchar)(c & 255UL) for i in [0,sz). */
     415             : 
     416             : FD_VM_SYSCALL_DECL( sol_memset );
     417             : 
     418             : /* syscall(434371f8) "sol_memmove_"
     419             :    Copy sz bytes from src to dst.  src and dst can overlap.
     420             : 
     421             :    Inputs:
     422             : 
     423             :      r1 - dst, byte VM pointer, indexed [0,sz),
     424             :      r2 - src, byte VM pointer, indexed [0,sz),
     425             :      r3 - sz, may be 0,
     426             :      r4 - ignored
     427             :      r5 - ignored
     428             : 
     429             :   Return:
     430             : 
     431             :      FD_VM_SYSCALL_ERR_COMPUTE_BUDGET_EXCEEDED: insufficient compute budget.
     432             :      vm->reg[0] unchanged. vm->cu==0.
     433             : 
     434             :      FD_VM_SYSCALL_ERR_SEGFAULT: bad address range.  vm->reg[0]==0.  vm->cu
     435             :      decremented and vm->cu>=0.
     436             : 
     437             :      FD_VM_SUCCESS: success.  vm->reg[0]=0.  vm->cu decremented and vm->cu>=0.
     438             :      On return, dst[i]==src_as_it_was_before_the_call[i] for i in
     439             :      [0,sz). */
     440             : 
     441             : FD_VM_SYSCALL_DECL( sol_memmove );
     442             : 
     443             : /* fd_vm_syscall_runtime **********************************************/
     444             : 
     445             : /* syscall(d56b5fe9) "sol_get_clock_sysvar"
     446             :    syscall(23a29a61) "sol_get_epoch_schedule_sysvar"
     447             :    syscall(bf7188f6) "sol_get_rent_sysvar"
     448             :    syscall(188a0031) "sol_get_last_restart_slot"
     449             :    Get various sysvar values
     450             : 
     451             :    Inputs:
     452             : 
     453             :      r1 - out, {clock,schedule,fees,rent,last_restart_slot} VM pointer
     454             :      r2 - ignored
     455             :      r3 - ignored
     456             :      r4 - ignored
     457             :      r5 - ignored
     458             : 
     459             :    Return:
     460             : 
     461             :      FD_VM_SYSCALL_ERR_OUTSIDE_RUNTIME: the VM is not running within the
     462             :      Solana runtime.  vm->reg[0] unchanged.  vm->cu unchanged.
     463             : 
     464             :      FD_VM_SYSCALL_ERR_COMPUTE_BUDGET_EXCEEDED: insufficient compute
     465             :      budget.  vm->reg[0] unchanged.  vm->cu==0.
     466             : 
     467             :      FD_VM_SYSCALL_ERR_SEGFAULT: bad address range.  vm->reg[0] unchanged.
     468             :      vm->cu decremented and vm->cu>=0.  out should have:
     469             :                           | align | sz
     470             :        clock              |     8 | 40
     471             :        schedule           |     8 | 40
     472             :        rent               |     8 | 24
     473             :        last restart slot  |     8 | 8
     474             :      Strict alignment is only required when the VM has check_align set.
     475             : 
     476             :      FD_VM_SUCCESS: success.  vm->reg[0]=0.  vm->cu decremented and vm->cu>=0.
     477             :      On return, *out will hold the value of the appropriate sysvar. */
     478             : 
     479             : FD_VM_SYSCALL_DECL( sol_get_clock_sysvar             );
     480             : FD_VM_SYSCALL_DECL( sol_get_epoch_schedule_sysvar    );
     481             : FD_VM_SYSCALL_DECL( sol_get_rent_sysvar              );
     482             : FD_VM_SYSCALL_DECL( sol_get_last_restart_slot_sysvar );
     483             : FD_VM_SYSCALL_DECL( sol_get_epoch_rewards_sysvar     );
     484             : 
     485             : /* syscall(13c1b505) "sol_get_sysvar"
     486             : 
     487             :    Get a slice of a sysvar account's data.
     488             : 
     489             :    Inputs:
     490             : 
     491             :      r1 - sysvar_id_vaddr, sysvar pubkey VM pointer
     492             :      r2 - out_vaddr, byte VM pointer
     493             :      r3 - offset, ulong
     494             :      r4 - sz, num bytes to store
     495             :      r5 - ignored
     496             : 
     497             :    Return:
     498             : 
     499             :      FD_VM_SYSCALL_ERR_COMPUTE_BUDGET_EXCEEDED: insufficient compute
     500             :      budget.  vm->reg[0] unchanged.  vm->cu==0.
     501             : 
     502             :      FD_VM_SYSCALL_ERR_SEGFAULT: bad sysvar_id_vaddr, bad out_vaddr,
     503             :      requested slice outside of sysvar data buffer.  vm->reg[0] unchanged.
     504             :      vm->cu decremented and vm->cu>=0.
     505             : 
     506             :      FD_VM_SYSCALL_ERR_ABORT: offset+sz overflow.  vm->reg[0] unchanged.
     507             :      vm->cu decremented and vm->cu>=0.
     508             : 
     509             :      FD_VM_SUCCESS: success. vm->cu decremented and vm->cu>=0.
     510             :       - vm->reg[0] = 2 if sysvar id is not in {clock,schedule,rewards,rent,
     511             :                   slot hashes,stake history, last restart slot}
     512             :                   OR sysvar account does not exist.
     513             :       - vm->reg[0] = 1 if [offset,offset+sz) is outside of sysvar data
     514             :                   buffer.
     515             :       - vm->reg[0] = 0 if success.
     516             : 
     517             :      On return, sz bytes of appropriate offset sysvar data will be
     518             :      copied into haddr belonging to out_vaddr. */
     519             : FD_VM_SYSCALL_DECL( sol_get_sysvar );
     520             : 
     521             : /* syscall(5be92f4a) "sol_get_epoch_stake"
     522             : 
     523             :    This syscall is meant to return the latest frozen stakes at an epoch
     524             :    boundary.  So for instance, when we are executing in epoch 7, this
     525             :    should return the stakes at the end of epoch 6.  Note that this is
     526             :    also the stakes that determined the leader schedule for the upcoming
     527             :    epoch, namely epoch 8.
     528             : 
     529             :    Inputs:
     530             : 
     531             :      r1 - var_addr, vote pubkey VM pointer, or zero to get the total
     532             :           active stake on the cluster.
     533             :      r2 - ignored
     534             :      r3 - ignored
     535             :      r4 - ignored
     536             :      r5 - ignored
     537             : 
     538             :    Return:
     539             : 
     540             :      FD_VM_ERR_SIGCOST: insufficient compute budget.  vm->reg[0] unchanged.
     541             :      vm->cu==0.
     542             : 
     543             :      FD_VM_ERR_SIGSEGV: bad var_addr.  vm->reg[0] unchanged.  vm->cu
     544             :      decremented and vm->cu>=0.
     545             : 
     546             :      FD_VM_ERR_ABORT: offset+sz overflow.  vm->reg[0] unchanged.
     547             : 
     548             :      FD_VM_SUCCESS: success. vm->cu decremented and vm->cu>=0.
     549             :       If var_addr == 0, vm->reg[0] is the total active stake on the
     550             :       cluster.  Else, it is the vote account's delegated stake if
     551             :       var_addr is an existing vote account, and 0 otherwise. */
     552             : 
     553             : FD_VM_SYSCALL_DECL( sol_get_epoch_stake );
     554             : 
     555             : /* syscall(85532d94) "sol_get_stack_height"
     556             : 
     557             :    Inputs:
     558             : 
     559             :      r1 - ignored
     560             :      r2 - ignored
     561             :      r3 - ignored
     562             :      r4 - ignored
     563             :      r5 - ignored
     564             : 
     565             :    Return:
     566             : 
     567             :      FD_VM_SYSCALL_ERR_COMPUTE_BUDGET_EXCEEDED: insufficient compute
     568             :      budget.  vm->reg[0] unchanged.  vm->cu==0.
     569             : 
     570             :      FD_VM_SUCCESS: success.  vm->reg[0]==stack_height.  vm->cu decremented
     571             :      and vm->cu>=0. */
     572             : 
     573             : FD_VM_SYSCALL_DECL( sol_get_stack_height );
     574             : 
     575             : /* syscall(5d2245e4) "sol_get_return_data"
     576             :    Get the return data and program id associated with it.
     577             :    Requires a valid runtime instruction context in vm->instr_ctx.
     578             : 
     579             :    Inputs:
     580             : 
     581             :      r1 - dst, byte VM pointer, indexed [0,dst_max),
     582             :      r2 - dst_max, may be 0,
     583             :      r3 - program_id, byte VM pointer, indexed [0,32)
     584             :      r4 - ignored
     585             :      r5 - ignored
     586             : 
     587             :    Return:
     588             : 
     589             :      FD_VM_SYSCALL_ERR_COMPUTE_BUDGET_EXCEEDED: insufficient compute
     590             :      budget.  vm->reg[0] unchanged. vm->cu==0.
     591             : 
     592             :      FD_VM_SYSCALL_ERR_COPY_OVERLAPPING: dst and program_id address
     593             :      ranges overlap.  vm->reg[0] unchanged.   vm->cu decremented and
     594             :      vm->cu>=0.
     595             : 
     596             :      FD_VM_SYSCALL_ERR_SEGFAULT: bad address range for dst and/or
     597             :      program_id. vm->reg[0] unchanged.  Compute budget decremented.
     598             : 
     599             :      FD_VM_SUCCESS: success.  vm->reg[0]=return_data_sz.  vm->cu decremented
     600             :      and vm->cu>=0.  On return, if return_data_sz and dst_max are non-zero,
     601             :      dst holds the leading min(return_data_sz,dst_max) bytes of return data
     602             :      (as such, if return_data_sz>dst_max, the value returned in the buffer was
     603             :      truncated).  Any trailing bytes of dst are unchanged.  program_id
     604             :      holds the program_id associated with the return data.
     605             : 
     606             :      If either return_data_sz or dst_max is zero, dst and program_id are
     607             :      untouched. */
     608             : 
     609             : FD_VM_SYSCALL_DECL( sol_get_return_data );
     610             : 
     611             : /* syscall(a226d3eb) "sol_set_return_data"
     612             :    Set the return data.  The return data will be associated with the
     613             :    caller's program ID.
     614             : 
     615             :    Inputs:
     616             : 
     617             :      r1 - src, byte VM pointer, indexed [0,src_sz),
     618             :      r2 - src_sz, may be 0,
     619             :      r3 - ignored
     620             :      r4 - ignored
     621             :      r5 - ignored
     622             : 
     623             :    Return:
     624             :      FD_VM_SYSCALL_ERR_OUTSIDE_RUNTIME: the VM is not running within the
     625             :      Solana runtime.  vm->reg[0] unchanged.  vm->cu unchanged.
     626             : 
     627             :      FD_VM_SYSCALL_ERR_COMPUTE_BUDGET_EXCEEDED: insufficient compute
     628             :      budget.  vm->reg[0] unchanged.  vm->cu==0.
     629             : 
     630             :      FD_VM_SYSCALL_ERR_RETURN_DATA_TOO_LARGE: src_sz too large.  vm->reg[0]
     631             :      unchanged.  vm->cu decremented and vm->cu>=0.
     632             : 
     633             :      FD_VM_SYSCALL_ERR_SEGFAULT: bad address range for src.  vm->reg[0] unchanged.
     634             :      vm->cu decremented and vm->cu>=0.
     635             : 
     636             :      FD_VM_SUCCESS: success.  vm->reg[0]=0.  vm->cu decremented and vm->cu>=0. */
     637             : 
     638             : FD_VM_SYSCALL_DECL( sol_set_return_data );
     639             : 
     640             : /* syscall(adb8efc8) "sol_get_processed_sibling_instruction"
     641             :    Returns the last element from a reverse-ordered list of successfully
     642             :    processed sibling instructions: the "processed sibling instruction
     643             :    list".
     644             : 
     645             :    For example, given the call flow:
     646             :    A
     647             :    B -> C -> D
     648             :    B -> E
     649             :    B -> F      (current execution point)
     650             : 
     651             :    B's processed sibling instruction list is [A]
     652             :    F's processed sibling instruction list is [E, C]
     653             : 
     654             :    This allows the current instruction to know what the last processed
     655             :    sibling instruction was.  This is useful to check that critical
     656             :    preceding instructions have actually executed: for example, ensuring
     657             :    that an assert instruction has successfully executed.
     658             : 
     659             :    Inputs:
     660             : 
     661             :      r1 - index
     662             :      r2 - result_meta_vaddr, byte VM pointer of the object where
     663             :           metadata about the last processed sibling instruction will be
     664             :           stored upon successful execution (the length of the arrays in
     665             :           the result). Has the type
     666             :           solana_program::instruction::ProcessedSiblingInstruction
     667             :           https://github.com/anza-xyz/agave/blob/70089cce5119c9afaeb2986e2ecaa6d4505ec15d/sdk/program/src/instruction.rs#L672-L681
     668             :      r3 - result_program_id_vaddr, byte VM pointer where the pubkey of
     669             :           the program ID of the last processed sibling instruction will
     670             :           be stored upon successful execution
     671             :      r4 - result_data_vaddr, byte VM pointer where the instruction
     672             :           data of the last processed sibling instruction will be stored
     673             :           upon successful execution. The length of the data will be
     674             :           stored in ProcessedSiblingInstruction.data_len
     675             :      r5 - result_accounts_vaddr, byte VM pointer where an array of
     676             :           account meta structures will be stored into upon successful
     677             :           execution.  The length of the data will be stored in
     678             :           ProcessedSiblingInstruction.accounts_len.  Each account meta
     679             :           has the type solana_program::instruction::AccountMeta
     680             :           https://github.com/anza-xyz/agave/blob/70089cce5119c9afaeb2986e2ecaa6d4505ec15d/sdk/program/src/instruction.rs#L525-L548
     681             : 
     682             :     Return:
     683             : 
     684             :      FD_VM_SYSCALL_ERR_COMPUTE_BUDGET_EXCEEDED: insufficient compute
     685             :      budget.  vm->reg[0] unchanged.  vm->cu==0.
     686             : 
     687             :      FD_VM_SYSCALL_ERR_SEGFAULT: invalid output address range.
     688             : 
     689             :      FD_VM_SYSCALL_ERR_COPY_OVERLAPPING: translated output ranges overlap.
     690             : 
     691             :      FD_VM_SYSCALL_ERR_INVALID_LENGTH: a translated slice exceeds LONG_MAX.
     692             : 
     693             :      FD_EXECUTOR_INSTR_ERR_MISSING_ACC: an instruction account
     694             :      index is outside the transaction account list.
     695             : 
     696             :      FD_VM_SUCCESS: vm->reg[0]==1 if the instruction was found and, vm->reg[0]==0
     697             :      otherwise.  vm->cu decremented and vm->cu>=0. */
     698             : 
     699             : 
     700             : FD_VM_SYSCALL_DECL( sol_get_processed_sibling_instruction );
     701             : 
     702             : /* fd_vm_syscall_pda **************************************************/
     703             : 
     704             : /* syscall(9377323c) "sol_create_program_address"
     705             : 
     706             :    Compute SHA-256 hash of &[&[u8]] .. <program ID> .. <PDA Marker>
     707             :    and check whether result is an Ed25519 curve point.
     708             : 
     709             :    Inputs:
     710             : 
     711             :      r1 - seeds, bytes VM pointer, indexed [0,seed_cnt),
     712             :      r2 - seed_cnt, may be 0,
     713             :      r3 - program_id, byte VM pointer, indexed [0,32)
     714             :      r4 - out, byte VM pointer, indexed [0,32)
     715             :      r5 - ignored
     716             : 
     717             :      seed[i] holds the ulong pair
     718             :        mem, byte VM pointer, indexed [0,sz),
     719             :        sz, may be 0
     720             : 
     721             :    Return:
     722             : 
     723             :      FD_VM_SYSCALL_ERR_COMPUTE_BUDGET_EXCEEDED: insufficient compute
     724             :      budget.  vm->reg[0] unchanged.  vm->cu==0.
     725             : 
     726             :      FD_VM_SYSCALL_ERR_BAD_SEEDS: seed_cnt and/or seed[i].sz too large.
     727             :      vm->reg[0] unchanged.  Compute budget decremented.
     728             : 
     729             :      FD_VM_SYSCALL_ERR_SEGFAULT: bad address range for seed, seed[i].mem,
     730             :      program_id and/or out (including 8-byte alignment for seed if the VM
     731             :      has check_align set).  vm->reg[0] unchanged.  vm->cu decremented and
     732             :      vm->cu>=0.
     733             : 
     734             :      FD_VM_SUCCESS: success.  If vm->reg[0]==0, a PDA was created and
     735             :      stored at out.  If vm->reg[0]==1, create failed and out was unchanged.
     736             :      Compute budget decremented. */
     737             : 
     738             : FD_VM_SYSCALL_DECL( sol_create_program_address );
     739             : 
     740             : /* syscall(48504a38) "sol_try_find_program_address"
     741             : 
     742             :    Derive program addresses with bump seeds descending from 255 through 1
     743             :    until a point is found that is not a valid Ed25519 curve point.
     744             : 
     745             :    Inputs:
     746             : 
     747             :      r1 - seed, ulong pair VM pointer, indexed [0,seed_cnt),
     748             :      r2 - seed_cnt, may be 0,
     749             :      r3 - program_id, byte VM pointer, indexed [0,32)
     750             :      r4 - out, byte VM pointer, indexed [0,32)
     751             :      r5 - bump_seed, byte VM pointer, indexed [0,1)
     752             : 
     753             :      seed[i] holds the ulong pair
     754             :        mem, byte VM pointer, indexed [0,sz),
     755             :        sz, may be 0
     756             : 
     757             :    Return:
     758             : 
     759             :      FD_VM_SYSCALL_ERR_COMPUTE_BUDGET_EXCEEDED: insufficient compute
     760             :      budget.  vm->reg[0] unchanged.  vm->cu==0.
     761             : 
     762             :      FD_VM_SYSCALL_ERR_BAD_SEEDS: seed_cnt and/or seed[i].sz too large.
     763             :      vm->reg[0] unchanged.  Compute budget decremented.
     764             : 
     765             :      FD_VM_SYSCALL_ERR_SEGFAULT: bad address range for seed, seed[i].mem,
     766             :      program_id, out and/or bump_seed (including 8-byte alignment for
     767             :      seed if the VM has check_align set).  vm->reg[0] unchanged.  vm->cu
     768             :      decremented and vm->cu>=0.
     769             : 
     770             :      FD_VM_SYSCALL_ERR_COPY_OVERLAPPING: translated output ranges overlap.
     771             : 
     772             :      FD_VM_SYSCALL_ERR_INVALID_LENGTH: a translated slice exceeds LONG_MAX.
     773             : 
     774             :      FD_VM_SUCCESS: success.  If vm->reg[0]==0, a PDA was found and stored at
     775             :      out and the suffix stored at bump_seed.  If vm->reg[0]==1, no PDA was
     776             :      found and out and bump_seed were unchanged.  Compute budget
     777             :      decremented. */
     778             : 
     779             : FD_VM_SYSCALL_DECL( sol_try_find_program_address );
     780             : 
     781             : /* fd_vm_syscall_cpi **************************************************/
     782             : 
     783             : /* Prepare instruction method */
     784             : /* FIXME: DOES THIS GO HERE?  MAYBE GROUP WITH ADMIN OR OUTSIDE SYSCALL? */
     785             : 
     786             : int
     787             : fd_vm_prepare_instruction( fd_instr_info_t *        callee_instr,
     788             :                            fd_exec_instr_ctx_t *    instr_ctx,
     789             :                            fd_pubkey_t const *      callee_program_id_pubkey,
     790             :                            fd_pubkey_t const        instr_acct_keys[ FD_TXN_INSTR_ACCT_MAX ],
     791             :                            fd_instruction_account_t instruction_accounts[ FD_TXN_INSTR_ACCT_MAX ],
     792             :                            ulong *                  instruction_accounts_cnt,
     793             :                            fd_pubkey_t const *      signers,
     794             :                            ulong                    signers_cnt );
     795             : 
     796             : /* syscall(a22b9c85) "sol_invoke_signed_c"
     797             :    Dispatch a cross program invocation.  Inputs are in C ABI.
     798             : 
     799             :    FIXME: BELT SAND AND DOCUMENT */
     800             : 
     801             : FD_VM_SYSCALL_DECL( cpi_c );
     802             : 
     803             : /* syscall(d7449092) "sol_invoke_signed_rust"
     804             :    Dispatch a cross program invocation.  Inputs are in Rust ABI.
     805             : 
     806             :    FIXME: BELT SAND AND DOCUMENT */
     807             : 
     808             : FD_VM_SYSCALL_DECL( cpi_rust );
     809             : 
     810             : /* fd_vm_syscall_crypto ***********************************************/
     811             : 
     812             : /* FD_VM_SYSCALL_SOL_ALT_BN128_{ADD,SUB,MUL,PAIRING} specifies the curve operation. */
     813             : 
     814         310 : #define FD_VM_SYSCALL_SOL_ALT_BN128_G1_ADD_BE           (  0UL) /* add */
     815             : #define FD_VM_SYSCALL_SOL_ALT_BN128_G1_SUB_BE           (  1UL) /* add inverse */
     816        7345 : #define FD_VM_SYSCALL_SOL_ALT_BN128_G1_MUL_BE           (  2UL) /* scalar mult */
     817        2154 : #define FD_VM_SYSCALL_SOL_ALT_BN128_PAIRING_BE          (  3UL) /* pairing */
     818         187 : #define FD_VM_SYSCALL_SOL_ALT_BN128_G2_ADD_BE           (  4UL) /* add */
     819             : #define FD_VM_SYSCALL_SOL_ALT_BN128_G2_SUB_BE           (  5UL) /* add inverse */
     820         155 : #define FD_VM_SYSCALL_SOL_ALT_BN128_G2_MUL_BE           (  6UL) /* scalar mult */
     821       11429 : #define FD_VM_SYSCALL_SOL_ALT_BN128_LITTLE_ENDIAN_FLAG  ( 0x80) /* little endian (SIMD-0284) */
     822         187 : #define FD_VM_SYSCALL_SOL_ALT_BN128_G1_ADD_LE           ( FD_VM_SYSCALL_SOL_ALT_BN128_G1_ADD_BE  | FD_VM_SYSCALL_SOL_ALT_BN128_LITTLE_ENDIAN_FLAG )
     823        3707 : #define FD_VM_SYSCALL_SOL_ALT_BN128_G1_MUL_LE           ( FD_VM_SYSCALL_SOL_ALT_BN128_G1_MUL_BE  | FD_VM_SYSCALL_SOL_ALT_BN128_LITTLE_ENDIAN_FLAG )
     824        1107 : #define FD_VM_SYSCALL_SOL_ALT_BN128_PAIRING_LE          ( FD_VM_SYSCALL_SOL_ALT_BN128_PAIRING_BE | FD_VM_SYSCALL_SOL_ALT_BN128_LITTLE_ENDIAN_FLAG )
     825         125 : #define FD_VM_SYSCALL_SOL_ALT_BN128_G2_ADD_LE           ( FD_VM_SYSCALL_SOL_ALT_BN128_G2_ADD_BE  | FD_VM_SYSCALL_SOL_ALT_BN128_LITTLE_ENDIAN_FLAG )
     826         107 : #define FD_VM_SYSCALL_SOL_ALT_BN128_G2_MUL_LE           ( FD_VM_SYSCALL_SOL_ALT_BN128_G2_MUL_BE  | FD_VM_SYSCALL_SOL_ALT_BN128_LITTLE_ENDIAN_FLAG )
     827             : 
     828             : /* FD_VM_SYSCALL_SOL_ALT_BN128_{...}COMPRESS specifies the (de)compress operation. */
     829             : 
     830        1015 : #define FD_VM_SYSCALL_SOL_ALT_BN128_G1_COMPRESS_BE      (  0UL) /* compress point in G1 */
     831        1006 : #define FD_VM_SYSCALL_SOL_ALT_BN128_G1_DECOMPRESS_BE    (  1UL) /* decompress point in G1 */
     832        1244 : #define FD_VM_SYSCALL_SOL_ALT_BN128_G2_COMPRESS_BE      (  2UL) /* compress point in G2 */
     833        1286 : #define FD_VM_SYSCALL_SOL_ALT_BN128_G2_DECOMPRESS_BE    (  3UL) /* decompress point in G2 */
     834         542 : #define FD_VM_SYSCALL_SOL_ALT_BN128_G1_COMPRESS_LE      ( FD_VM_SYSCALL_SOL_ALT_BN128_G1_COMPRESS_BE   | FD_VM_SYSCALL_SOL_ALT_BN128_LITTLE_ENDIAN_FLAG )
     835         535 : #define FD_VM_SYSCALL_SOL_ALT_BN128_G1_DECOMPRESS_LE    ( FD_VM_SYSCALL_SOL_ALT_BN128_G1_DECOMPRESS_BE | FD_VM_SYSCALL_SOL_ALT_BN128_LITTLE_ENDIAN_FLAG )
     836         657 : #define FD_VM_SYSCALL_SOL_ALT_BN128_G2_COMPRESS_LE      ( FD_VM_SYSCALL_SOL_ALT_BN128_G2_COMPRESS_BE   | FD_VM_SYSCALL_SOL_ALT_BN128_LITTLE_ENDIAN_FLAG )
     837         671 : #define FD_VM_SYSCALL_SOL_ALT_BN128_G2_DECOMPRESS_LE    ( FD_VM_SYSCALL_SOL_ALT_BN128_G2_DECOMPRESS_BE | FD_VM_SYSCALL_SOL_ALT_BN128_LITTLE_ENDIAN_FLAG )
     838             : 
     839             : /* FD_VM_SYSCALL_SOL_ALT_BN128_{...}_SZ specifies the size of inputs/outputs for the Alt_BN128 curve. */
     840             : 
     841        2217 : #define FD_VM_SYSCALL_SOL_ALT_BN128_G1_SZ               ( 64UL) /* size of a point in G1 */
     842         274 : #define FD_VM_SYSCALL_SOL_ALT_BN128_G1_COMPRESSED_SZ    ( 32UL) /* size of a compressed point in G2 */
     843         458 : #define FD_VM_SYSCALL_SOL_ALT_BN128_G2_SZ               (128UL) /* size of a point in G2 */
     844         331 : #define FD_VM_SYSCALL_SOL_ALT_BN128_G2_COMPRESSED_SZ    ( 64UL) /* size of a compressed point in G2 */
     845         558 : #define FD_VM_SYSCALL_SOL_ALT_BN128_PAIRING_INPUT_EL_SZ (192UL) /* size of G1 + G2 */
     846        1116 : #define FD_VM_SYSCALL_SOL_ALT_BN128_PAIRING_OUTPUT_SZ   ( 32UL) /* size of pairing syscall result, i.e. 0 or 1 as 256-bit int ¯\_(ツ)_/¯ */
     847             : 
     848             : /* syscall(ae0c318b) sol_alt_bn128_group_op computes operations on the Alt_BN128 curve,
     849             :    including point addition in G1, scalar multiplication in G1, and pairing.
     850             :    See SIMD-0129.
     851             : 
     852             :    FIXME: DOCUMENT */
     853             : 
     854             : FD_VM_SYSCALL_DECL( sol_alt_bn128_group_op    );
     855             : 
     856             : /* syscall(334fd5ed) sol_alt_bn128_compression allows to compress or decompress points
     857             :    in G1 or G2 groups over the Alt_BN128 curve.
     858             :    See SIMD-0129.
     859             : 
     860             :    FIXME: DOCUMENT */
     861             : 
     862             : FD_VM_SYSCALL_DECL( sol_alt_bn128_compression );
     863             : 
     864             : /* syscall(d7793abb) "sol_keccak256"
     865             :    syscall(11f49d86) "sol_sha256"
     866             : 
     867             :    Inputs:
     868             : 
     869             :      arg0 - slice, ulong pair VM pointer, indexed [0,cnt), FIXME: WHEN IS NULL OKAY?
     870             :      arg1 - cnt, FIXME: IS 0 OKAY?
     871             :      arg2 - hash, byte VM pointer, indexed [0,32)
     872             :      arg3 - ignored
     873             :      arg4 - ignored
     874             : 
     875             :      slice[i] holds the ulong pair:
     876             :        mem, byte vector VM pointer, indexed [0,sz), FIXME: WHEN IS NULL OKAY?
     877             :        sz, FIXME: IS 0 OKAY?
     878             : 
     879             :    Return:
     880             : 
     881             :      FD_VM_ERR_INVAL: cnt too large.  vm->reg[0] unchanged.
     882             : 
     883             :      FD_VM_SYSCALL_ERR_COMPUTE_BUDGET_EXCEEDED: insufficient compute budget.
     884             :      vm->reg[0] unchanged. Compute budget decremented.
     885             : 
     886             :      FD_VM_SYSCALL_ERR_SEGFAULT: bad address range for slice, hash and/or
     887             :      slice[i].addr (including slice not 8 byte aligned if the VM has
     888             :      check_align set).  vm->reg[0] unchanged.  Compute budget decremented.
     889             : 
     890             :      FD_VM_SUCCESS: success.  vm->reg[0]=0 and hash[i] holds the hash of the
     891             :      concatenation of the slices.  Compute budget decremented. */
     892             : 
     893             : FD_VM_SYSCALL_DECL( sol_keccak256 );
     894             : FD_VM_SYSCALL_DECL( sol_sha256    );
     895             : FD_VM_SYSCALL_DECL( sol_sha512    );
     896             : 
     897             : /* syscall(c4947c21) sol_poseidon computes the Poseidon hash on an array of input values.
     898             :    See SIMD-0129.
     899             : 
     900             :    FIXME: DOCUMENT */
     901             : 
     902             : #define FD_VM_SYSCALL_SOL_POSEIDON_MAX_VALS 12UL
     903             : 
     904             : FD_VM_SYSCALL_DECL( sol_poseidon ); /* Light protocol flavor */
     905             : 
     906             : /* syscall(17e40350) "sol_secp256k1_recover"
     907             : 
     908             :    FIXME: BELT SAND AND DOCUMENT */
     909             : 
     910             : FD_VM_SYSCALL_DECL( sol_secp256k1_recover );
     911             : 
     912             : /* syscall "sol_big_mod_exp" (SIMD-0529)
     913             : 
     914             :    result := (base ^ exponent) mod modulus, where all operands are
     915             :    little-endian and the modulus is odd and > 1.  r1 is a vaddr to a
     916             :    BigModExpParams record; r2 is a vaddr to the result buffer.  Gated
     917             :    behind the enable_big_mod_exp_syscall feature. */
     918             : 
     919             : FD_VM_SYSCALL_DECL( sol_big_mod_exp );
     920             : 
     921             : /* fd_vm_syscall_curve ************************************************/
     922             : 
     923             : /* FD_VM_SYSCALL_SOL_CURVE_CURVE25519_{...} specifies the curve ID */
     924             : 
     925         811 : #define FD_VM_SYSCALL_SOL_CURVE_CURVE25519_EDWARDS   ( 0UL        ) /* ed25519 */
     926         768 : #define FD_VM_SYSCALL_SOL_CURVE_CURVE25519_RISTRETTO ( 1UL        ) /* ristretto255 */
     927          65 : #define FD_VM_SYSCALL_SOL_CURVE_BLS12_381_BE         ( 4UL | 0x80 ) /* bls12-381 big endian */
     928         138 : #define FD_VM_SYSCALL_SOL_CURVE_BLS12_381_LE         ( 4UL        ) /* bls12-381 little endian */
     929         147 : #define FD_VM_SYSCALL_SOL_CURVE_BLS12_381_G1_BE      ( 5UL | 0x80 ) /* bls12-381 G1 big endian */
     930         313 : #define FD_VM_SYSCALL_SOL_CURVE_BLS12_381_G1_LE      ( 5UL        ) /* bls12-381 G1 little endian */
     931         145 : #define FD_VM_SYSCALL_SOL_CURVE_BLS12_381_G2_BE      ( 6UL | 0x80 ) /* bls12-381 G2 big endian */
     932         319 : #define FD_VM_SYSCALL_SOL_CURVE_BLS12_381_G2_LE      ( 6UL        ) /* bls12-381 G2 little endian */
     933           0 : #define FD_VM_SYSCALL_SOL_CURVE_SECP256R1_BE         ( 7UL | 0x80 ) /* secp256r1 big endian */
     934           0 : #define FD_VM_SYSCALL_SOL_CURVE_SECP256R1_LE         ( 7UL        ) /* secp256r1 little endian */
     935             : 
     936             : /* FD_VM_SYSCALL_SOL_CURVE_{...} specifies the curve operation */
     937             : 
     938         194 : #define FD_VM_SYSCALL_SOL_CURVE_ADD                  ( 0UL) /* add */
     939         197 : #define FD_VM_SYSCALL_SOL_CURVE_SUB                  ( 1UL) /* add inverse */
     940         248 : #define FD_VM_SYSCALL_SOL_CURVE_MUL                  ( 2UL) /* scalar mul */
     941             : 
     942             : /* FD_VM_SYSCALL_SOL_CURVE_{...}_SZ specifies the size of inputs/outputs. */
     943             : 
     944         777 : #define FD_VM_SYSCALL_SOL_CURVE_CURVE25519_POINT_SZ           (32UL)   /* point (compressed) */
     945         777 : #define FD_VM_SYSCALL_SOL_CURVE_CURVE25519_SCALAR_SZ          (32UL)   /* scalar */
     946             : #define FD_VM_SYSCALL_SOL_CURVE_BLS12_381_G1_COMPRESSED_SZ    (48UL)   /* G1 point (compressed) */
     947         518 : #define FD_VM_SYSCALL_SOL_CURVE_BLS12_381_G1_POINT_SZ         (96UL)   /* G1 point (uncompressed) */
     948             : #define FD_VM_SYSCALL_SOL_CURVE_BLS12_381_G2_COMPRESSED_SZ  (2*48UL)   /* G2 point (compressed) */
     949         514 : #define FD_VM_SYSCALL_SOL_CURVE_BLS12_381_G2_POINT_SZ       (2*96UL)   /* G2 point (uncompressed) */
     950          90 : #define FD_VM_SYSCALL_SOL_CURVE_BLS12_381_GT_ELE_SZ        (12*48UL)   /* GT element */
     951             : #define FD_VM_SYSCALL_SOL_CURVE_SECP256R1_COMPRESSED_SZ       (33UL)   /* point (compressed) */
     952           0 : #define FD_VM_SYSCALL_SOL_CURVE_SECP256R1_POINT_SZ            (64UL)   /* point (uncompressed) */
     953           0 : #define FD_VM_SYSCALL_SOL_CURVE_SECP256R1_SCALAR_SZ           (32UL)   /* scalar */
     954             : 
     955             : /* syscall(aa2607ca) sol_curve_validate_point
     956             : 
     957             :    Inputs:
     958             : 
     959             :      arg0 - curve_id
     960             :      arg1 - point_addr
     961             :      arg2 - ignored
     962             :      arg3 - ignored
     963             :      arg4 - ignored
     964             : 
     965             :    Return:
     966             : 
     967             :      FD_VM_SYSCALL_ERR_INVALID_ATTRIBUTE: invalid curve_id.
     968             : 
     969             :      FD_VM_SYSCALL_ERR_COMPUTE_BUDGET_EXCEEDED: insufficient compute budget.
     970             :      vm->reg[0] unchanged. Compute budget decremented.
     971             : 
     972             :      FD_VM_SYSCALL_ERR_SEGFAULT: bad address range for point_addr
     973             :      vm->reg[0] unchanged.  Compute budget decremented.
     974             : 
     975             :      FD_VM_SUCCESS: success.  vm->reg[0]=0 point is valid.
     976             :                               vm->reg[0]=1 point is invalid. */
     977             : 
     978             : FD_VM_SYSCALL_DECL( sol_curve_validate_point  );
     979             : 
     980             : /* syscall(dd1c41a6) sol_curve_group_op
     981             : 
     982             :    Inputs:
     983             : 
     984             :      arg0 - curve_id
     985             :      arg1 - group_op
     986             :      arg2 - left_input_addr
     987             :      arg3 - right_input_addr
     988             :      arg4 - result_point_addr
     989             : 
     990             :    Return:
     991             : 
     992             :      FD_VM_SYSCALL_ERR_INVALID_ATTRIBUTE: invalid curve_id/group_op.
     993             : 
     994             :      FD_VM_SYSCALL_ERR_COMPUTE_BUDGET_EXCEEDED: insufficient compute budget.
     995             :      vm->reg[0] unchanged. Compute budget decremented.
     996             : 
     997             :      FD_VM_SYSCALL_ERR_SEGFAULT: bad address range for left_input_addr,
     998             :      right_input_addr or result_point_addr.
     999             :      vm->reg[0] unchanged.  Compute budget decremented.
    1000             : 
    1001             :      FD_VM_SUCCESS: success.  vm->reg[0]=0 success, result written at result_point_addr.
    1002             :                               vm->reg[0]=1 input validation failed, memory at
    1003             :                                       result_point_addr unchanged. */
    1004             : 
    1005             : FD_VM_SYSCALL_DECL( sol_curve_group_op );
    1006             : 
    1007             : /* syscall(60a40880) sol_curve_multiscalar_mul
    1008             : 
    1009             :    Inputs:
    1010             : 
    1011             :      arg0 - curve_id
    1012             :      arg1 - scalars_addr
    1013             :      arg2 - points_addr
    1014             :      arg3 - points_len
    1015             :      arg4 - result_point_addr
    1016             : 
    1017             :    Return:
    1018             : 
    1019             :      FD_VM_SYSCALL_ERR_INVALID_ATTRIBUTE: invalid curve_id/group_op.
    1020             : 
    1021             :      FD_VM_SYSCALL_ERR_COMPUTE_BUDGET_EXCEEDED: insufficient compute budget.
    1022             :      vm->reg[0] unchanged. Compute budget decremented.
    1023             : 
    1024             :      FD_VM_SYSCALL_ERR_SEGFAULT: bad address range for scalars_addr or
    1025             :      points_addr.
    1026             :      vm->reg[0] unchanged.  Compute budget decremented.
    1027             : 
    1028             :      FD_VM_SUCCESS: success.  vm->reg[0]=0 success, result written at result_point_addr.
    1029             :                               vm->reg[0]=1 input validation failed, memory at
    1030             :                                       result_point_addr unchanged. */
    1031             : 
    1032             : FD_VM_SYSCALL_DECL( sol_curve_multiscalar_mul );
    1033             : 
    1034             : /* syscall(80c98b0) sol_curve_decompress
    1035             : 
    1036             :    Inputs:
    1037             : 
    1038             :      arg0 - curve_id
    1039             :      arg1 - point_addr, compressed BLS12-381 point selected by curve_id
    1040             :      arg2 - result_addr, uncompressed BLS12-381 point
    1041             :      arg3 - ignored
    1042             :      arg4 - ignored
    1043             : 
    1044             :    Return:
    1045             : 
    1046             :      FD_VM_SYSCALL_ERR_INVALID_ATTRIBUTE: invalid curve_id/group_op.
    1047             : 
    1048             :      FD_VM_SYSCALL_ERR_COMPUTE_BUDGET_EXCEEDED: insufficient compute budget.
    1049             :      vm->reg[0] unchanged. Compute budget decremented.
    1050             : 
    1051             :      FD_VM_SYSCALL_ERR_SEGFAULT: bad address range for point_addr or
    1052             :      result_addr.
    1053             :      vm->reg[0] unchanged.  Compute budget decremented.
    1054             : 
    1055             :      FD_VM_SUCCESS: success.  vm->reg[0]=0 success, result written at result_addr.
    1056             :                               vm->reg[0]=1 input validation failed, memory at
    1057             :                                       result_addr unchanged. */
    1058             : 
    1059             : FD_VM_SYSCALL_DECL( sol_curve_decompress );
    1060             : 
    1061             : /* syscall(f111a47e) sol_curve_pairing_map
    1062             : 
    1063             :    Inputs:
    1064             : 
    1065             :      arg0 - curve_id
    1066             :      arg1 - num_pairs
    1067             :      arg2 - g1_points_addr
    1068             :      arg3 - g2_points_addr
    1069             :      arg4 - result_addr
    1070             : 
    1071             :    Return:
    1072             : 
    1073             :      FD_VM_SYSCALL_ERR_INVALID_ATTRIBUTE: invalid curve_id/group_op.
    1074             : 
    1075             :      FD_VM_SYSCALL_ERR_COMPUTE_BUDGET_EXCEEDED: insufficient compute budget.
    1076             :      vm->reg[0] unchanged. Compute budget decremented.
    1077             : 
    1078             :      FD_VM_SYSCALL_ERR_SEGFAULT: bad address range for g1_points_addr,
    1079             :      g2_points_addr or result_addr.
    1080             :      vm->reg[0] unchanged.  Compute budget decremented.
    1081             : 
    1082             :      FD_VM_SUCCESS: success.  vm->reg[0]=0 success, result written at result_addr.
    1083             :                               vm->reg[0]=1 input validation failed, memory at
    1084             :                                       result_addr unchanged. */
    1085             : 
    1086             : FD_VM_SYSCALL_DECL( sol_curve_pairing_map );
    1087             : 
    1088             : int
    1089             : fd_vm_derive_pda( fd_vm_t *           vm,
    1090             :                   fd_pubkey_t const * program_id,
    1091             :                   void const * *      seed_haddrs,
    1092             :                   ulong *             seed_szs,
    1093             :                   ulong               seeds_cnt,
    1094             :                   uchar *             bump_seed,
    1095             :                   fd_pubkey_t *       out );
    1096             : 
    1097             : int
    1098             : fd_vm_translate_and_check_program_address_inputs( fd_vm_t *             vm,
    1099             :                                                   ulong                 seeds_vaddr,
    1100             :                                                   ulong                 seeds_cnt,
    1101             :                                                   ulong                 program_id_vaddr,
    1102             :                                                   void const * *        out_seed_haddrs,
    1103             :                                                   ulong *               out_seed_szs,
    1104             :                                                   fd_pubkey_t const * * out_program_id,
    1105             :                                                   uchar                 is_syscall );
    1106             : FD_PROTOTYPES_END
    1107             : 
    1108             : #endif /* HEADER_src_flamenco_vm_syscall_fd_vm_syscall_h */

Generated by: LCOV version 1.14