1.1 --- a/libipc/lib/src/message.c Sun Jun 05 18:48:38 2022 +0200
1.2 +++ b/libipc/lib/src/message.c Sun Jun 05 18:49:51 2022 +0200
1.3 @@ -1,7 +1,7 @@
1.4 /*
1.5 * Interprocess communication message abstraction.
1.6 *
1.7 - * Copyright (C) 2018, 2019, 2021 Paul Boddie <paul@boddie.org.uk>
1.8 + * Copyright (C) 2018, 2019, 2021, 2022 Paul Boddie <paul@boddie.org.uk>
1.9 *
1.10 * This program is free software; you can redistribute it and/or
1.11 * modify it under the terms of the GNU General Public License as
1.12 @@ -71,6 +71,7 @@
1.13 /* Set a default for expected items. */
1.14
1.15 msg->expected_items = 0;
1.16 + msg->receive_items = 0;
1.17 ipc_message_reset(msg);
1.18 }
1.19
1.20 @@ -97,8 +98,13 @@
1.21
1.22 msg->bregs.bdr = bregs->bdr;
1.23
1.24 - for (i = 0; i < msg->expected_items; i++)
1.25 - msg->bregs.br[i] = bregs->br[i];
1.26 + /* NOTE: Support a mixture of expected items and received flexpages. */
1.27 +
1.28 + if ((msg->expected_items) || (msg->receive_items))
1.29 + {
1.30 + for (i = 0; (i < msg->expected_items) || (i < msg->receive_items * 2); i++)
1.31 + msg->bregs.br[i] = bregs->br[i];
1.32 + }
1.33 }
1.34
1.35 /* Preserve the message registers. */
1.36 @@ -142,8 +148,13 @@
1.37
1.38 bregs->bdr = msg->bregs.bdr;
1.39
1.40 - for (i = 0; i < msg->expected_items; i++)
1.41 - bregs->br[i] = msg->bregs.br[i];
1.42 + /* NOTE: Support a mixture of expected items and received flexpages. */
1.43 +
1.44 + if ((msg->expected_items) || (msg->receive_items))
1.45 + {
1.46 + for (i = 0; (i < msg->expected_items) || (i < msg->receive_items * 2); i++)
1.47 + bregs->br[i] = msg->bregs.br[i];
1.48 + }
1.49 }
1.50
1.51 /* Restore message registers to communicate recorded data and items. */
1.52 @@ -246,6 +257,13 @@
1.53 ipc_message_export_fpage(msg, msg->items++, fpage);
1.54 }
1.55
1.56 +/* Add a receive window flexpage item to the message. */
1.57 +
1.58 +void ipc_message_add_receive_fpage(ipc_message_t *msg, l4_snd_fpage_t fpage)
1.59 +{
1.60 + ipc_message_receive_fpage(msg, msg->receive_items++, fpage);
1.61 +}
1.62 +
1.63 /* Add a flexpage to the message. */
1.64
1.65 void ipc_message_add_page(ipc_message_t *msg, l4_umword_t hot_spot,
1.66 @@ -433,6 +451,16 @@
1.67 msg->mregs.mr[msg->words + item * 2 + 1] = fpage.raw;
1.68 }
1.69
1.70 +/* Specify a receive window flexpage item in the message. */
1.71 +
1.72 +void ipc_message_receive_fpage(ipc_message_t *msg, int item, l4_snd_fpage_t fpage)
1.73 +{
1.74 + msg->bregs.br[item * 2] = l4_map_control(fpage.snd_base, 0, 0);
1.75 + msg->bregs.br[item * 2 + 1] = fpage.fpage.raw;
1.76 +}
1.77 +
1.78 +
1.79 +
1.80 /* Import from the message the capability at the given item position, updating
1.81 the buffer registers for future capabilities. */
1.82
1.83 @@ -475,3 +503,6 @@
1.84 ipc_message_export_capability(msg, item, ref);
1.85 ipc_message_discard_capability(msg, ref);
1.86 }
1.87 +
1.88 +/* vim: tabstop=2 expandtab shiftwidth=2
1.89 +*/