|
[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 08.11.2021 15:42, Juergen Gross wrote:
> On 03.11.21 16:42, Jan Beulich wrote:
>> On 03.11.2021 11:20, Juergen Gross wrote:
>>> +# 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.
>
> Yes and no.
>
> This can either continue with another "if" clause not wanting a new
> line or with a final ending statement (either a "switch" or a
> "ret = -ENOSYS"), which probably would want the new line. Adding
> code for handling both cases is possible, but I'm not sure it is
> worth it. In case you are preferring an unconditional new line,
> this would be easy to arrange, of course.
I'm not going to insist; it merely looked odd to me, and I was
thinking that the alternative would overall look less odd.
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |