Skip to main content
Technical proposal SIMD-0460 Review

Virtual Address Space Adjustments

  1. Idea
  2. Draft
  3. Review
  4. Accept
  5. Implement
  6. 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.

Source-backed reading aid · source language: EN

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 required
Validators & 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 required
Users & stakers Impact unknown

No proposal-specific evidence was found for this group.

Action requirement unknown
Governance & ecosystem Impact unknown

No proposal-specific evidence was found for this group.

Action requirement unknown

Exact source revision

Full proposal document

Source-language document. Technical identifiers and evidence remain unchanged. 0616093b2952

Summary

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::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.

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::AccountDataTooSmall must be thrown.

For stores / write accesses to the payload address space of an account check that:

  • The account is flagged as writable, otherwise InstructionError::ReadonlyDataModified must be thrown
  • The account is owned by the currently executed program, otherwise InstructionError::ExternalAccountDataModified must 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 rangeBefore this SIMDAfter this SIMD
0x200000000..0x200001000mappedmapped
0x200001000..0x200002000---mapped
0x200002000..0x200003000mappedmapped
0x200003000..0x200004000------
0x200004000..0x200006000mapped---
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, 2026
@ptaffet-jump

I 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 ↗
@nagisa

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 ↗
@nagisa

Same comment as https://github.com/solana-foundation/solana-improvement-documents/pull/459discussionr2826878815.

GitHub ↗
@LucasSte

In ABIv1, it is theoretically possible to have a pointer that crosses multiple memory regions. In ABIv2, that won't happen anymore.

GitHub ↗
@simd-botbot

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 ↗
@simd-botbot

✅ All approvals received! @Lichtso, you can now merge this by commenting /merge. ✅ Status: Ready to merge

GitHub ↗
@simd-botbot

✅ Merge successful! Lichtso(https://github.com/Lichtso)'s PR has been merged.

GitHub ↗

simd.watch community discussion · SIMD-0460

Powered by Giscus · Sign in with GitHub to comment

Community comments load when this section approaches the viewport.

Provenance

Evidence & technical details

Rollout or chain data, source revisions, freshness and integrity.
1

SIMD

Deployment Status

Document lifecycleReview
CategoryCore protocol

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.