rizin/librz/include/rz_syscall.h
2025-11-04 23:38:16 +08:00

97 lines
2.4 KiB
C

// SPDX-FileCopyrightText: 2009-2021 pancake <pancake@nopcode.org>
// SPDX-License-Identifier: LGPL-3.0-only
#ifndef RZ_SYSCALL_H
#define RZ_SYSCALL_H
#ifdef __cplusplus
extern "C" {
#endif
#include <rz_types.h>
#include <rz_util.h>
#include <sdb.h>
RZ_LIB_VERSION_HEADER(rz_syscall);
#define RZ_SYSCALL_ARGS 7
typedef struct rz_syscall_item_t {
char *name;
int swi;
int num;
int args;
char *sargs;
} RzSyscallItem;
typedef struct rz_sysreg_item_t {
char *type;
char *name;
char *comment;
} RzSysregItem;
typedef struct rz_sysreg_db_t {
HtUP /*<ut64 , RzSysregItem>*/ *port;
} RzSysregsDB;
typedef struct rz_syscall_t {
FILE *fd;
// memoization
char *arch;
char *os;
int bits;
char *cpu;
// database
RzSyscallItem *sysptr;
Sdb *db;
RzSysregsDB *srdb;
int refs;
} RzSyscall;
#if 0
// todo: add the ability to describe particular bits
typedef struct rz_sysregs_item_t {
ut64 address;
ut64 size;
int type;
const char *name;
const char *description;
} RSysregsItem;
typedef struct rz_sysregs_t {
FILE *fd;
char *arch;
char *cpu;
RSysregsItem *sysregs;
Sdb *db;
} RSysregs;
#endif
#ifdef RZ_API
RZ_API RzSyscallItem *rz_syscall_item_new_from_string(const char *name, const char *s);
RZ_API void rz_syscall_item_free(RzSyscallItem *si);
RZ_API RzSyscall *rz_syscall_new(void);
RZ_API void rz_sysregs_db_free(RzSysregsDB *sysregdb);
RZ_API void rz_syscall_free(RzSyscall *ctx);
RZ_API RzSyscall *rz_syscall_ref(RzSyscall *sc);
RZ_API bool rz_syscall_setup(RzSyscall *s, RZ_BORROW RZ_NONNULL RzPath *sys_path, const char *arch, int bits, const char *cpu, const char *os);
RZ_API RzSyscallItem *rz_syscall_get(RzSyscall *ctx, int num, int swi);
RZ_API bool rz_syscall_get_num(RZ_NONNULL RZ_BORROW RzSyscall *s, RZ_NONNULL const char *str, RZ_OUT RZ_NULLABLE int *num);
RZ_API const char *rz_syscall_get_i(RzSyscall *ctx, int num, int swi);
RZ_API RzList /*<RzSyscallItem *>*/ *rz_syscall_list(RzSyscall *ctx);
RZ_API int rz_syscall_get_swi(RzSyscall *s);
RZ_API const char *rz_sysreg_get(RzSyscall *s, const char *type, ut64 num);
RZ_API bool rz_sysreg_set_arch(RzSyscall *s, RZ_NONNULL const char *arch, RZ_NONNULL const char *regs_dir);
RZ_API bool rz_sysreg_load_sdb(RzSysregsDB *sysregdb, const char *path);
RZ_API RzSysregsDB *rz_sysregs_db_new();
RZ_API RZ_OWN RzSysregItem *rz_sysreg_item_new(RZ_NULLABLE const char *name);
RZ_API void rz_sysreg_item_free(RzSysregItem *sysregitem);
#endif
#ifdef __cplusplus
}
#endif
#endif