Files
hunterino-sec e25b2e2a78 Initial commit!
2026-07-19 04:43:07 -04:00

60 lines
1.4 KiB
C++

#pragma once
typedef unsigned long long uintptr_t;
typedef unsigned long long uint64_t;
// Inline wrappers for Janus ECALLs from payload code.
// These must stay header-only so the payload has no external deps.
static inline void* janus_get_peb() {
void* r;
asm volatile (
"li a7, 0\n"
"ecall\n"
"mv %0, a0\n"
: "=r"(r) :: "a7", "a0", "memory"
);
return r;
}
// fn: function pointer obtained via janus_resolve
// args: array of uintptr_t on the stack, argc: element count
static inline uintptr_t janus_host_call(void* fn, uintptr_t* args, int argc) {
uintptr_t r;
asm volatile (
"li a7, 1\n"
"mv a0, %1\n"
"mv a1, %2\n"
"mv a2, %3\n"
"ecall\n"
"mv %0, a0\n"
: "=r"(r)
: "r"(fn), "r"(args), "r"((uintptr_t)argc)
: "a7", "a0", "a1", "a2", "memory"
);
return r;
}
static inline void* janus_resolve(const char* mod, const char* sym) {
void* r;
asm volatile (
"li a7, 2\n"
"mv a0, %1\n"
"mv a1, %2\n"
"ecall\n"
"mv %0, a0\n"
: "=r"(r)
: "r"(mod), "r"(sym)
: "a7", "a0", "a1", "memory"
);
return r;
}
static inline void janus_exit(int code) {
asm volatile (
"li a7, 3\n"
"mv a0, %0\n"
"ecall\n"
:: "r"((uintptr_t)code) : "a7", "a0", "memory"
);
}