# HG changeset patch # User Paul Boddie # Date 1654447791 -7200 # Node ID a34ea5ec49f32814c36c93368462fb38304204cc # Parent 7ac27a50d236e0c47ae350c0a9c511bba34eba4d Introduced some support for specifying receive window flexpages. diff -r 7ac27a50d236 -r a34ea5ec49f3 libipc/include/ipc/message.h --- a/libipc/include/ipc/message.h Sun Jun 05 18:48:38 2022 +0200 +++ b/libipc/include/ipc/message.h Sun Jun 05 18:49:51 2022 +0200 @@ -1,7 +1,7 @@ /* * Interprocess communication message abstraction. * - * Copyright (C) 2018, 2019, 2021 Paul Boddie + * Copyright (C) 2018, 2019, 2021, 2022 Paul Boddie * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as @@ -46,6 +46,10 @@ l4_msgtag_t tag; unsigned int expected_items; + /* Receive item counter. */ + + unsigned int receive_items; + /* Output details. */ unsigned int words; @@ -109,6 +113,7 @@ void ipc_message_add_item(ipc_message_t *msg, l4_cap_idx_t cap); void ipc_message_add_fpage(ipc_message_t *msg, l4_snd_fpage_t fpage); void ipc_message_add_page(ipc_message_t *msg, l4_umword_t hot_spot, l4_fpage_t fpage); +void ipc_message_add_receive_fpage(ipc_message_t *msg, l4_snd_fpage_t fpage); void ipc_message_add_string(ipc_message_t *msg, const char *value); void ipc_message_add_word(ipc_message_t *msg, l4_umword_t value); void ipc_message_propagate_item(ipc_message_t *msg, l4_cap_idx_t cap); @@ -136,6 +141,7 @@ long ipc_message_import_dataspace(ipc_message_t *msg, int item, l4re_ds_t *mem, l4_addr_t *addr); long ipc_message_import_fpage(ipc_message_t *msg, int item, l4_snd_fpage_t *fpage); void ipc_message_propagate_capability(ipc_message_t *msg, int item, l4_cap_idx_t ref); +void ipc_message_receive_fpage(ipc_message_t *msg, int item, l4_snd_fpage_t fpage); l4_msgtag_t ipc_message_reply_tag(ipc_message_t *msg); l4_msgtag_t ipc_message_request_tag(ipc_message_t *msg, int op); diff -r 7ac27a50d236 -r a34ea5ec49f3 libipc/lib/src/message.c --- a/libipc/lib/src/message.c Sun Jun 05 18:48:38 2022 +0200 +++ b/libipc/lib/src/message.c Sun Jun 05 18:49:51 2022 +0200 @@ -1,7 +1,7 @@ /* * Interprocess communication message abstraction. * - * Copyright (C) 2018, 2019, 2021 Paul Boddie + * Copyright (C) 2018, 2019, 2021, 2022 Paul Boddie * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as @@ -71,6 +71,7 @@ /* Set a default for expected items. */ msg->expected_items = 0; + msg->receive_items = 0; ipc_message_reset(msg); } @@ -97,8 +98,13 @@ msg->bregs.bdr = bregs->bdr; - for (i = 0; i < msg->expected_items; i++) - msg->bregs.br[i] = bregs->br[i]; + /* NOTE: Support a mixture of expected items and received flexpages. */ + + if ((msg->expected_items) || (msg->receive_items)) + { + for (i = 0; (i < msg->expected_items) || (i < msg->receive_items * 2); i++) + msg->bregs.br[i] = bregs->br[i]; + } } /* Preserve the message registers. */ @@ -142,8 +148,13 @@ bregs->bdr = msg->bregs.bdr; - for (i = 0; i < msg->expected_items; i++) - bregs->br[i] = msg->bregs.br[i]; + /* NOTE: Support a mixture of expected items and received flexpages. */ + + if ((msg->expected_items) || (msg->receive_items)) + { + for (i = 0; (i < msg->expected_items) || (i < msg->receive_items * 2); i++) + bregs->br[i] = msg->bregs.br[i]; + } } /* Restore message registers to communicate recorded data and items. */ @@ -246,6 +257,13 @@ ipc_message_export_fpage(msg, msg->items++, fpage); } +/* Add a receive window flexpage item to the message. */ + +void ipc_message_add_receive_fpage(ipc_message_t *msg, l4_snd_fpage_t fpage) +{ + ipc_message_receive_fpage(msg, msg->receive_items++, fpage); +} + /* Add a flexpage to the message. */ void ipc_message_add_page(ipc_message_t *msg, l4_umword_t hot_spot, @@ -433,6 +451,16 @@ msg->mregs.mr[msg->words + item * 2 + 1] = fpage.raw; } +/* Specify a receive window flexpage item in the message. */ + +void ipc_message_receive_fpage(ipc_message_t *msg, int item, l4_snd_fpage_t fpage) +{ + msg->bregs.br[item * 2] = l4_map_control(fpage.snd_base, 0, 0); + msg->bregs.br[item * 2 + 1] = fpage.fpage.raw; +} + + + /* Import from the message the capability at the given item position, updating the buffer registers for future capabilities. */ @@ -475,3 +503,6 @@ ipc_message_export_capability(msg, item, ref); ipc_message_discard_capability(msg, ref); } + +/* vim: tabstop=2 expandtab shiftwidth=2 +*/ diff -r 7ac27a50d236 -r a34ea5ec49f3 libipc/lib/src/util_ipc.c --- a/libipc/lib/src/util_ipc.c Sun Jun 05 18:48:38 2022 +0200 +++ b/libipc/lib/src/util_ipc.c Sun Jun 05 18:49:51 2022 +0200 @@ -30,7 +30,9 @@ -/* Declare expected capabilities. */ +/* Declare expected capabilities. + NOTE: This does not support the mixing of expected capabilities and other + items. */ long _expect_capabilities(l4_buf_regs_t *bregs, int number) { @@ -233,3 +235,6 @@ { return l4_ipc_send(endpoint, l4_utcb(), tag, L4_IPC_NEVER); } + +/* vim: tabstop=2 expandtab shiftwidth=2 +*/