@psnext/slingcli 2.4.20260526-1 → 2.4.20260527-2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/sling.js +4 -1
- package/node_modules/@aws-sdk/core/package.json +2 -2
- package/node_modules/@aws-sdk/credential-provider-env/package.json +2 -2
- package/node_modules/@aws-sdk/credential-provider-http/dist-cjs/fromHttp/fromHttp.js +12 -6
- package/node_modules/@aws-sdk/credential-provider-http/dist-es/fromHttp/fromHttp.js +12 -6
- package/node_modules/@aws-sdk/credential-provider-http/package.json +3 -2
- package/node_modules/@aws-sdk/credential-provider-ini/package.json +9 -9
- package/node_modules/@aws-sdk/credential-provider-login/package.json +3 -3
- package/node_modules/@aws-sdk/credential-provider-node/package.json +7 -7
- package/node_modules/@aws-sdk/credential-provider-process/package.json +2 -2
- package/node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/token-providers/package.json +3 -3
- package/node_modules/@aws-sdk/credential-provider-sso/package.json +4 -4
- package/node_modules/@aws-sdk/credential-provider-web-identity/package.json +3 -3
- package/node_modules/@aws-sdk/middleware-websocket/package.json +2 -2
- package/node_modules/@aws-sdk/nested-clients/dist-cjs/submodules/cognito-identity/index.js +1 -1
- package/node_modules/@aws-sdk/nested-clients/dist-cjs/submodules/signin/index.js +1 -1
- package/node_modules/@aws-sdk/nested-clients/dist-cjs/submodules/sso/index.js +1 -1
- package/node_modules/@aws-sdk/nested-clients/dist-cjs/submodules/sso-oidc/index.js +1 -1
- package/node_modules/@aws-sdk/nested-clients/dist-cjs/submodules/sts/index.js +1 -1
- package/node_modules/@aws-sdk/nested-clients/package.json +3 -3
- package/node_modules/@aws-sdk/signature-v4-multi-region/package.json +1 -2
- package/node_modules/@aws-sdk/xml-builder/package.json +2 -2
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/compaction.js +18 -24
- package/node_modules/@earendil-works/pi-agent-core/package.json +2 -2
- package/node_modules/@earendil-works/pi-ai/dist/cli.js +14 -0
- package/node_modules/@earendil-works/pi-ai/dist/models.generated.js +73 -58
- package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.js +2 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.js +8 -22
- package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.js +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/images/openrouter.js +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex-responses.js +60 -40
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-completions.js +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses.js +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/device-code.js +55 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/github-copilot.js +45 -69
- package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/index.js +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.js +5 -2
- package/node_modules/@earendil-works/pi-ai/package.json +4 -3
- package/node_modules/@earendil-works/pi-coding-agent/dist/cli/file-processor.js +2 -3
- package/node_modules/@earendil-works/pi-coding-agent/dist/config.js +18 -12
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/agent-session-runtime.js +2 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/agent-session-services.js +3 -2
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/agent-session.js +8 -2
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/auth-storage.js +2 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/compaction/compaction.js +18 -24
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/export-html/index.js +8 -6
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/export-html/template.js +6 -3
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/loader.js +12 -29
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/model-registry.js +5 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/output-guard.js +52 -22
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/package-manager.js +63 -36
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/prompt-templates.js +6 -20
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/resource-loader.js +38 -31
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/sdk.js +9 -4
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/session-manager.js +32 -24
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/settings-manager.js +6 -13
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/skills.js +8 -22
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/bash.js +54 -53
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/edit-diff.js +8 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/edit.js +44 -81
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/file-mutation-queue.js +27 -12
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/find.js +2 -3
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/grep.js +3 -3
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/ls.js +5 -5
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/output-accumulator.js +9 -3
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/path-utils.js +39 -21
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/read.js +9 -8
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/truncate.js +12 -2
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/write.js +20 -35
- package/node_modules/@earendil-works/pi-coding-agent/dist/main.js +5 -6
- package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/config-selector.js +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/footer.js +14 -5
- package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/login-dialog.js +29 -4
- package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/user-message.js +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/interactive-mode.js +4 -4
- package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/theme/theme.js +37 -28
- package/node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-client.js +64 -7
- package/node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-mode.js +15 -3
- package/node_modules/@earendil-works/pi-coding-agent/dist/utils/clipboard-native.js +14 -8
- package/node_modules/@earendil-works/pi-coding-agent/dist/utils/image-resize-core.js +124 -0
- package/node_modules/@earendil-works/pi-coding-agent/dist/utils/image-resize-worker.js +31 -0
- package/node_modules/@earendil-works/pi-coding-agent/dist/utils/image-resize.js +75 -115
- package/node_modules/@earendil-works/pi-coding-agent/dist/utils/paths.js +33 -7
- package/node_modules/@earendil-works/pi-coding-agent/npm-shrinkwrap.json +13 -26
- package/node_modules/@earendil-works/pi-coding-agent/package.json +6 -6
- package/node_modules/@earendil-works/pi-tui/dist/components/editor.js +40 -55
- package/node_modules/@earendil-works/pi-tui/dist/components/input.js +2 -2
- package/node_modules/@earendil-works/pi-tui/dist/components/markdown.js +12 -2
- package/node_modules/@earendil-works/pi-tui/dist/native-modifiers.js +53 -0
- package/node_modules/@earendil-works/pi-tui/dist/terminal-image.js +4 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal.js +38 -16
- package/node_modules/@earendil-works/pi-tui/dist/utils.js +19 -12
- package/node_modules/@earendil-works/pi-tui/native/darwin/prebuilds/darwin-arm64/darwin-modifiers.node +0 -0
- package/node_modules/@earendil-works/pi-tui/native/darwin/prebuilds/darwin-x64/darwin-modifiers.node +0 -0
- package/node_modules/@earendil-works/pi-tui/native/win32/prebuilds/win32-arm64/win32-console-mode.node +0 -0
- package/node_modules/@earendil-works/pi-tui/native/win32/prebuilds/win32-x64/win32-console-mode.node +0 -0
- package/node_modules/@earendil-works/pi-tui/package.json +3 -5
- package/node_modules/@smithy/node-http-handler/package.json +2 -2
- package/package.json +6 -6
- package/slingshot/index.js +246 -244
- package/node_modules/koffi/CHANGELOG.md +0 -1093
- package/node_modules/koffi/LICENSE.txt +0 -22
- package/node_modules/koffi/README.md +0 -43
- package/node_modules/koffi/build/koffi/darwin_arm64/koffi.node +0 -0
- package/node_modules/koffi/build/koffi/darwin_x64/koffi.node +0 -0
- package/node_modules/koffi/build/koffi/freebsd_arm64/koffi.node +0 -0
- package/node_modules/koffi/build/koffi/freebsd_ia32/koffi.node +0 -0
- package/node_modules/koffi/build/koffi/freebsd_x64/koffi.node +0 -0
- package/node_modules/koffi/build/koffi/linux_arm64/koffi.node +0 -0
- package/node_modules/koffi/build/koffi/linux_armhf/koffi.node +0 -0
- package/node_modules/koffi/build/koffi/linux_ia32/koffi.node +0 -0
- package/node_modules/koffi/build/koffi/linux_loong64/koffi.node +0 -0
- package/node_modules/koffi/build/koffi/linux_riscv64d/koffi.node +0 -0
- package/node_modules/koffi/build/koffi/linux_x64/koffi.node +0 -0
- package/node_modules/koffi/build/koffi/musl_arm64/koffi.node +0 -0
- package/node_modules/koffi/build/koffi/musl_x64/koffi.node +0 -0
- package/node_modules/koffi/build/koffi/openbsd_ia32/koffi.node +0 -0
- package/node_modules/koffi/build/koffi/openbsd_x64/koffi.node +0 -0
- package/node_modules/koffi/build/koffi/win32_arm64/koffi.exp +0 -0
- package/node_modules/koffi/build/koffi/win32_arm64/koffi.lib +0 -0
- package/node_modules/koffi/build/koffi/win32_arm64/koffi.node +0 -0
- package/node_modules/koffi/build/koffi/win32_ia32/koffi.exp +0 -0
- package/node_modules/koffi/build/koffi/win32_ia32/koffi.lib +0 -0
- package/node_modules/koffi/build/koffi/win32_ia32/koffi.node +0 -0
- package/node_modules/koffi/build/koffi/win32_x64/koffi.exp +0 -0
- package/node_modules/koffi/build/koffi/win32_x64/koffi.lib +0 -0
- package/node_modules/koffi/build/koffi/win32_x64/koffi.node +0 -0
- package/node_modules/koffi/doc/benchmarks.md +0 -126
- package/node_modules/koffi/doc/callbacks.md +0 -210
- package/node_modules/koffi/doc/contribute.md +0 -148
- package/node_modules/koffi/doc/functions.md +0 -250
- package/node_modules/koffi/doc/index.md +0 -61
- package/node_modules/koffi/doc/input.md +0 -471
- package/node_modules/koffi/doc/migration.md +0 -159
- package/node_modules/koffi/doc/misc.md +0 -180
- package/node_modules/koffi/doc/output.md +0 -305
- package/node_modules/koffi/doc/packaging.md +0 -88
- package/node_modules/koffi/doc/platforms.md +0 -36
- package/node_modules/koffi/doc/pointers.md +0 -328
- package/node_modules/koffi/doc/start.md +0 -118
- package/node_modules/koffi/doc/unions.md +0 -186
- package/node_modules/koffi/doc/variables.md +0 -102
- package/node_modules/koffi/index.d.ts +0 -288
- package/node_modules/koffi/index.js +0 -634
- package/node_modules/koffi/indirect.js +0 -533
- package/node_modules/koffi/lib/native/base/base.cc +0 -11015
- package/node_modules/koffi/lib/native/base/base.hh +0 -6003
- package/node_modules/koffi/lib/native/base/crc.inc +0 -2214
- package/node_modules/koffi/lib/native/base/crc_gen.py +0 -72
- package/node_modules/koffi/lib/native/base/mimetypes.inc +0 -1248
- package/node_modules/koffi/lib/native/base/mimetypes_gen.py +0 -58
- package/node_modules/koffi/lib/native/base/tower.cc +0 -821
- package/node_modules/koffi/lib/native/base/tower.hh +0 -81
- package/node_modules/koffi/lib/native/base/unicode.inc +0 -408
- package/node_modules/koffi/lib/native/base/unicode_gen.py +0 -152
- package/node_modules/koffi/package.json +0 -38
- package/node_modules/koffi/src/cnoke/LICENSE.txt +0 -22
- package/node_modules/koffi/src/cnoke/README.md +0 -99
- package/node_modules/koffi/src/cnoke/assets/FindCNoke.cmake +0 -127
- package/node_modules/koffi/src/cnoke/assets/toolchains.json +0 -126
- package/node_modules/koffi/src/cnoke/assets/win_delay_hook.c +0 -36
- package/node_modules/koffi/src/cnoke/cnoke.js +0 -170
- package/node_modules/koffi/src/cnoke/package.json +0 -24
- package/node_modules/koffi/src/cnoke/src/builder.js +0 -511
- package/node_modules/koffi/src/cnoke/src/index.js +0 -10
- package/node_modules/koffi/src/cnoke/src/tools.js +0 -407
- package/node_modules/koffi/src/koffi/CMakeLists.txt +0 -182
- package/node_modules/koffi/src/koffi/src/abi_arm32.cc +0 -1018
- package/node_modules/koffi/src/koffi/src/abi_arm32_asm.S +0 -169
- package/node_modules/koffi/src/koffi/src/abi_arm64.cc +0 -1295
- package/node_modules/koffi/src/koffi/src/abi_arm64_asm.S +0 -195
- package/node_modules/koffi/src/koffi/src/abi_arm64_asm.asm +0 -174
- package/node_modules/koffi/src/koffi/src/abi_loong64.cc +0 -5
- package/node_modules/koffi/src/koffi/src/abi_loong64_asm.S +0 -204
- package/node_modules/koffi/src/koffi/src/abi_riscv64.cc +0 -915
- package/node_modules/koffi/src/koffi/src/abi_riscv64_asm.S +0 -203
- package/node_modules/koffi/src/koffi/src/abi_x64_sysv.cc +0 -939
- package/node_modules/koffi/src/koffi/src/abi_x64_sysv_asm.S +0 -231
- package/node_modules/koffi/src/koffi/src/abi_x64_win.cc +0 -715
- package/node_modules/koffi/src/koffi/src/abi_x64_win_asm.S +0 -166
- package/node_modules/koffi/src/koffi/src/abi_x64_win_asm.asm +0 -192
- package/node_modules/koffi/src/koffi/src/abi_x86.cc +0 -860
- package/node_modules/koffi/src/koffi/src/abi_x86_asm.S +0 -193
- package/node_modules/koffi/src/koffi/src/abi_x86_asm.asm +0 -177
- package/node_modules/koffi/src/koffi/src/call.cc +0 -1326
- package/node_modules/koffi/src/koffi/src/call.hh +0 -179
- package/node_modules/koffi/src/koffi/src/errno.inc +0 -462
- package/node_modules/koffi/src/koffi/src/ffi.cc +0 -2702
- package/node_modules/koffi/src/koffi/src/ffi.hh +0 -354
- package/node_modules/koffi/src/koffi/src/init.js +0 -105
- package/node_modules/koffi/src/koffi/src/parser.cc +0 -220
- package/node_modules/koffi/src/koffi/src/parser.hh +0 -54
- package/node_modules/koffi/src/koffi/src/util.cc +0 -1807
- package/node_modules/koffi/src/koffi/src/util.hh +0 -221
- package/node_modules/koffi/src/koffi/src/uv.cc +0 -193
- package/node_modules/koffi/src/koffi/src/uv.def +0 -10
- package/node_modules/koffi/src/koffi/src/uv.hh +0 -40
- package/node_modules/koffi/src/koffi/src/win32.cc +0 -198
- package/node_modules/koffi/src/koffi/src/win32.hh +0 -119
- package/node_modules/koffi/src/koffi/tools/write_trampolines.js +0 -77
- package/node_modules/koffi/vendor/node-addon-api/LICENSE.md +0 -9
- package/node_modules/koffi/vendor/node-addon-api/README.md +0 -95
- package/node_modules/koffi/vendor/node-addon-api/napi-inl.deprecated.h +0 -186
- package/node_modules/koffi/vendor/node-addon-api/napi-inl.h +0 -7033
- package/node_modules/koffi/vendor/node-addon-api/napi.h +0 -3309
- package/node_modules/koffi/vendor/node-api-headers/LICENSE +0 -21
- package/node_modules/koffi/vendor/node-api-headers/README.md +0 -95
- package/node_modules/koffi/vendor/node-api-headers/def/js_native_api.def +0 -125
- package/node_modules/koffi/vendor/node-api-headers/def/node_api.def +0 -157
- package/node_modules/koffi/vendor/node-api-headers/include/js_native_api.h +0 -591
- package/node_modules/koffi/vendor/node-api-headers/include/js_native_api_types.h +0 -210
- package/node_modules/koffi/vendor/node-api-headers/include/node_api.h +0 -265
- package/node_modules/koffi/vendor/node-api-headers/include/node_api_types.h +0 -58
- package/node_modules/koffi/vendor/node-api-headers/include/uv/aix.h +0 -32
- package/node_modules/koffi/vendor/node-api-headers/include/uv/bsd.h +0 -34
- package/node_modules/koffi/vendor/node-api-headers/include/uv/darwin.h +0 -61
- package/node_modules/koffi/vendor/node-api-headers/include/uv/errno.h +0 -483
- package/node_modules/koffi/vendor/node-api-headers/include/uv/linux.h +0 -34
- package/node_modules/koffi/vendor/node-api-headers/include/uv/os390.h +0 -33
- package/node_modules/koffi/vendor/node-api-headers/include/uv/posix.h +0 -31
- package/node_modules/koffi/vendor/node-api-headers/include/uv/sunos.h +0 -44
- package/node_modules/koffi/vendor/node-api-headers/include/uv/threadpool.h +0 -37
- package/node_modules/koffi/vendor/node-api-headers/include/uv/tree.h +0 -521
- package/node_modules/koffi/vendor/node-api-headers/include/uv/unix.h +0 -512
- package/node_modules/koffi/vendor/node-api-headers/include/uv/version.h +0 -43
- package/node_modules/koffi/vendor/node-api-headers/include/uv/win.h +0 -698
- package/node_modules/koffi/vendor/node-api-headers/include/uv.h +0 -1990
|
@@ -1,166 +0,0 @@
|
|
|
1
|
-
# SPDX-License-Identifier: MIT
|
|
2
|
-
# SPDX-FileCopyrightText: 2025 Niels Martignène <niels.martignene@protonmail.com>
|
|
3
|
-
|
|
4
|
-
#define SYMBOL(Symbol) Symbol
|
|
5
|
-
|
|
6
|
-
# Forward
|
|
7
|
-
# ----------------------------
|
|
8
|
-
|
|
9
|
-
.global ForwardCallG
|
|
10
|
-
.global ForwardCallF
|
|
11
|
-
.global ForwardCallD
|
|
12
|
-
.global ForwardCallXG
|
|
13
|
-
.global ForwardCallXF
|
|
14
|
-
.global ForwardCallXD
|
|
15
|
-
|
|
16
|
-
.global SehHandler
|
|
17
|
-
|
|
18
|
-
# Copy function pointer to RAX, in order to save it through argument forwarding.
|
|
19
|
-
# Also make a copy of the SP to CallData::old_sp because the callback system might need it.
|
|
20
|
-
# Save RSP in RBX (non-volatile), and use carefully assembled stack provided by caller.
|
|
21
|
-
.macro prologue
|
|
22
|
-
endbr64
|
|
23
|
-
movq %rcx, %rax
|
|
24
|
-
push %rbp
|
|
25
|
-
movq %rsp, %rbp
|
|
26
|
-
movq %rsp, (%r8)
|
|
27
|
-
movq %rdx, %rsp
|
|
28
|
-
.endm
|
|
29
|
-
|
|
30
|
-
# Prepare integer argument registers from array passed by caller.
|
|
31
|
-
.macro forward_gpr
|
|
32
|
-
movq 24(%rdx), %r9
|
|
33
|
-
movq 16(%rdx), %r8
|
|
34
|
-
movq 0(%rdx), %rcx
|
|
35
|
-
movq 8(%rdx), %rdx
|
|
36
|
-
.endm
|
|
37
|
-
|
|
38
|
-
# Prepare XMM argument registers from array passed by caller.
|
|
39
|
-
.macro forward_xmm
|
|
40
|
-
movsd 24(%rdx), %xmm3
|
|
41
|
-
movsd 16(%rdx), %xmm2
|
|
42
|
-
movsd 8(%rdx), %xmm1
|
|
43
|
-
movsd 0(%rdx), %xmm0
|
|
44
|
-
.endm
|
|
45
|
-
|
|
46
|
-
# CallNative is a minimal wrapper around the native function call.
|
|
47
|
-
# Its frame lives entirely on the custom stack, so its EstablisherFrame passes
|
|
48
|
-
# the TEB stack bounds check. This ensures that SehHandler is found by
|
|
49
|
-
# RtlDispatchException before it tries to cross back to the original stack
|
|
50
|
-
# (through ForwardCall*), which would fail the bounds check and terminate.
|
|
51
|
-
# After the native call returns, CallNative restores the original stack via
|
|
52
|
-
# RBP (non-volatile, preserved by native) and returns directly to the C++ caller.
|
|
53
|
-
CallNative:
|
|
54
|
-
.seh_proc CallNative
|
|
55
|
-
.seh_handler SehHandler, @except
|
|
56
|
-
.seh_endprologue
|
|
57
|
-
call *%rax
|
|
58
|
-
movq %rbp, %rsp
|
|
59
|
-
pop %rbp
|
|
60
|
-
ret
|
|
61
|
-
.seh_endproc
|
|
62
|
-
|
|
63
|
-
ForwardCallG:
|
|
64
|
-
prologue
|
|
65
|
-
forward_gpr
|
|
66
|
-
jmp CallNative
|
|
67
|
-
|
|
68
|
-
ForwardCallF:
|
|
69
|
-
prologue
|
|
70
|
-
forward_gpr
|
|
71
|
-
jmp CallNative
|
|
72
|
-
|
|
73
|
-
ForwardCallD:
|
|
74
|
-
prologue
|
|
75
|
-
forward_gpr
|
|
76
|
-
jmp CallNative
|
|
77
|
-
|
|
78
|
-
ForwardCallXG:
|
|
79
|
-
prologue
|
|
80
|
-
forward_xmm
|
|
81
|
-
forward_gpr
|
|
82
|
-
jmp CallNative
|
|
83
|
-
|
|
84
|
-
ForwardCallXF:
|
|
85
|
-
prologue
|
|
86
|
-
forward_xmm
|
|
87
|
-
forward_gpr
|
|
88
|
-
jmp CallNative
|
|
89
|
-
|
|
90
|
-
ForwardCallXD:
|
|
91
|
-
prologue
|
|
92
|
-
forward_xmm
|
|
93
|
-
forward_gpr
|
|
94
|
-
jmp CallNative
|
|
95
|
-
|
|
96
|
-
# Callbacks
|
|
97
|
-
# ----------------------------
|
|
98
|
-
|
|
99
|
-
.global RelayCallback
|
|
100
|
-
.global SwitchAndRelay
|
|
101
|
-
.global RelayDirect
|
|
102
|
-
.global FindTrampolineStart
|
|
103
|
-
.global FindTrampolineEnd
|
|
104
|
-
|
|
105
|
-
# First, make a copy of argument registers.
|
|
106
|
-
# Then call the C function RelayCallback with the following arguments:
|
|
107
|
-
# static trampoline ID, a pointer to the saved GPR array, a pointer to the stack
|
|
108
|
-
# arguments of this call, and a pointer to a struct that will contain the result registers.
|
|
109
|
-
# After the call, simply load these registers from the output struct.
|
|
110
|
-
.macro trampoline id
|
|
111
|
-
endbr64
|
|
112
|
-
movq $\id, %rax
|
|
113
|
-
jmp RelayTrampoline
|
|
114
|
-
.endm
|
|
115
|
-
|
|
116
|
-
RelayTrampoline:
|
|
117
|
-
endbr64
|
|
118
|
-
subq $120, %rsp
|
|
119
|
-
movq %rcx, 32(%rsp)
|
|
120
|
-
movq %rdx, 40(%rsp)
|
|
121
|
-
movq %r8, 48(%rsp)
|
|
122
|
-
movq %r9, 56(%rsp)
|
|
123
|
-
movsd %xmm0, 64(%rsp)
|
|
124
|
-
movsd %xmm1, 72(%rsp)
|
|
125
|
-
movsd %xmm2, 80(%rsp)
|
|
126
|
-
movsd %xmm3, 88(%rsp)
|
|
127
|
-
movq %rax, %rcx
|
|
128
|
-
leaq 32(%rsp), %rdx
|
|
129
|
-
call RelayCallback
|
|
130
|
-
movq 96(%rsp), %rax
|
|
131
|
-
movsd 104(%rsp), %xmm0
|
|
132
|
-
addq $120, %rsp
|
|
133
|
-
ret
|
|
134
|
-
|
|
135
|
-
# When a callback is relayed, Koffi will call into Node.js and V8 to execute Javascript.
|
|
136
|
-
# The problem is that we're still running on the separate Koffi stack, and V8 will
|
|
137
|
-
# probably misdetect this as a "stack overflow". We have to restore the old
|
|
138
|
-
# stack pointer, call Node.js/V8 and go back to ours.
|
|
139
|
-
# The first three parameters (rcx, rdx, r8) are passed through untouched.
|
|
140
|
-
SwitchAndRelay:
|
|
141
|
-
endbr64
|
|
142
|
-
push %rbp
|
|
143
|
-
movq %rsp, %rbp
|
|
144
|
-
movq %rsp, %r10
|
|
145
|
-
movq 48(%rsp), %r11
|
|
146
|
-
subq 0(%r11), %r10
|
|
147
|
-
andq $-16, %r10
|
|
148
|
-
movq %r10, 8(%r11)
|
|
149
|
-
leaq -32(%r9), %rsp
|
|
150
|
-
call RelayDirect
|
|
151
|
-
movq %rbp, %rsp
|
|
152
|
-
pop %rbp
|
|
153
|
-
ret
|
|
154
|
-
|
|
155
|
-
.balign 16
|
|
156
|
-
FindTrampolineStart:
|
|
157
|
-
leaq 16(%rip), %rax
|
|
158
|
-
andq $0xFFFFFFFFFFFFFFF0, %rax
|
|
159
|
-
ret
|
|
160
|
-
.balign 16
|
|
161
|
-
|
|
162
|
-
#include "gnu.inc"
|
|
163
|
-
|
|
164
|
-
FindTrampolineEnd:
|
|
165
|
-
leaq (%rip), %rax
|
|
166
|
-
ret
|
|
@@ -1,192 +0,0 @@
|
|
|
1
|
-
; SPDX-License-Identifier: MIT
|
|
2
|
-
; SPDX-FileCopyrightText: 2025 Niels Martignène <niels.martignene@protonmail.com>
|
|
3
|
-
|
|
4
|
-
; Forward
|
|
5
|
-
; ----------------------------
|
|
6
|
-
|
|
7
|
-
; These three are the same, but they differ (in the C side) by their return type.
|
|
8
|
-
; Unlike the three next functions, these ones don't forward XMM argument registers.
|
|
9
|
-
public ForwardCallG
|
|
10
|
-
public ForwardCallF
|
|
11
|
-
public ForwardCallD
|
|
12
|
-
|
|
13
|
-
; The X variants are slightly slower, and are used when XMM arguments must be forwarded.
|
|
14
|
-
public ForwardCallXG
|
|
15
|
-
public ForwardCallXF
|
|
16
|
-
public ForwardCallXD
|
|
17
|
-
|
|
18
|
-
extern SehHandler : PROC
|
|
19
|
-
|
|
20
|
-
.code
|
|
21
|
-
|
|
22
|
-
; Copy function pointer to RAX, in order to save it through argument forwarding.
|
|
23
|
-
; Also make a copy of the SP to CallData::old_sp because the callback system might need it.
|
|
24
|
-
; Save RSP in RBX (non-volatile), and use carefully assembled stack provided by caller.
|
|
25
|
-
prologue macro
|
|
26
|
-
endbr64
|
|
27
|
-
mov rax, rcx
|
|
28
|
-
push rbp
|
|
29
|
-
.pushreg rbp
|
|
30
|
-
mov rbp, rsp
|
|
31
|
-
mov qword ptr [r8+0], rsp
|
|
32
|
-
.setframe rbp, 0
|
|
33
|
-
.endprolog
|
|
34
|
-
mov rsp, rdx
|
|
35
|
-
endm
|
|
36
|
-
|
|
37
|
-
; Prepare integer argument registers from array passed by caller.
|
|
38
|
-
forward_gpr macro
|
|
39
|
-
mov r9, qword ptr [rdx+24]
|
|
40
|
-
mov r8, qword ptr [rdx+16]
|
|
41
|
-
mov rcx, qword ptr [rdx+0]
|
|
42
|
-
mov rdx, qword ptr [rdx+8]
|
|
43
|
-
endm
|
|
44
|
-
|
|
45
|
-
; Prepare XMM argument registers from array passed by caller.
|
|
46
|
-
forward_xmm macro
|
|
47
|
-
movsd xmm3, qword ptr [rdx+24]
|
|
48
|
-
movsd xmm2, qword ptr [rdx+16]
|
|
49
|
-
movsd xmm1, qword ptr [rdx+8]
|
|
50
|
-
movsd xmm0, qword ptr [rdx+0]
|
|
51
|
-
endm
|
|
52
|
-
|
|
53
|
-
; CallNative is a minimal wrapper around the native function call.
|
|
54
|
-
; Its frame lives entirely on the custom stack, so its EstablisherFrame passes
|
|
55
|
-
; the TEB stack bounds check. This ensures that SehHandler is found by
|
|
56
|
-
; RtlDispatchException before it tries to cross back to the original stack
|
|
57
|
-
; (through ForwardCall*), which would fail the bounds check and terminate.
|
|
58
|
-
; After the native call returns, CallNative restores the original stack via
|
|
59
|
-
; RBP (non-volatile, preserved by native) and returns directly to the C++ caller.
|
|
60
|
-
CallNative proc frame:SehHandler
|
|
61
|
-
.endprolog
|
|
62
|
-
call rax
|
|
63
|
-
mov rsp, rbp
|
|
64
|
-
pop rbp
|
|
65
|
-
ret
|
|
66
|
-
CallNative endp
|
|
67
|
-
|
|
68
|
-
ForwardCallG proc frame
|
|
69
|
-
prologue
|
|
70
|
-
forward_gpr
|
|
71
|
-
jmp CallNative
|
|
72
|
-
ForwardCallG endp
|
|
73
|
-
|
|
74
|
-
ForwardCallF proc frame
|
|
75
|
-
prologue
|
|
76
|
-
forward_gpr
|
|
77
|
-
jmp CallNative
|
|
78
|
-
ForwardCallF endp
|
|
79
|
-
|
|
80
|
-
ForwardCallD proc frame
|
|
81
|
-
prologue
|
|
82
|
-
forward_gpr
|
|
83
|
-
jmp CallNative
|
|
84
|
-
ForwardCallD endp
|
|
85
|
-
|
|
86
|
-
ForwardCallXG proc frame
|
|
87
|
-
prologue
|
|
88
|
-
forward_xmm
|
|
89
|
-
forward_gpr
|
|
90
|
-
jmp CallNative
|
|
91
|
-
ForwardCallXG endp
|
|
92
|
-
|
|
93
|
-
ForwardCallXF proc frame
|
|
94
|
-
prologue
|
|
95
|
-
forward_xmm
|
|
96
|
-
forward_gpr
|
|
97
|
-
jmp CallNative
|
|
98
|
-
ForwardCallXF endp
|
|
99
|
-
|
|
100
|
-
ForwardCallXD proc frame
|
|
101
|
-
prologue
|
|
102
|
-
forward_xmm
|
|
103
|
-
forward_gpr
|
|
104
|
-
jmp CallNative
|
|
105
|
-
ForwardCallXD endp
|
|
106
|
-
|
|
107
|
-
; Callbacks
|
|
108
|
-
; ----------------------------
|
|
109
|
-
|
|
110
|
-
extern RelayCallback : PROC
|
|
111
|
-
public SwitchAndRelay
|
|
112
|
-
extern RelayDirect : PROC
|
|
113
|
-
public FindTrampolineStart
|
|
114
|
-
public FindTrampolineEnd
|
|
115
|
-
|
|
116
|
-
; First, make a copy of argument registers.
|
|
117
|
-
; Then call the C function RelayCallback with the following arguments:
|
|
118
|
-
; static trampoline ID, a pointer to the saved GPR array, a pointer to the stack
|
|
119
|
-
; arguments of this call, and a pointer to a struct that will contain the result registers.
|
|
120
|
-
; After the call, simply load these registers from the output struct.
|
|
121
|
-
trampoline macro ID
|
|
122
|
-
.endprolog
|
|
123
|
-
endbr64
|
|
124
|
-
mov rax, ID
|
|
125
|
-
jmp RelayTrampoline
|
|
126
|
-
endm
|
|
127
|
-
|
|
128
|
-
RelayTrampoline proc frame
|
|
129
|
-
sub rsp, 120
|
|
130
|
-
.allocstack 120
|
|
131
|
-
.endprolog
|
|
132
|
-
mov qword ptr [rsp+32], rcx
|
|
133
|
-
mov qword ptr [rsp+40], rdx
|
|
134
|
-
mov qword ptr [rsp+48], r8
|
|
135
|
-
mov qword ptr [rsp+56], r9
|
|
136
|
-
movsd qword ptr [rsp+64], xmm0
|
|
137
|
-
movsd qword ptr [rsp+72], xmm1
|
|
138
|
-
movsd qword ptr [rsp+80], xmm2
|
|
139
|
-
movsd qword ptr [rsp+88], xmm3
|
|
140
|
-
mov rcx, rax
|
|
141
|
-
lea rdx, qword ptr [rsp+32]
|
|
142
|
-
call RelayCallback
|
|
143
|
-
mov rax, qword ptr [rsp+96]
|
|
144
|
-
movsd xmm0, qword ptr [rsp+104]
|
|
145
|
-
add rsp, 120
|
|
146
|
-
ret
|
|
147
|
-
RelayTrampoline endp
|
|
148
|
-
|
|
149
|
-
; When a callback is relayed, Koffi will call into Node.js and V8 to execute Javascript.
|
|
150
|
-
; The problem is that we're still running on the separate Koffi stack, and V8 will
|
|
151
|
-
; probably misdetect this as a "stack overflow". We have to restore the old
|
|
152
|
-
; stack pointer, call Node.js/V8 and go back to ours.
|
|
153
|
-
; The first three parameters (rcx, rdx, r8) are passed through untouched.
|
|
154
|
-
SwitchAndRelay proc frame
|
|
155
|
-
endbr64
|
|
156
|
-
push rbp
|
|
157
|
-
.pushreg rbp
|
|
158
|
-
mov rbp, rsp
|
|
159
|
-
.setframe rbp, 0
|
|
160
|
-
.endprolog
|
|
161
|
-
mov r10, rsp
|
|
162
|
-
mov r11, qword ptr [rsp+48]
|
|
163
|
-
sub r10, qword ptr [r11+0]
|
|
164
|
-
and r10, -16
|
|
165
|
-
mov qword ptr [r11+8], r10
|
|
166
|
-
lea rsp, [r9-32]
|
|
167
|
-
call RelayDirect
|
|
168
|
-
mov rsp, rbp
|
|
169
|
-
pop rbp
|
|
170
|
-
ret
|
|
171
|
-
SwitchAndRelay endp
|
|
172
|
-
|
|
173
|
-
align 16
|
|
174
|
-
FindTrampolineStart:
|
|
175
|
-
call GetRIP
|
|
176
|
-
add rax, 16
|
|
177
|
-
and rax, 0FFFFFFFFFFFFFFF0h
|
|
178
|
-
ret
|
|
179
|
-
align 16
|
|
180
|
-
|
|
181
|
-
include masm64.inc
|
|
182
|
-
|
|
183
|
-
FindTrampolineEnd:
|
|
184
|
-
call GetRIP
|
|
185
|
-
ret
|
|
186
|
-
|
|
187
|
-
; I could not f*cking find how to use lea with RIP-relative addressing in MASM64. Oh well.
|
|
188
|
-
GetRIP:
|
|
189
|
-
mov rax, qword ptr [rsp]
|
|
190
|
-
ret
|
|
191
|
-
|
|
192
|
-
end
|