Commit 8ea542f7 authored by Kir Kolyshkin's avatar Kir Kolyshkin Committed by Andrei Vagin

compel: simplify usage wrt ids

Currently, some compel internals are exposed to user API
(both C and CLI), making its usage more complicated than
it can be.

In particular, compel user have to specify a number of parameters
(names for various data) on the command line, and when in C code
assign a struc piegen_opt_t fields using the same names, without
using those identifiers anywhere else in the code.

It makes sense to hide this complexity from a user, which is what
this commit does.

First, remove the ability to specify individual names for data,
instead introducing a prefix that is prepended to all the names.
Second, generate a function %PREFIX%_setup_c_header() which does
all the needed assignments.
Third, convert users (criu/pie and compel test) to the new API.

NOTE that this patch breaks ARM, as compel hgen is not used for ARM.
This is to be fixed by a later patch in the series.
Signed-off-by: 's avatarKir Kolyshkin <kir@openvz.org>
Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
Signed-off-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
parent 2d15cd07
......@@ -12,10 +12,7 @@ typedef struct {
char *input_filename;
char *output_filename;
char *uapi_dir;
char *stream_name;
char *prefix_name;
char *var_name;
char *nrgotpcrel_name;
char *prefix;
FILE *fout;
} piegen_opt_t;
......
......@@ -257,15 +257,15 @@ int __handle_elf(void *mem, size_t size)
sh_src = sec_hdrs[sym->st_shndx];
ptr_func_exit(sh_src);
}
pr_out("#define %s%s 0x%lx\n",
opts.prefix_name, name,
pr_out("#define %s_sym%s 0x%lx\n",
opts.prefix, name,
(unsigned long)(sym->st_value +
(sh_src ? sh_src->sh_addr : 0)));
}
}
}
pr_out("static __maybe_unused compel_reloc_t %s[] = {\n", opts.var_name);
pr_out("static __maybe_unused compel_reloc_t %s_relocs[] = {\n", opts.prefix);
pr_debug("Relocations\n");
pr_debug("------------\n");
......@@ -545,9 +545,9 @@ int __handle_elf(void *mem, size_t size)
}
}
pr_out("};\n");
pr_out("static __maybe_unused size_t %s = %zd;\n", opts.nrgotpcrel_name, nr_gotpcrel);
pr_out("static __maybe_unused size_t %s_nr_gotpcrel = %zd;\n", opts.prefix, nr_gotpcrel);
pr_out("static __maybe_unused const char %s[] = {\n\t", opts.stream_name);
pr_out("static __maybe_unused const char %s_blob[] = {\n\t", opts.prefix);
for (i = 0, k = 0; i < hdr->e_shnum; i++) {
Elf_Shdr *sh = sec_hdrs[i];
......@@ -577,6 +577,31 @@ int __handle_elf(void *mem, size_t size)
}
}
pr_out("};\n");
pr_out("\n");
pr_out("static void __maybe_unused %s_setup_c_header(struct parasite_ctl *ctl)\n",
opts.prefix);
pr_out(
"{\n"
" struct parasite_blob_desc *pbd;\n"
"\n"
" pbd = compel_parasite_blob_desc(ctl);\n"
" pbd->parasite_type = COMPEL_BLOB_CHEADER;\n"
);
pr_out("\tpbd->hdr.mem = %s_blob;\n", opts.prefix);
pr_out("\tpbd->hdr.bsize = sizeof(%s_blob);\n",
opts.prefix);
pr_out("\tpbd->hdr.nr_gotpcrel = %s_nr_gotpcrel;\n", opts.prefix);
pr_out("\tpbd->hdr.parasite_ip_off = "
"COMPEL_H_PARASITE_HEAD(%s_sym);\n", opts.prefix);
pr_out("\tpbd->hdr.addr_cmd_off = "
"COMPEL_H_PARASITE_CMD(%s_sym);\n", opts.prefix);
pr_out("\tpbd->hdr.addr_arg_off = "
"COMPEL_H_PARASITE_ARGS(%s_sym);\n", opts.prefix);
pr_out("\tpbd->hdr.relocs = %s_relocs;\n", opts.prefix);
pr_out("\tpbd->hdr.nr_relocs = "
"sizeof(%s_relocs) / sizeof(%s_relocs[0]);\n",
opts.prefix, opts.prefix);
pr_out("}\n");
ret = 0;
err:
free(sec_hdrs);
......
......@@ -55,10 +55,6 @@ piegen_opt_t opts = {
.input_filename = NULL,
.output_filename = NULL,
.uapi_dir = "piegen/uapi",
.stream_name = "stream",
.prefix_name = "__",
.var_name = "elf_relocs",
.nrgotpcrel_name = "nr_gotpcrel",
.fout = NULL,
};
......@@ -149,16 +145,13 @@ int main(int argc, char *argv[])
int opt, idx, i;
char *action;
static const char short_opts[] = "a:f:o:s:p:v:r:u:hVl:";
static const char short_opts[] = "a:f:o:u:p:hVl:";
static struct option long_opts[] = {
{ "arch", required_argument, 0, 'a' },
{ "file", required_argument, 0, 'f' },
{ "output", required_argument, 0, 'o' },
{ "stream", required_argument, 0, 's' },
{ "uapi-dir", required_argument, 0, 'u' },
{ "sym-prefix", required_argument, 0, 'p' },
{ "variable", required_argument, 0, 'v' },
{ "pcrelocs", required_argument, 0, 'r' },
{ "prefix", required_argument, 0, 'p' },
{ "help", no_argument, 0, 'h' },
{ "version", no_argument, 0, 'V' },
{ "log-level", required_argument, 0, 'l' },
......@@ -193,17 +186,8 @@ int main(int argc, char *argv[])
case 'u':
opts.uapi_dir = optarg;
break;
case 's':
opts.stream_name = optarg;
break;
case 'p':
opts.prefix_name = optarg;
break;
case 'v':
opts.var_name = optarg;
break;
case 'r':
opts.nrgotpcrel_name = optarg;
opts.prefix = optarg;
break;
case 'l':
log_level = atoi(optarg);
......
......@@ -27,10 +27,7 @@ spy: spy.c parasite.h $(COMPEL_LIBRARY)
parasite.h: parasite.po
$(COMPEL) hgen -f $^ -l 4 \
-v parasite_relocs \
-p parasite_sym \
-s parasite_blob \
-r parasite_nr_gotpcrel \
-p parasite \
-u $(COMPEL_IDIR) \
-o $@
......
......@@ -48,21 +48,7 @@ static int do_infection(int pid)
ictx = compel_infect_ctx(ctl);
ictx->log_fd = STDERR_FILENO;
/*
* Next the blob descriptor. We've requested for hgen
* in Makefile, so prepare this type of blob with the
* values from parasite.h.
*/
pbd = compel_parasite_blob_desc(ctl);
pbd->parasite_type = COMPEL_BLOB_CHEADER;
pbd->hdr.mem = parasite_blob;
pbd->hdr.bsize = sizeof(parasite_blob);
pbd->hdr.nr_gotpcrel = parasite_nr_gotpcrel;
pbd->hdr.parasite_ip_off = COMPEL_H_PARASITE_HEAD(parasite_sym);
pbd->hdr.addr_cmd_off = COMPEL_H_PARASITE_CMD(parasite_sym);
pbd->hdr.addr_arg_off = COMPEL_H_PARASITE_ARGS(parasite_sym);
pbd->hdr.relocs = parasite_relocs;
pbd->hdr.nr_relocs = sizeof(parasite_relocs) / sizeof(parasite_relocs[0]);
parasite_setup_c_header(ctl);
printf("Infecting\n");
if (compel_infect(ctl, 1, sizeof(int)))
......
......@@ -225,8 +225,7 @@ enum {
})
/* the restorer_blob_offset__ prefix is added by gen_offsets.sh */
#define __blob_offset(name) restorer_blob_offset__ ## name
#define restorer_sym(rblob, name) (void*)(rblob + __blob_offset(name))
#define __r_sym(name) restorer_sym ## name
#define restorer_sym(rblob, name) (void*)(rblob + __r_sym(name))
#endif /* __CR_RESTORER_H__ */
......@@ -532,37 +532,11 @@ static int make_sigframe(void *arg, struct rt_sigframe *sf, struct rt_sigframe *
return construct_sigframe(sf, rtsf, bs, (CoreEntry *)arg);
}
/* the parasite prefix is added by gen_offsets.sh */
#define pblob_offset(ptype, symbol) \
parasite_ ## ptype ## _blob_offset__ ## symbol
#ifdef CONFIG_PIEGEN
#define init_blob_relocs(bdesc, blob_type) \
do { \
bdesc->hdr.relocs = parasite_##blob_type##_relocs; \
bdesc->hdr.nr_relocs = ARRAY_SIZE(parasite_##blob_type##_relocs); \
} while (0)
#else
#define init_blob_relocs(bdesc, blob_type)
#endif
#define init_blob_desc(bdesc, blob_type) do { \
bdesc->hdr.mem = parasite_##blob_type##_blob; \
bdesc->hdr.bsize = sizeof(parasite_##blob_type##_blob); \
bdesc->hdr.nr_gotpcrel = pie_nr_gotpcrel(parasite_##blob_type); \
/* Setup the rest of a control block */ \
bdesc->hdr.parasite_ip_off = pblob_offset(blob_type, __export_parasite_head_start);\
bdesc->hdr.addr_cmd_off = pblob_offset(blob_type, __export_parasite_cmd); \
bdesc->hdr.addr_arg_off = pblob_offset(blob_type, __export_parasite_args); \
init_blob_relocs(bdesc, blob_type); \
} while (0)
struct parasite_ctl *parasite_infect_seized(pid_t pid, struct pstree_item *item,
struct vm_area_list *vma_area_list)
{
struct parasite_ctl *ctl;
struct infect_ctx *ictx;
struct parasite_blob_desc *pbd;
unsigned long p;
BUG_ON(item->threads[0].real != pid);
......@@ -604,14 +578,11 @@ struct parasite_ctl *parasite_infect_seized(pid_t pid, struct pstree_item *item,
ictx->log_fd = log_get_fd();
pbd = compel_parasite_blob_desc(ctl);
pbd->parasite_type = COMPEL_BLOB_CHEADER;
if (compel_mode_native(ctl))
init_blob_desc(pbd, native);
parasite_native_setup_c_header(ctl);
#ifdef CONFIG_COMPAT
else
init_blob_desc(pbd, compat);
parasite_compat_setup_c_header(ctl);
#endif
parasite_ensure_args_size(dump_pages_args_size(vma_area_list));
......
......@@ -126,10 +126,7 @@ $(obj)/%-blob.h: $(obj)/%.built-in.bin.o $(SRC_DIR)/compel/compel-host
$(call msg-gen, $@)
$(Q) $(SRC_DIR)/compel/compel-host hgen -f $< \
-l 4 \
-v $(call target-name,$@)_relocs \
-p $(call target-name,$@)_blob_offset__ \
-s $(call target-name,$@)_blob \
-r $(call target-name,$@)_nr_gotpcrel \
-p $(call target-name,$@) \
-u $(SRC_DIR)/compel/include/uapi \
-o $@ $(piegen_stdout)
......
......@@ -13,12 +13,12 @@ CROSS_COMPILE=
fi
INC_GUARD=__${NAME}_h__
PREFIX=${NAME}_blob_offset__
SYM=${NAME}_sym
BLOB=${NAME}_blob
OBJNAME=${FILE}.built-in.bin.o
BINARY=${FILE}.built-in.bin
AWK_CMD='$2 ~ /^[tTA]$/ { print "#define '$PREFIX'" $3 " 0x" $1; }'
AWK_CMD='$2 ~ /^[tTA]$/ { print "#define '$SYM'" $3 " 0x" $1; }'
cat << EOF
/* Autogenerated by $0, do not edit */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment