1.1 --- a/libipc/include/ipc/message.h Sun Jun 05 18:48:38 2022 +0200
1.2 +++ b/libipc/include/ipc/message.h 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 @@ -46,6 +46,10 @@
1.13 l4_msgtag_t tag;
1.14 unsigned int expected_items;
1.15
1.16 + /* Receive item counter. */
1.17 +
1.18 + unsigned int receive_items;
1.19 +
1.20 /* Output details. */
1.21
1.22 unsigned int words;
1.23 @@ -109,6 +113,7 @@
1.24 void ipc_message_add_item(ipc_message_t *msg, l4_cap_idx_t cap);
1.25 void ipc_message_add_fpage(ipc_message_t *msg, l4_snd_fpage_t fpage);
1.26 void ipc_message_add_page(ipc_message_t *msg, l4_umword_t hot_spot, l4_fpage_t fpage);
1.27 +void ipc_message_add_receive_fpage(ipc_message_t *msg, l4_snd_fpage_t fpage);
1.28 void ipc_message_add_string(ipc_message_t *msg, const char *value);
1.29 void ipc_message_add_word(ipc_message_t *msg, l4_umword_t value);
1.30 void ipc_message_propagate_item(ipc_message_t *msg, l4_cap_idx_t cap);
1.31 @@ -136,6 +141,7 @@
1.32 long ipc_message_import_dataspace(ipc_message_t *msg, int item, l4re_ds_t *mem, l4_addr_t *addr);
1.33 long ipc_message_import_fpage(ipc_message_t *msg, int item, l4_snd_fpage_t *fpage);
1.34 void ipc_message_propagate_capability(ipc_message_t *msg, int item, l4_cap_idx_t ref);
1.35 +void ipc_message_receive_fpage(ipc_message_t *msg, int item, l4_snd_fpage_t fpage);
1.36 l4_msgtag_t ipc_message_reply_tag(ipc_message_t *msg);
1.37 l4_msgtag_t ipc_message_request_tag(ipc_message_t *msg, int op);
1.38
2.1 --- a/libipc/lib/src/message.c Sun Jun 05 18:48:38 2022 +0200
2.2 +++ b/libipc/lib/src/message.c Sun Jun 05 18:49:51 2022 +0200
2.3 @@ -1,7 +1,7 @@
2.4 /*
2.5 * Interprocess communication message abstraction.
2.6 *
2.7 - * Copyright (C) 2018, 2019, 2021 Paul Boddie <paul@boddie.org.uk>
2.8 + * Copyright (C) 2018, 2019, 2021, 2022 Paul Boddie <paul@boddie.org.uk>
2.9 *
2.10 * This program is free software; you can redistribute it and/or
2.11 * modify it under the terms of the GNU General Public License as
2.12 @@ -71,6 +71,7 @@
2.13 /* Set a default for expected items. */
2.14
2.15 msg->expected_items = 0;
2.16 + msg->receive_items = 0;
2.17 ipc_message_reset(msg);
2.18 }
2.19
2.20 @@ -97,8 +98,13 @@
2.21
2.22 msg->bregs.bdr = bregs->bdr;
2.23
2.24 - for (i = 0; i < msg->expected_items; i++)
2.25 - msg->bregs.br[i] = bregs->br[i];
2.26 + /* NOTE: Support a mixture of expected items and received flexpages. */
2.27 +
2.28 + if ((msg->expected_items) || (msg->receive_items))
2.29 + {
2.30 + for (i = 0; (i < msg->expected_items) || (i < msg->receive_items * 2); i++)
2.31 + msg->bregs.br[i] = bregs->br[i];
2.32 + }
2.33 }
2.34
2.35 /* Preserve the message registers. */
2.36 @@ -142,8 +148,13 @@
2.37
2.38 bregs->bdr = msg->bregs.bdr;
2.39
2.40 - for (i = 0; i < msg->expected_items; i++)
2.41 - bregs->br[i] = msg->bregs.br[i];
2.42 + /* NOTE: Support a mixture of expected items and received flexpages. */
2.43 +
2.44 + if ((msg->expected_items) || (msg->receive_items))
2.45 + {
2.46 + for (i = 0; (i < msg->expected_items) || (i < msg->receive_items * 2); i++)
2.47 + bregs->br[i] = msg->bregs.br[i];
2.48 + }
2.49 }
2.50
2.51 /* Restore message registers to communicate recorded data and items. */
2.52 @@ -246,6 +257,13 @@
2.53 ipc_message_export_fpage(msg, msg->items++, fpage);
2.54 }
2.55
2.56 +/* Add a receive window flexpage item to the message. */
2.57 +
2.58 +void ipc_message_add_receive_fpage(ipc_message_t *msg, l4_snd_fpage_t fpage)
2.59 +{
2.60 + ipc_message_receive_fpage(msg, msg->receive_items++, fpage);
2.61 +}
2.62 +
2.63 /* Add a flexpage to the message. */
2.64
2.65 void ipc_message_add_page(ipc_message_t *msg, l4_umword_t hot_spot,
2.66 @@ -433,6 +451,16 @@
2.67 msg->mregs.mr[msg->words + item * 2 + 1] = fpage.raw;
2.68 }
2.69
2.70 +/* Specify a receive window flexpage item in the message. */
2.71 +
2.72 +void ipc_message_receive_fpage(ipc_message_t *msg, int item, l4_snd_fpage_t fpage)
2.73 +{
2.74 + msg->bregs.br[item * 2] = l4_map_control(fpage.snd_base, 0, 0);
2.75 + msg->bregs.br[item * 2 + 1] = fpage.fpage.raw;
2.76 +}
2.77 +
2.78 +
2.79 +
2.80 /* Import from the message the capability at the given item position, updating
2.81 the buffer registers for future capabilities. */
2.82
2.83 @@ -475,3 +503,6 @@
2.84 ipc_message_export_capability(msg, item, ref);
2.85 ipc_message_discard_capability(msg, ref);
2.86 }
2.87 +
2.88 +/* vim: tabstop=2 expandtab shiftwidth=2
2.89 +*/
3.1 --- a/libipc/lib/src/util_ipc.c Sun Jun 05 18:48:38 2022 +0200
3.2 +++ b/libipc/lib/src/util_ipc.c Sun Jun 05 18:49:51 2022 +0200
3.3 @@ -30,7 +30,9 @@
3.4
3.5
3.6
3.7 -/* Declare expected capabilities. */
3.8 +/* Declare expected capabilities.
3.9 + NOTE: This does not support the mixing of expected capabilities and other
3.10 + items. */
3.11
3.12 long _expect_capabilities(l4_buf_regs_t *bregs, int number)
3.13 {
3.14 @@ -233,3 +235,6 @@
3.15 {
3.16 return l4_ipc_send(endpoint, l4_utcb(), tag, L4_IPC_NEVER);
3.17 }
3.18 +
3.19 +/* vim: tabstop=2 expandtab shiftwidth=2
3.20 +*/