2016-09-28 10:47:17 +03:00
|
|
|
#ifndef __COMPEL_INFECT_PRIV_H__
|
|
|
|
#define __COMPEL_INFECT_PRIV_H__
|
|
|
|
|
|
|
|
#include <stdbool.h>
|
|
|
|
|
2021-07-19 07:39:51 +00:00
|
|
|
#define BUILTIN_SYSCALL_SIZE 8
|
2016-10-27 12:10:30 +03:00
|
|
|
|
2016-11-14 16:05:36 +03:00
|
|
|
struct thread_ctx {
|
2021-07-19 07:39:51 +00:00
|
|
|
k_rtsigset_t sigmask;
|
|
|
|
user_regs_struct_t regs;
|
2020-11-12 03:10:52 +00:00
|
|
|
#ifdef ARCH_HAS_PTRACE_GET_THREAD_AREA
|
2021-07-19 07:39:51 +00:00
|
|
|
tls_t tls;
|
2020-11-12 03:10:52 +00:00
|
|
|
#endif
|
2021-07-19 07:39:51 +00:00
|
|
|
user_fpregs_struct_t ext_regs;
|
2016-11-14 16:05:36 +03:00
|
|
|
};
|
|
|
|
|
2016-09-28 10:47:17 +03:00
|
|
|
/* parasite control block */
|
|
|
|
struct parasite_ctl {
|
2021-07-19 07:39:51 +00:00
|
|
|
int rpid; /* Real pid of the victim */
|
|
|
|
void *remote_map;
|
|
|
|
void *local_map;
|
|
|
|
void *sigreturn_addr; /* A place for the breakpoint */
|
|
|
|
unsigned long map_length;
|
2016-09-28 10:47:17 +03:00
|
|
|
|
2021-07-19 07:39:51 +00:00
|
|
|
struct infect_ctx ictx;
|
2016-09-28 10:47:17 +03:00
|
|
|
|
|
|
|
/* thread leader data */
|
2021-07-19 07:39:51 +00:00
|
|
|
bool daemonized;
|
2016-09-28 10:47:17 +03:00
|
|
|
|
2021-07-19 07:39:51 +00:00
|
|
|
struct thread_ctx orig;
|
2016-09-28 10:47:17 +03:00
|
|
|
|
2021-07-19 07:39:51 +00:00
|
|
|
void *rstack; /* thread leader stack*/
|
|
|
|
struct rt_sigframe *sigframe;
|
|
|
|
struct rt_sigframe *rsigframe; /* address in a parasite */
|
2016-09-28 10:47:17 +03:00
|
|
|
|
2021-07-19 07:39:51 +00:00
|
|
|
void *r_thread_stack; /* stack for non-leader threads */
|
2016-09-28 10:47:17 +03:00
|
|
|
|
2021-07-19 07:39:51 +00:00
|
|
|
unsigned long parasite_ip; /* service routine start ip */
|
2016-09-28 10:47:17 +03:00
|
|
|
|
2021-07-19 07:39:51 +00:00
|
|
|
unsigned int *cmd; /* address for command */
|
|
|
|
void *args; /* address for arguments */
|
|
|
|
unsigned long args_size;
|
|
|
|
int tsock; /* transport socket for transferring fds */
|
2016-11-04 00:30:00 +03:00
|
|
|
|
|
|
|
struct parasite_blob_desc pblob;
|
2016-09-28 10:47:17 +03:00
|
|
|
};
|
|
|
|
|
2016-11-14 16:05:36 +03:00
|
|
|
struct parasite_thread_ctl {
|
2021-07-19 07:39:51 +00:00
|
|
|
int tid;
|
|
|
|
struct parasite_ctl *ctl;
|
|
|
|
struct thread_ctx th;
|
2016-11-14 16:05:36 +03:00
|
|
|
};
|
|
|
|
|
2021-07-19 07:39:51 +00:00
|
|
|
#define MEMFD_FNAME "CRIUMFD"
|
|
|
|
#define MEMFD_FNAME_SZ sizeof(MEMFD_FNAME)
|
2016-09-29 16:22:19 +03:00
|
|
|
|
2016-09-30 14:34:50 +03:00
|
|
|
struct ctl_msg;
|
|
|
|
int parasite_wait_ack(int sockfd, unsigned int cmd, struct ctl_msg *m);
|
|
|
|
|
2016-10-27 12:10:30 +03:00
|
|
|
extern void parasite_setup_regs(unsigned long new_ip, void *stack, user_regs_struct_t *regs);
|
2021-07-19 07:39:51 +00:00
|
|
|
extern void *remote_mmap(struct parasite_ctl *ctl, void *addr, size_t length, int prot, int flags, int fd,
|
|
|
|
off_t offset);
|
2016-10-27 12:10:30 +03:00
|
|
|
extern bool arch_can_dump_task(struct parasite_ctl *ctl);
|
2021-02-26 01:08:00 +00:00
|
|
|
/*
|
|
|
|
* @regs: general purpose registers
|
|
|
|
* @ext_regs: extended register set (fpu/mmx/sse/etc)
|
|
|
|
* for task that is NULL, restored by sigframe on rt_sigreturn()
|
|
|
|
* @save: callback to dump all info
|
|
|
|
* @flags: see INFECT_* in infect_ctx::flags
|
|
|
|
* @pid: mystery
|
|
|
|
*/
|
2021-07-19 07:39:51 +00:00
|
|
|
extern int compel_get_task_regs(pid_t pid, user_regs_struct_t *regs, user_fpregs_struct_t *ext_regs, save_regs_t save,
|
|
|
|
void *arg, unsigned long flags);
|
2021-02-26 02:25:57 +00:00
|
|
|
extern int compel_set_task_ext_regs(pid_t pid, user_fpregs_struct_t *ext_regs);
|
2017-02-20 11:33:42 +03:00
|
|
|
extern int arch_fetch_sas(struct parasite_ctl *ctl, struct rt_sigframe *s);
|
2021-07-19 07:39:51 +00:00
|
|
|
extern int sigreturn_prep_regs_plain(struct rt_sigframe *sigframe, user_regs_struct_t *regs,
|
2016-11-21 21:26:18 +03:00
|
|
|
user_fpregs_struct_t *fpregs);
|
2021-07-19 07:39:51 +00:00
|
|
|
extern int sigreturn_prep_fpu_frame_plain(struct rt_sigframe *sigframe, struct rt_sigframe *rsigframe);
|
|
|
|
extern int compel_execute_syscall(struct parasite_ctl *ctl, user_regs_struct_t *regs, const char *code_syscall);
|
2016-09-28 10:47:17 +03:00
|
|
|
#endif
|