|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2.2 07/15] xen: generate hypercall interface related code
On 03.11.2021 11:20, Juergen Gross wrote:
> Instead of repeating similar data multiple times use a single source
> file and a generator script for producing prototypes and call sequences
> of the hypercalls.
>
> As the script already knows the number of parameters used add generating
> a macro for populating an array with the number of parameters per
> hypercall.
>
> Signed-off-by: Juergen Gross <jgross@xxxxxxxx>
What's missing here now that you have introduced priorities is how you
did arrive at the chosen values. That's a pretty important aspect,
especially if someone would later want to adjust these.
Just one further remark from looking at the output of the script (thanks
for making that available):
> +# Generate the output
> +END {
> + # Verbatim generated lines
> + for (i = 1; i <= e; i++)
> + printf("%s\n", emit[i]);
> + printf("\n");
> + # Generate prototypes
> + for (i = 1; i <= n; i++) {
> + for (p = 1; p <= n_pre[i]; p++) {
> + printf("%s %s_%s(", rettype[pre[i, p]], pre[i, p], fn[i]);
> + if (n_args[i] == 0)
> + printf("void");
> + else
> + for (j = 1; j <= n_args[i]; j++) {
> + if (j > 1)
> + printf(", ");
> + if (ptr[i, j])
> + printf("XEN_GUEST_HANDLE_PARAM(%s)", typ[i, j]);
> + else
> + printf("%s", typ[i, j]);
> + printf(" %s", arg[i, j]);
> + }
> + printf(");\n");
> + }
> + }
> + # Generate call sequences and args array contents
> + for (ca in caller) {
> + if (caller[ca] != 1)
> + continue;
> + need_mask = 0;
> + for (pl = 1; pl <= n_prios[ca]; pl++) {
> + for (pll = pl; pll > 1; pll--) {
> + if (prio_list[ca, pl] > p_list[pll - 1])
> + break;
> + else
> + p_list[pll] = p_list[pll - 1];
> + }
> + p_list[pll] = prio_list[ca, pl];
> + # If any prio but the default one has more than 1 entry we need
> "mask"
> + if (p_list[pll] != 100 && prios[ca, p_list[pll]] > 1)
> + need_mask = 1;
> + }
> + printf("\n");
> + printf("#define call_handlers_%s(num, ret, a1, a2, a3, a4, a5)
> \\\n", ca);
> + printf("{ \\\n");
> + if (need_mask)
> + printf(" uint64_t mask = 1ULL << num; \\\n");
> + printf(" ");
> + for (pl = 1; pl <= n_prios[ca]; pl++) {
> + if (prios[ca, p_list[pl]] > 1) {
> + if (pl < n_prios[ca]) {
> + printf("if ( likely(mask & (%s)) ) \\\n", prio_mask[ca,
> p_list[pl]]);
> + printf(" { \\\n");
> + }
> + if (prios[ca, p_list[pl]] == 2) {
> + fnd = 0;
> + for (i = 1; i <= nc; i++)
> + if (call[i] == ca && call_prio[i] == p_list[pl]) {
> + fnd++;
> + if (fnd == 1)
> + printf(" if ( num == __HYPERVISOR_%s
> ) \\\n", fn[call_fn[i]]);
> + else
> + printf(" else \\\n");
> + do_call(call_fn[i], call_p[i]);
> + }
> + } else {
> + do_switch(ca, p_list[pl]);
> + }
> + if (pl < n_prios[ca])
> + printf(" } \\\n");
> + } else {
> + for (i = 1; i <= nc; i++)
> + if (call[i] == ca && call_prio[i] == p_list[pl]) {
> + printf("if ( likely(num == __HYPERVISOR_%s) ) \\\n",
> fn[call_fn[i]]);
> + do_call(call_fn[i], call_p[i]);
> + }
> + }
> + if (pl < n_prios[ca] || prios[ca, p_list[pl]] <= 2)
> + printf(" else ");
I think there's a line continuation escape + newline missing here.
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |