Skip to content

Commit 1d4f3db

Browse files
committed
implemented elf harness
1 parent f5d1fe7 commit 1d4f3db

File tree

7 files changed

+117
-40
lines changed

7 files changed

+117
-40
lines changed

src/flamenco/runtime/tests/fd_elf_harness.c

Lines changed: 85 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include "../../progcache/fd_prog_load.h"
99

1010
#include "flatbuffers/generated/elf_reader.h"
11+
#include "flatbuffers/generated/elf_builder.h"
1112

1213
#define SORT_NAME sort_ulong
1314
#define SORT_KEY_T ulong
@@ -143,12 +144,92 @@ fd_solfuzz_fb_elf_loader_run( fd_solfuzz_runner_t * runner,
143144
void const * input_ ) {
144145
SOL_COMPAT_NS(ELFLoaderCtx_table_t) input = fd_type_pun_const( input_ );
145146

146-
fd_spad_t * spad = runner->spad;
147-
flatbuffers_uint8_vec_t elf_bin = SOL_COMPAT_NS(ELFLoaderCtx_elf_data( input ));
148-
ulong elf_sz = flatbuffers_uint8_vec_len( elf_bin );
147+
fd_spad_t * spad = runner->spad;
148+
flatbuffers_uint8_vec_t elf_bin_ = SOL_COMPAT_NS(ELFLoaderCtx_elf_data( input ));
149+
uchar const * elf_bin = (uchar const*)elf_bin_;
150+
ulong elf_sz = flatbuffers_uint8_vec_len( elf_bin_ );
149151

152+
/* Restore feature set */
153+
fd_features_t feature_set = {0};
154+
fd_solfuzz_fb_restore_features( &feature_set, SOL_COMPAT_NS(ELFLoaderCtx_features( input )));
155+
156+
fd_sbpf_loader_config_t config = {
157+
.elf_deploy_checks = SOL_COMPAT_NS(ELFLoaderCtx_deploy_checks( input )),
158+
};
159+
160+
fd_prog_versions_t versions = fd_prog_versions( &feature_set, UINT_MAX );
161+
config.sbpf_min_version = versions.min_sbpf_version;
162+
config.sbpf_max_version = versions.max_sbpf_version;
163+
164+
/* Peek */
150165
fd_sbpf_elf_info_t info;
166+
int err = fd_sbpf_elf_peek( &info, elf_bin, elf_sz, &config );
167+
if( err ) {
168+
SOL_COMPAT_NS(ELFLoaderEffects_create)( runner->fb_builder, (uchar)(-err), NULL, 0, 0, 0, NULL );
169+
return SOL_COMPAT_V2_SUCCESS;
170+
}
171+
172+
/* Set up loading context */
173+
void * rodata = fd_spad_alloc_check( spad, FD_SBPF_PROG_RODATA_ALIGN, info.bin_sz );
174+
fd_sbpf_program_t * prog = fd_sbpf_program_new( fd_spad_alloc_check( spad, fd_sbpf_program_align(), fd_sbpf_program_footprint( &info ) ), &info, rodata );
175+
fd_sbpf_syscalls_t * syscalls = fd_sbpf_syscalls_new( fd_spad_alloc_check( spad, fd_sbpf_syscalls_align(), fd_sbpf_syscalls_footprint() ));
176+
void * rodata_scratch = fd_spad_alloc_check( spad, 1UL, elf_sz );
177+
178+
/* Register syscalls given the active feature set. We can pass in an
179+
arbitrary slot as its just used to check if features should be
180+
active or not. */
181+
FD_TEST( !fd_vm_syscall_register_slot( syscalls, UINT_MAX, &feature_set, !!config.elf_deploy_checks ) );
182+
183+
/* Load */
184+
err = fd_sbpf_program_load( prog, elf_bin, elf_sz, syscalls, &config, rodata_scratch, elf_sz );
185+
if( err ) {
186+
SOL_COMPAT_NS(ELFLoaderEffects_create)( runner->fb_builder, (uchar)(-err), NULL, 0, 0, 0, NULL );
187+
return SOL_COMPAT_V2_SUCCESS;
188+
}
189+
190+
/**** Capture effects ****/
191+
192+
/* Error code */
193+
uchar out_err_code = FD_SBPF_ELF_SUCCESS;
194+
195+
/* Rodata */
196+
flatbuffers_uint8_vec_ref_t out_rodata = flatbuffers_uint8_vec_create( runner->fb_builder, prog->rodata, prog->rodata_sz );
197+
198+
/* Text count */
199+
ulong out_text_cnt = prog->info.text_cnt;
200+
201+
/* Text off */
202+
ulong out_text_off = prog->info.text_off;
203+
204+
/* Entry PC */
205+
ulong out_entry_pc = prog->entry_pc;
206+
207+
/* Calldests */
208+
ulong * tmp_out_calldests = fd_spad_alloc_check( spad, alignof(ulong), sizeof(ulong)*fd_sbpf_calldests_cnt( prog->calldests)+1UL );
209+
ulong out_calldests_cnt = 0UL;
210+
211+
/* Add the entrypoint to the calldests */
212+
tmp_out_calldests[out_calldests_cnt++] = prog->entry_pc;
213+
214+
/* Add the rest of the calldests */
215+
if( FD_LIKELY( prog->calldests ) ) {
216+
for( ulong target_pc=fd_sbpf_calldests_const_iter_init(prog->calldests);
217+
!fd_sbpf_calldests_const_iter_done(target_pc);
218+
target_pc=fd_sbpf_calldests_const_iter_next(prog->calldests, target_pc) ) {
219+
if( FD_LIKELY( target_pc!=prog->entry_pc ) ) {
220+
tmp_out_calldests[out_calldests_cnt++] = target_pc;
221+
}
222+
}
223+
}
224+
225+
/* Sort the calldests in ascending order */
226+
sort_ulong_inplace( tmp_out_calldests, out_calldests_cnt );
227+
228+
/* Create output calldests vector */
229+
flatbuffers_uint64_vec_ref_t out_calldests = flatbuffers_uint64_vec_create( runner->fb_builder, tmp_out_calldests, out_calldests_cnt );
151230

231+
/* Build effects */
232+
SOL_COMPAT_NS(ELFLoaderEffects_create)( runner->fb_builder, out_err_code, out_rodata, out_text_cnt, out_text_off, out_entry_pc, out_calldests );
152233

153-
return 0UL;
234+
return SOL_COMPAT_V2_SUCCESS;
154235
}

