41 lines
972 B
C
41 lines
972 B
C
|
#pragma once
|
||
|
|
||
|
#include <cstdint>
|
||
|
|
||
|
#include <trampoline/types.h>
|
||
|
|
||
|
// Common
|
||
|
struct Trampoline {
|
||
|
virtual ~Trampoline() = default;
|
||
|
// Error Codes
|
||
|
enum class Error : uint32_t {
|
||
|
NONE = 0,
|
||
|
// Generic
|
||
|
COMMAND_TOO_BIG,
|
||
|
// System Call
|
||
|
SYSCALL,
|
||
|
// Pipe
|
||
|
MISSING_PIPE,
|
||
|
INVALID_PIPE,
|
||
|
PIPE_WRITE,
|
||
|
PIPE_READ
|
||
|
};
|
||
|
// Call
|
||
|
virtual Error call(uint32_t id, uint32_t *ret_ptr, uint32_t length, const unsigned char *args) = 0;
|
||
|
};
|
||
|
|
||
|
// Syscall Method
|
||
|
struct SyscallTrampoline final : Trampoline {
|
||
|
static bool should_use();
|
||
|
Error call(uint32_t id, uint32_t *ret_ptr, uint32_t length, const unsigned char *args) override;
|
||
|
};
|
||
|
|
||
|
// Pipe Method
|
||
|
struct PipeTrampoline final : Trampoline {
|
||
|
PipeTrampoline();
|
||
|
Error call(uint32_t id, uint32_t *ret_ptr, uint32_t length, const unsigned char *args) override;
|
||
|
private:
|
||
|
Error status;
|
||
|
int arguments_pipe;
|
||
|
int return_value_pipe;
|
||
|
};
|