@@ -29,11 +29,19 @@ void FfiCallbackMetadata::EnsureStubPageLocked() {
2929 ASSERT_LESS_OR_EQUAL (VirtualMemory::PageSize (), kPageSize );
3030
3131#if defined(SIMULATOR_FFI) && defined(HOST_ARCH_ARM64)
32- const uword code_start =
33- reinterpret_cast <uword>(SimulatorFfiCallbackTrampoline);
34- const uword code_end =
35- reinterpret_cast <uword>(SimulatorFfiCallbackTrampolineEnd);
36- const uword page_start = code_start & ~(VirtualMemory::PageSize () - 1 );
32+ uword code_start, code_end, page_start;
33+ if (FLAG_use_simulator) {
34+ code_start = reinterpret_cast <uword>(SimulatorFfiCallbackTrampoline);
35+ code_end = reinterpret_cast <uword>(SimulatorFfiCallbackTrampolineEnd);
36+ page_start = code_start & ~(VirtualMemory::PageSize () - 1 );
37+ } else {
38+ const Code& trampoline_code = StubCode::FfiCallbackTrampoline ();
39+ code_start = trampoline_code.EntryPoint ();
40+ code_end = code_start + trampoline_code.Size ();
41+ page_start = code_start & ~(VirtualMemory::PageSize () - 1 );
42+ ASSERT_LESS_OR_EQUAL ((code_start - page_start) + trampoline_code.Size (),
43+ RXMappingSize ());
44+ }
3745#else
3846 const Code& trampoline_code = StubCode::FfiCallbackTrampoline ();
3947 const uword code_start = trampoline_code.EntryPoint ();
@@ -50,8 +58,7 @@ void FfiCallbackMetadata::EnsureStubPageLocked() {
5058
5159 offset_of_first_trampoline_in_page_ = code_start - page_start;
5260
53- #if defined(DART_TARGET_OS_FUCHSIA) || \
54- (defined (SIMULATOR_FFI) && defined (HOST_ARCH_ARM64))
61+ #if defined(DART_TARGET_OS_FUCHSIA)
5562 // On Fuchsia we can't currently duplicate pages, so use the first page of
5663 // trampolines. Store the stub page's metadata in a separately allocated RW
5764 // page.
@@ -64,6 +71,17 @@ void FfiCallbackMetadata::EnsureStubPageLocked() {
6471 for (intptr_t i = 0 ; i < NumCallbackTrampolinesPerPage (); ++i) {
6572 AddToFreeListLocked (&metadata_entry[i]);
6673 }
74+ #elif defined(SIMULATOR_FFI) && defined(HOST_ARCH_ARM64)
75+ if (FLAG_use_simulator) {
76+ original_metadata_page_ = VirtualMemory::AllocateAligned (
77+ MappingSize (), MappingAlignment (), /* is_executable=*/ false ,
78+ /* is_compressed=*/ false , " FfiCallbackMetadata::TrampolinePage" );
79+ MetadataEntry* metadata_entry = reinterpret_cast <MetadataEntry*>(
80+ original_metadata_page_->start () + MetadataOffset ());
81+ for (intptr_t i = 0 ; i < NumCallbackTrampolinesPerPage (); ++i) {
82+ AddToFreeListLocked (&metadata_entry[i]);
83+ }
84+ }
6785#endif // defined(DART_TARGET_OS_FUCHSIA)
6886}
6987
@@ -112,12 +130,17 @@ void FfiCallbackMetadata::FillRuntimeFunction(VirtualMemory* page,
112130}
113131
114132VirtualMemory* FfiCallbackMetadata::AllocateTrampolinePage () {
115- #if defined(DART_TARGET_OS_FUCHSIA) || \
116- (defined (SIMULATOR_FFI) && defined (HOST_ARCH_ARM64))
133+ #if defined(DART_TARGET_OS_FUCHSIA)
117134 // TODO(https://dartbug.com/52579): Remove.
118135 UNREACHABLE ();
119136 return nullptr ;
120137#else
138+ #if defined(SIMULATOR_FFI) && defined(HOST_ARCH_ARM64)
139+ if (FLAG_use_simulator) {
140+ UNREACHABLE ();
141+ return nullptr ;
142+ }
143+ #endif
121144
122145#if defined(DART_HOST_OS_MACOS) && defined(DART_PRECOMPILED_RUNTIME)
123146 const bool should_remap_stub_page = true ;
@@ -413,8 +436,13 @@ FfiCallbackMetadata::Trampoline FfiCallbackMetadata::TrampolineOfMetadataEntry(
413436 reinterpret_cast <MetadataEntry*>(start + MetadataOffset ());
414437 const uword index = metadata_entry - metadata_entries;
415438#if defined(SIMULATOR_FFI) && defined(HOST_ARCH_ARM64)
416- return reinterpret_cast <uword>(SimulatorFfiCallbackTrampoline) +
417- index * kNativeCallbackTrampolineSize ;
439+ if (FLAG_use_simulator) {
440+ return reinterpret_cast <uword>(SimulatorFfiCallbackTrampoline) +
441+ index * kNativeCallbackTrampolineSize ;
442+ } else {
443+ return start + offset_of_first_trampoline_in_page_ +
444+ index * kNativeCallbackTrampolineSize ;
445+ }
418446#elif defined(DART_TARGET_OS_FUCHSIA)
419447 return StubCode::FfiCallbackTrampoline ().EntryPoint () +
420448 index * kNativeCallbackTrampolineSize ;
@@ -426,8 +454,7 @@ FfiCallbackMetadata::Trampoline FfiCallbackMetadata::TrampolineOfMetadataEntry(
426454
427455FfiCallbackMetadata::MetadataEntry*
428456FfiCallbackMetadata::MetadataEntryOfTrampoline (Trampoline trampoline) const {
429- #if defined(DART_TARGET_OS_FUCHSIA) || \
430- (defined (SIMULATOR_FFI) && defined (HOST_ARCH_ARM64))
457+ #if defined(DART_TARGET_OS_FUCHSIA)
431458 // On Fuchsia the metadata page is separate to the trampoline page.
432459 // TODO(https://dartbug.com/52579): Remove.
433460 const uword page_start =
@@ -440,6 +467,27 @@ FfiCallbackMetadata::MetadataEntryOfTrampoline(Trampoline trampoline) const {
440467 MetadataEntry* metadata_etnry_table = reinterpret_cast <MetadataEntry*>(
441468 original_metadata_page_->start () + MetadataOffset ());
442469 return metadata_etnry_table + index;
470+ #elif defined(SIMULATOR_FFI) && defined(HOST_ARCH_ARM64)
471+ if (FLAG_use_simulator) {
472+ const uword page_start =
473+ Utils::RoundDown (trampoline - offset_of_first_trampoline_in_page_,
474+ VirtualMemory::PageSize ());
475+ const uword index =
476+ (trampoline - offset_of_first_trampoline_in_page_ - page_start) /
477+ kNativeCallbackTrampolineSize ;
478+ ASSERT (index < NumCallbackTrampolinesPerPage ());
479+ MetadataEntry* metadata_etnry_table = reinterpret_cast <MetadataEntry*>(
480+ original_metadata_page_->start () + MetadataOffset ());
481+ return metadata_etnry_table + index;
482+ } else {
483+ const uword start = MappingStart (trampoline);
484+ MetadataEntry* metadata_entries =
485+ reinterpret_cast <MetadataEntry*>(start + MetadataOffset ());
486+ const uword index =
487+ (trampoline - start - offset_of_first_trampoline_in_page_) /
488+ kNativeCallbackTrampolineSize ;
489+ return &metadata_entries[index];
490+ }
443491#else
444492 const uword start = MappingStart (trampoline);
445493 MetadataEntry* metadata_entries =
0 commit comments