src/flamenco/runtime/tests/fd_harness_common.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -70,19 +70,19 @@ fd_solfuzz_pb_restore_features( fd_features_t * features,
7070
return 1;
7171
}
7272

73-
int
73+
void
7474
fd_solfuzz_fb_restore_features( fd_features_t * features,
7575
SOL_COMPAT_NS(FeatureSet_table_t) feature_set ) {
7676
fd_features_disable_all( features );
77-
for( ulong j=0UL; j < feature_set->features_count; j++ ) {
78-
ulong prefix = feature_set->features[j];
77+
flatbuffers_uint64_vec_t input_features = SOL_COMPAT_NS(FeatureSet_features( feature_set ));
78+
ulong input_features_cnt = flatbuffers_uint64_vec_len( input_features );
79+
for( ulong i=0UL; i<input_features_cnt; i++ ) {
80+
ulong prefix = flatbuffers_uint64_vec_at( input_features, i );
7981
fd_feature_id_t const * id = fd_feature_id_query( prefix );
8082
if( FD_UNLIKELY( !id ) ) {
81-
FD_LOG_WARNING(( "unsupported feature ID 0x%016lx", prefix ));
82-
return 0;
83+
FD_LOG_ERR(( "unsupported feature ID 0x%016lx", prefix ));
8384
}
8485
/* Enabled since genesis */
8586
fd_features_set( features, id, 0UL );
8687
}
87-
return 1;
8888
}

src/flamenco/runtime/tests/fd_sol_compat.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,6 @@
2222

2323
FD_PROTOTYPES_BEGIN
2424

25-
#define SOL_COMPAT_V2_SUCCESS (0)
26-
#define SOL_COMPAT_V2_FAILURE (-1)
27-
2825
/* sol_compat_init installs a new solfuzz execution context into the
2926
current process. Under the hood, acquires some demand-paged memory
3027
(with transparent huge page hint), and initializes some reusable data

src/flamenco/runtime/tests/fd_solfuzz_private.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ FD_PROTOTYPES_BEGIN
1818
#undef ns
1919
#define SOL_COMPAT_NS(x) FLATBUFFERS_WRAP_NAMESPACE(fd_org_solana_sealevel_v2, x)
2020

21+
#define SOL_COMPAT_V2_SUCCESS (0)
22+
#define SOL_COMPAT_V2_FAILURE (-1)
23+
2124
/* Creates / overwrites an account in funk given an input account state.
2225
On success, loads the account into acc. Optionally, reject any
2326
zero-lamport accounts from being loaded in. */
@@ -34,7 +37,10 @@ int
3437
fd_solfuzz_pb_restore_features( fd_features_t * features,
3538
fd_exec_test_feature_set_t const * feature_set );
3639

37-
int
40+
/* Flatbuffers variant of the above. This function call should never
41+
fail (all passed in features should be supported). Throws FD_LOG_ERR
42+
if any unsupported features are inputted. */
43+
void
3844
fd_solfuzz_fb_restore_features( fd_features_t * features,
3945
SOL_COMPAT_NS(FeatureSet_table_t) feature_set );
4046

src/flamenco/runtime/tests/flatbuffers/generated/elf_builder.h

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ __flatbuffers_build_table(flatbuffers_, fd_org_solana_sealevel_v2_ELFLoaderCtx,
3131
static const flatbuffers_voffset_t __fd_org_solana_sealevel_v2_ELFLoaderEffects_required[] = { 0 };
3232
typedef flatbuffers_ref_t fd_org_solana_sealevel_v2_ELFLoaderEffects_ref_t;
3333
static fd_org_solana_sealevel_v2_ELFLoaderEffects_ref_t fd_org_solana_sealevel_v2_ELFLoaderEffects_clone(flatbuffers_builder_t *B, fd_org_solana_sealevel_v2_ELFLoaderEffects_table_t t);
34-
__flatbuffers_build_table(flatbuffers_, fd_org_solana_sealevel_v2_ELFLoaderEffects, 7)
34+
__flatbuffers_build_table(flatbuffers_, fd_org_solana_sealevel_v2_ELFLoaderEffects, 6)
3535

3636
static const flatbuffers_voffset_t __fd_org_solana_sealevel_v2_ELFLoaderFixture_required[] = { 0, 1, 2, 0 };
3737
typedef flatbuffers_ref_t fd_org_solana_sealevel_v2_ELFLoaderFixture_ref_t;
@@ -44,11 +44,9 @@ static inline fd_org_solana_sealevel_v2_ELFLoaderCtx_ref_t fd_org_solana_sealeve
4444
__flatbuffers_build_table_prolog(flatbuffers_, fd_org_solana_sealevel_v2_ELFLoaderCtx, fd_org_solana_sealevel_v2_ELFLoaderCtx_file_identifier, fd_org_solana_sealevel_v2_ELFLoaderCtx_type_identifier)
4545

4646
#define __fd_org_solana_sealevel_v2_ELFLoaderEffects_formal_args ,\
47-
uint8_t v0, flatbuffers_uint8_vec_ref_t v1, uint64_t v2, uint64_t v3,\
48-
uint64_t v4, uint64_t v5, flatbuffers_uint64_vec_ref_t v6
47+
uint8_t v0, flatbuffers_uint8_vec_ref_t v1, uint64_t v2, uint64_t v3, uint64_t v4, flatbuffers_uint64_vec_ref_t v5
4948
#define __fd_org_solana_sealevel_v2_ELFLoaderEffects_call_args ,\
50-
v0, v1, v2, v3,\
51-
v4, v5, v6
49+
v0, v1, v2, v3, v4, v5
5250
static inline fd_org_solana_sealevel_v2_ELFLoaderEffects_ref_t fd_org_solana_sealevel_v2_ELFLoaderEffects_create(flatbuffers_builder_t *B __fd_org_solana_sealevel_v2_ELFLoaderEffects_formal_args);
5351
__flatbuffers_build_table_prolog(flatbuffers_, fd_org_solana_sealevel_v2_ELFLoaderEffects, fd_org_solana_sealevel_v2_ELFLoaderEffects_file_identifier, fd_org_solana_sealevel_v2_ELFLoaderEffects_type_identifier)
5452

@@ -86,21 +84,19 @@ static fd_org_solana_sealevel_v2_ELFLoaderCtx_ref_t fd_org_solana_sealevel_v2_EL
8684

8785
__flatbuffers_build_scalar_field(0, flatbuffers_, fd_org_solana_sealevel_v2_ELFLoaderEffects_err_code, flatbuffers_uint8, uint8_t, 1, 1, UINT8_C(0), fd_org_solana_sealevel_v2_ELFLoaderEffects)
8886
__flatbuffers_build_vector_field(1, flatbuffers_, fd_org_solana_sealevel_v2_ELFLoaderEffects_rodata, flatbuffers_uint8, uint8_t, fd_org_solana_sealevel_v2_ELFLoaderEffects)
89-
__flatbuffers_build_scalar_field(2, flatbuffers_, fd_org_solana_sealevel_v2_ELFLoaderEffects_rodata_sz, flatbuffers_uint64, uint64_t, 8, 8, UINT64_C(0), fd_org_solana_sealevel_v2_ELFLoaderEffects)
90-
__flatbuffers_build_scalar_field(3, flatbuffers_, fd_org_solana_sealevel_v2_ELFLoaderEffects_text_cnt, flatbuffers_uint64, uint64_t, 8, 8, UINT64_C(0), fd_org_solana_sealevel_v2_ELFLoaderEffects)
91-
__flatbuffers_build_scalar_field(4, flatbuffers_, fd_org_solana_sealevel_v2_ELFLoaderEffects_text_off, flatbuffers_uint64, uint64_t, 8, 8, UINT64_C(0), fd_org_solana_sealevel_v2_ELFLoaderEffects)
92-
__flatbuffers_build_scalar_field(5, flatbuffers_, fd_org_solana_sealevel_v2_ELFLoaderEffects_entry_pc, flatbuffers_uint64, uint64_t, 8, 8, UINT64_C(0), fd_org_solana_sealevel_v2_ELFLoaderEffects)
93-
__flatbuffers_build_vector_field(6, flatbuffers_, fd_org_solana_sealevel_v2_ELFLoaderEffects_calldests, flatbuffers_uint64, uint64_t, fd_org_solana_sealevel_v2_ELFLoaderEffects)
87+
__flatbuffers_build_scalar_field(2, flatbuffers_, fd_org_solana_sealevel_v2_ELFLoaderEffects_text_cnt, flatbuffers_uint64, uint64_t, 8, 8, UINT64_C(0), fd_org_solana_sealevel_v2_ELFLoaderEffects)
88+
__flatbuffers_build_scalar_field(3, flatbuffers_, fd_org_solana_sealevel_v2_ELFLoaderEffects_text_off, flatbuffers_uint64, uint64_t, 8, 8, UINT64_C(0), fd_org_solana_sealevel_v2_ELFLoaderEffects)
89+
__flatbuffers_build_scalar_field(4, flatbuffers_, fd_org_solana_sealevel_v2_ELFLoaderEffects_entry_pc, flatbuffers_uint64, uint64_t, 8, 8, UINT64_C(0), fd_org_solana_sealevel_v2_ELFLoaderEffects)
90+
__flatbuffers_build_vector_field(5, flatbuffers_, fd_org_solana_sealevel_v2_ELFLoaderEffects_calldests, flatbuffers_uint64, uint64_t, fd_org_solana_sealevel_v2_ELFLoaderEffects)
9491

9592
static inline fd_org_solana_sealevel_v2_ELFLoaderEffects_ref_t fd_org_solana_sealevel_v2_ELFLoaderEffects_create(flatbuffers_builder_t *B __fd_org_solana_sealevel_v2_ELFLoaderEffects_formal_args)
9693
{
9794
if (fd_org_solana_sealevel_v2_ELFLoaderEffects_start(B)
98-
|| fd_org_solana_sealevel_v2_ELFLoaderEffects_rodata_sz_add(B, v2)
99-
|| fd_org_solana_sealevel_v2_ELFLoaderEffects_text_cnt_add(B, v3)
100-
|| fd_org_solana_sealevel_v2_ELFLoaderEffects_text_off_add(B, v4)
101-
|| fd_org_solana_sealevel_v2_ELFLoaderEffects_entry_pc_add(B, v5)
95+
|| fd_org_solana_sealevel_v2_ELFLoaderEffects_text_cnt_add(B, v2)
96+
|| fd_org_solana_sealevel_v2_ELFLoaderEffects_text_off_add(B, v3)
97+
|| fd_org_solana_sealevel_v2_ELFLoaderEffects_entry_pc_add(B, v4)
10298
|| fd_org_solana_sealevel_v2_ELFLoaderEffects_rodata_add(B, v1)
103-
|| fd_org_solana_sealevel_v2_ELFLoaderEffects_calldests_add(B, v6)
99+
|| fd_org_solana_sealevel_v2_ELFLoaderEffects_calldests_add(B, v5)
104100
|| fd_org_solana_sealevel_v2_ELFLoaderEffects_err_code_add(B, v0)) {
105101
return 0;
106102
}
@@ -111,7 +107,6 @@ static fd_org_solana_sealevel_v2_ELFLoaderEffects_ref_t fd_org_solana_sealevel_v
111107
{
112108
__flatbuffers_memoize_begin(B, t);
113109
if (fd_org_solana_sealevel_v2_ELFLoaderEffects_start(B)
114-
|| fd_org_solana_sealevel_v2_ELFLoaderEffects_rodata_sz_pick(B, t)
115110
|| fd_org_solana_sealevel_v2_ELFLoaderEffects_text_cnt_pick(B, t)
116111
|| fd_org_solana_sealevel_v2_ELFLoaderEffects_text_off_pick(B, t)
117112
|| fd_org_solana_sealevel_v2_ELFLoaderEffects_entry_pc_pick(B, t)

src/flamenco/runtime/tests/flatbuffers/generated/elf_reader.h

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -98,11 +98,10 @@ __flatbuffers_table_as_root(fd_org_solana_sealevel_v2_ELFLoaderEffects)
9898

9999
__flatbuffers_define_scalar_field(0, fd_org_solana_sealevel_v2_ELFLoaderEffects, err_code, flatbuffers_uint8, uint8_t, UINT8_C(0))
100100
__flatbuffers_define_vector_field(1, fd_org_solana_sealevel_v2_ELFLoaderEffects, rodata, flatbuffers_uint8_vec_t, 0)
101-
__flatbuffers_define_scalar_field(2, fd_org_solana_sealevel_v2_ELFLoaderEffects, rodata_sz, flatbuffers_uint64, uint64_t, UINT64_C(0))
102-
__flatbuffers_define_scalar_field(3, fd_org_solana_sealevel_v2_ELFLoaderEffects, text_cnt, flatbuffers_uint64, uint64_t, UINT64_C(0))
103-
__flatbuffers_define_scalar_field(4, fd_org_solana_sealevel_v2_ELFLoaderEffects, text_off, flatbuffers_uint64, uint64_t, UINT64_C(0))
104-
__flatbuffers_define_scalar_field(5, fd_org_solana_sealevel_v2_ELFLoaderEffects, entry_pc, flatbuffers_uint64, uint64_t, UINT64_C(0))
105-
__flatbuffers_define_vector_field(6, fd_org_solana_sealevel_v2_ELFLoaderEffects, calldests, flatbuffers_uint64_vec_t, 0)
101+
__flatbuffers_define_scalar_field(2, fd_org_solana_sealevel_v2_ELFLoaderEffects, text_cnt, flatbuffers_uint64, uint64_t, UINT64_C(0))
102+
__flatbuffers_define_scalar_field(3, fd_org_solana_sealevel_v2_ELFLoaderEffects, text_off, flatbuffers_uint64, uint64_t, UINT64_C(0))
103+
__flatbuffers_define_scalar_field(4, fd_org_solana_sealevel_v2_ELFLoaderEffects, entry_pc, flatbuffers_uint64, uint64_t, UINT64_C(0))
104+
__flatbuffers_define_vector_field(5, fd_org_solana_sealevel_v2_ELFLoaderEffects, calldests, flatbuffers_uint64_vec_t, 0)
106105

107106
struct fd_org_solana_sealevel_v2_ELFLoaderFixture_table { uint8_t unused__; };
108107

src/flamenco/runtime/tests/flatbuffers/generated/elf_verifier.h

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,10 @@ static int fd_org_solana_sealevel_v2_ELFLoaderEffects_verify_table(flatcc_table_
5353
int ret;
5454
if ((ret = flatcc_verify_field(td, 0, 1, 1) /* err_code */)) return ret;
5555
if ((ret = flatcc_verify_vector_field(td, 1, 0, 1, 1, INT64_C(4294967295)) /* rodata */)) return ret;
56-
if ((ret = flatcc_verify_field(td, 2, 8, 8) /* rodata_sz */)) return ret;
57-
if ((ret = flatcc_verify_field(td, 3, 8, 8) /* text_cnt */)) return ret;
58-
if ((ret = flatcc_verify_field(td, 4, 8, 8) /* text_off */)) return ret;
59-
if ((ret = flatcc_verify_field(td, 5, 8, 8) /* entry_pc */)) return ret;
60-
if ((ret = flatcc_verify_vector_field(td, 6, 0, 8, 8, INT64_C(536870911)) /* calldests */)) return ret;
56+
if ((ret = flatcc_verify_field(td, 2, 8, 8) /* text_cnt */)) return ret;
57+
if ((ret = flatcc_verify_field(td, 3, 8, 8) /* text_off */)) return ret;
58+
if ((ret = flatcc_verify_field(td, 4, 8, 8) /* entry_pc */)) return ret;
59+
if ((ret = flatcc_verify_vector_field(td, 5, 0, 8, 8, INT64_C(536870911)) /* calldests */)) return ret;
6160
return flatcc_verify_ok;
6261
}
6362

0 commit comments

Comments
 (0)