#ifndef __COMPEL_RPC_H__
#define __COMPEL_RPC_H__
struct ctl_msg {
	uint32_t	cmd;			/* command itself */
	uint32_t	ack;			/* ack on command */
	int32_t		err;			/* error code on reply */
};

#define ctl_msg_cmd(_cmd)		\
	(struct ctl_msg){.cmd = _cmd, }

#define ctl_msg_ack(_cmd, _err)	\
	(struct ctl_msg){.cmd = _cmd, .ack = _cmd, .err = _err, }

/*
 * NOTE: each command's args should be arch-independed sized.
 * If you want to use one of the standard types, declare
 * alternative type for compatible tasks in parasite-compat.h
 */
enum {
	PARASITE_CMD_IDLE		= 0,
	PARASITE_CMD_ACK,

	PARASITE_CMD_INIT_DAEMON,

	/*
	 * This must be greater than INITs.
	 */
	PARASITE_CMD_FINI,

	__PARASITE_END_CMDS,
};

struct parasite_init_args {
	int32_t				h_addr_len;
	struct sockaddr_un		h_addr;
	int32_t				log_level;
	uint64_t			sigreturn_addr;
	uint64_t			sigframe; /* pointer to sigframe */
	futex_t				daemon_connected;
#ifdef ARCH_HAS_LONG_PAGES
	uint32_t			page_size;
#endif
};

struct parasite_unmap_args {
	uint64_t	parasite_start;
	uint64_t	parasite_len;
};
#endif
