Virtual Address Space Adjustments
- Idea
- Draft
- Review
- Accept
- Implement
- Active
Decision brief
Why this proposal matters
Virtual address space related changes split off from SIMD-0219: Removing pitfalls and foot-guns from the ABI (including syscalls) and runtime.
Proposal at a glance
What changes
- The access is completely within the maximum account length, otherwise InstructionError::InvalidRealloc must be thrown.
- The access is completely within the rest of the account growth budget of the transaction, otherwise InstructionError::InvalidRealloc must be thrown.
- The access is completely within the current length of the account, otherwise extend the account with zeros to the maximum allowed by the previous two checks.
Stakeholder map
Who is affected
Builders & client teams Medium impact
Splitting SIMD-0219 should have no impact on dApp developers or validators. An experiment to gauge the impact of the additional changes is currently running.
Action may be requiredValidators & operators Medium impact
Splitting SIMD-0219 should have no impact on dApp developers or validators. An experiment to gauge the impact of the additional changes is currently running.
Action may be requiredUsers & stakers Impact unknown
No proposal-specific evidence was found for this group.
Action requirement unknownGovernance & ecosystem Impact unknown
No proposal-specific evidence was found for this group.
Action requirement unknownExact source revision
Full proposal document
0616093b2952Summary
Virtual address space related changes split off from SIMD-0219: Removing pitfalls and foot-guns from the ABI (including syscalls) and runtime.
Motivation
In a recent meeting between the Agave and Firedancer core developers it was decided that SIMD-0219 should be split into two feature gates. This SIMD covers the second half which is focused on the address translation, memory mappings, reallocation / resizing, zeroing and defining empty / unmapped address space.
The reasoning for splitting SIMD-0219 is to de-risk its deployment and to be able to make progress on shipping earlier parts even if later parts have to be delayed further.
Additionally, as the unaligned address translation mechanism required for this part of SIMD-0219 incurs a slight performance decrease, it was decided to globally deactivate stack frame gaps to counter the effect. Stack frame gaps were identified as a performance issue in the address translation in general.
New Terminology
None.
Detailed Design
Changes inherited from SIMD-0219
Memory accesses (both by the program and by syscalls) which span across memory mapping regions are considered access violations. Accesses to multiple regions (e.g. by memcpy syscalls) have to be split into multiple separate accesses (one for each region) by the user.
For all memory accesses to the payload address space of an account which is flagged as writable and owned by the currently executed program, check that:
- The access is completely within the maximum account length,
otherwise
InstructionError::InvalidReallocmust be thrown. - The access is completely within the rest of the account growth budget of the
transaction, otherwise
InstructionError::InvalidReallocmust be thrown. - The access is completely within the current length of the account, otherwise extend the account with zeros to the maximum allowed by the previous two checks.
For loads / read accesses to the payload address space of an account check that:
- The access is completely within the current length of the account,
otherwise
InstructionError::AccountDataTooSmallmust be thrown.
For stores / write accesses to the payload address space of an account check that:
- The account is flagged as writable,
otherwise
InstructionError::ReadonlyDataModifiedmust be thrown - The account is owned by the currently executed program,
otherwise
InstructionError::ExternalAccountDataModifiedmust be thrown.
Additional changes
Stack frame gaps must be deactivated globally (even for existing SBPFv0 programs). So far they were only deactivated for newer SBPF versions.
After the removal of the gaps the stack address space will be compacted by a factor of two but the total mapped bytes will stay the same. They will simply be at lower addresses than before and form one contiguous address range. See example below:
| Address range | Before this SIMD | After this SIMD |
|---|---|---|
0x200000000..0x200001000 | mapped | mapped |
0x200001000..0x200002000 | --- | mapped |
0x200002000..0x200003000 | mapped | mapped |
0x200003000..0x200004000 | --- | --- |
0x200004000..0x200006000 | mapped | --- |
0x200005000..0x200007000 | --- | --- |
In SBPFv0 the stack frame bump on call and callx must be lowered from 8 KiB
to 4 KiB (this is already the case in SBPFv3).
Alternatives Considered
Leaving SIMD-0219 as is.
Impact
Splitting SIMD-0219 should have no impact on dApp developers or validators. An experiment to gauge the impact of the additional changes is currently running.
Security Considerations
Removing the stack frame gaps globally (even for SBPFv0) programs can affect programs which rely on the address space layout of the stack either by using absolute addressing, relative addressing across stack frames or being dependent on bugs such accesses reaching over the boundary of stack frames.
Evidence graph
Related proposals and rollout
One or more sources are unavailable.
Upstream review record
Upstream discussion & review
GitHub review is editorial context, not evidence of on-chain support, voting, or outcome.
PR #460 · merged SIMD-0460: Virtual Address Space Adjustments 12 comments and reviews · May 4, 2026I found this confused me more than it helped me. I spent some time trying to think of a way to describe it better, but I don't know if I can. The best I came up with is: Prior behavior Behavior specified by this SIMD 0x200000000..0x200001000 mapped 0x200000000..0x200040000 mapped 0x200001000..0x200002000 unmapped 0x200002000..0x200003000 mapped 0x200003000..0x200004000 unmapped etc. I think the prose around this are enough, so if you don't like this table, I'd just delete the diagram you had.
GitHub ↗Side observation: we may have to adjust the toolchain to consider each mapping region as a separate address space, otherwise LLVM may be enabled to merge adjacent memory operations back into one larger memcpy/load/store/etc. Likely not a big deal in typical case anyway, as two adjacent memory mappings being fully mapped is very unlikely to occur given the size of them.
GitHub ↗Same comment as https://github.com/solana-foundation/solana-improvement-documents/pull/459discussionr2826878815.
GitHub ↗In ABIv1, it is theoretically possible to have a pointer that crosses multiple memory regions. In ABIv2, that won't happen anymore.
GitHub ↗Thanks, topointon-jump(https://github.com/topointon-jump)! ⚠️ Status: Cannot merge yet - Missing approval from: Anza (t-nelson(https://github.com/t-nelson), sakridge(https://github.com/sakridge), or bw-solana(https://github.com/bw-solana))
GitHub ↗✅ All approvals received! @Lichtso, you can now merge this by commenting /merge. ✅ Status: Ready to merge
GitHub ↗/merge
GitHub ↗✅ Merge successful! Lichtso(https://github.com/Lichtso)'s PR has been merged.
GitHub ↗Provenance
Evidence & technical details
Rollout or chain data, source revisions, freshness and integrity. 1
Provenance
Evidence & technical details
Rollout or chain data, source revisions, freshness and integrity.SIMD
Deployment Status
Feature Gate not yet created
Exact source revision
Sources & integrity
- Proposal document pinned_commit_blob
0616093b2952ed6de52c4a27d66aadd11d48d4f9 - simd-document document · current · Sep 11, 2026
0616093b2952ed6de52c4a27d66aadd11d48d4f9
One or more sources are unavailable.
simd.watch community discussion · SIMD-0460
Powered by Giscus · Sign in with GitHub to comment
Community comments load when this section approaches the viewport.