Skip to content

Unify surrogate/no-surrogate mapping behind a single abstraction #1581

Description

@danbugs

Context

PR #1578 adds a no-surrogate mode (HYPERLIGHT_MAX_SURROGATES=0) that uses WHvMapGpaRange instead of WHvMapGpaRange2. Currently whp.rs branches on Option<SurrogateProcess> to choose the mapping path.

Proposal

Unify the surrogate and no-surrogate paths so whp.rs doesn't need to know or care which mode is active. Two possible approaches:

  1. Enum / trait abstraction: Make SurrogateProcess an enum (or dyn Trait) with two variants — one backed by a real surrogate process (WHvMapGpaRange2) and one that maps from the host process directly (WHvMapGpaRange). The NoSurrogateGuard could be folded into the no-surrogate variant.

  2. Always use WHvMapGpaRange2: Use the current process handle as the source when surrogates are disabled, eliminating the branch entirely. This needs validation — it's unclear whether WHvMapGpaRange2 with GetCurrentProcess() is a supported pattern.

Either way, the mapping call would move into the surrogate module so whp.rs just calls a single map(...) method.

Origin

Suggestion from @syntactically in PR #1578 review.

Metadata

Metadata

Assignees

No one assigned

    Labels

    kind/enhancementFor PRs adding features, improving functionality, docs, tests, etc.kind/refactorFor PRs that restructure or remove code without adding new functionality.lifecycle/confirmedBug is verified or proposal seems reasonable

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions