1.1 --- a/Makefile Sat Jan 23 00:01:22 2021 +0100
1.2 +++ b/Makefile Sat Jan 23 23:45:31 2021 +0100
1.3 @@ -13,29 +13,45 @@
1.4
1.5 include $(IDL_MK_DIR)/idl.mk
1.6
1.7 +# Compound interfaces.
1.8 +
1.9 +mapped_file_object_NAME = MappedFileObject
1.10 +mapped_file_object_INTERFACES = dataspace mapped_file
1.11 +
1.12 +COMP_INTERFACES_CC = mapped_file_object
1.13 +
1.14 # Individual interfaces.
1.15
1.16 -SERVER_INTERFACES_CC = dataspace
1.17 +CLIENT_INTERFACES_CC = mapped_file
1.18 +
1.19 +SERVER_INTERFACES_CC = $(call common_interfaces,$(COMP_INTERFACES_CC))
1.20
1.21 # Generated and plain source files.
1.22
1.23 -SERVER_INTERFACES_SRC_CC = $(call interfaces_to_server_cc,$(SERVER_INTERFACES_CC))
1.24 +CLIENT_INTERFACES_SRC_CC = $(call interfaces_to_client_cc,$(CLIENT_INTERFACES_CC))
1.25 +
1.26 +SERVER_INTERFACES_SRC_CC = $(call interfaces_to_server_cc,$(SERVER_INTERFACES_CC) $(COMP_INTERFACES_CC))
1.27
1.28 -PLAIN_SRC_CC = \
1.29 +PLAIN_SRC_CC_dstest_client = \
1.30 + dstest_client.cc memory_utils.cc
1.31 +
1.32 +PLAIN_SRC_CC_dstest_server = \
1.33 access_map.cc accessor.cc \
1.34 - dstest_server.cc flexpage.cc ipc.cc \
1.35 - memory.cc memory_map.cc memory_utils.cc \
1.36 + dstest_server.cc flexpage.cc file_pager.cc \
1.37 + ipc.cc memory.cc memory_map.cc memory_utils.cc \
1.38 page_mapper.cc page_queue.cc pager.cc pages.cc \
1.39 region.cc resource.cc simple_pager.cc \
1.40 test_file_accessor.cc
1.41
1.42 # Normal definitions.
1.43
1.44 -SRC_CC_dstest_client = dstest_client.cc
1.45 +SRC_CC_dstest_client = \
1.46 + $(CLIENT_INTERFACES_SRC_CC) \
1.47 + $(PLAIN_SRC_CC_dstest_client)
1.48
1.49 SRC_CC_dstest_server = \
1.50 $(SERVER_INTERFACES_SRC_CC) \
1.51 - $(PLAIN_SRC_CC)
1.52 + $(PLAIN_SRC_CC_dstest_server)
1.53
1.54 REQUIRES_LIBS = l4re_c-util libipc libstdc++
1.55
1.56 @@ -44,4 +60,6 @@
1.57 include $(L4DIR)/mk/prog.mk
1.58 include $(IDL_MK_DIR)/interface_rules.mk
1.59
1.60 -$(PLAIN_SRC_CC): $(SERVER_INTERFACES_SRC_CC)
1.61 +$(PLAIN_SRC_CC_dstest_client): $(CLIENT_INTERFACES_SRC_CC)
1.62 +
1.63 +$(PLAIN_SRC_CC_dstest_server): $(SERVER_INTERFACES_SRC_CC)
2.1 --- a/dstest_client.cc Sat Jan 23 00:01:22 2021 +0100
2.2 +++ b/dstest_client.cc Sat Jan 23 23:45:31 2021 +0100
2.3 @@ -28,17 +28,37 @@
2.4
2.5 #include <ipc/mem_ipc.h>
2.6
2.7 +#include "mapped_file_client.h"
2.8 +#include "memory_utils.h"
2.9 +
2.10
2.11
2.12 int main(void)
2.13 {
2.14 l4_cap_idx_t server = l4re_env_get_cap("server");
2.15
2.16 + client_MappedFile obj(server);
2.17 +
2.18 /* Some memory to be mapped. */
2.19
2.20 + size_t start_pos, end_pos, data_end;
2.21 +
2.22 + printf("Map region from %ld to %ld...\n", 0L, page(10));
2.23 +
2.24 + long err = obj.mmap(0, page(10), &start_pos, &end_pos, &data_end);
2.25 +
2.26 + if (err)
2.27 + {
2.28 + printf("Could not map file region: %s\n", l4sys_errtostr(err));
2.29 + return 1;
2.30 + }
2.31 +
2.32 char *memory;
2.33 - unsigned long size = 40960;
2.34 - long err = ipc_attach_dataspace(server, size, (void **) &memory);
2.35 + unsigned long size = end_pos - start_pos;
2.36 +
2.37 + printf("Attach region of size %ld...\n", size);
2.38 +
2.39 + err = ipc_attach_dataspace(server, size, (void **) &memory);
2.40
2.41 if (err)
2.42 {
2.43 @@ -50,9 +70,11 @@
2.44
2.45 for (unsigned long offset = 0; offset < size; offset += 1024)
2.46 {
2.47 + char buf[11];
2.48 printf("10 bytes from %p...\n", (memory + offset));
2.49 - fwrite((memory + offset), sizeof(char), 10, stdout);
2.50 - fwrite("\n", sizeof(char), 1, stdout);
2.51 + strncpy(buf, (memory + offset), 10);
2.52 + buf[10] = '\0';
2.53 + printf("%s\n", buf);
2.54 }
2.55
2.56 return 0;
3.1 --- a/dstest_server.cc Sat Jan 23 00:01:22 2021 +0100
3.2 +++ b/dstest_server.cc Sat Jan 23 23:45:31 2021 +0100
3.3 @@ -28,14 +28,33 @@
3.4
3.5 #include <ipc/server.h>
3.6
3.7 -#include "dataspace_server.h"
3.8 +#include "mapped_file_object_server.h"
3.9 #include "page_mapper.h"
3.10 -#include "pager.h"
3.11 +#include "file_pager.h"
3.12 #include "pages.h"
3.13 #include "test_file_accessor.h"
3.14
3.15
3.16
3.17 +/* A component exposing the dataspace and mapped file interfaces. */
3.18 +
3.19 +class MappedFileServer : public FilePager, public MappedFileObject
3.20 +{
3.21 +public:
3.22 + explicit MappedFileServer(fileid_t fileid, PageMapper *mapper)
3.23 + : FilePager(fileid, mapper)
3.24 + {
3.25 + }
3.26 +
3.27 + virtual long map(unsigned long offset, l4_addr_t hot_spot, unsigned long flags, l4_snd_fpage_t *region)
3.28 + { return FilePager::map(offset, hot_spot, flags, region); }
3.29 +
3.30 + virtual long mmap(size_t position, size_t length, size_t *start_pos, size_t *end_pos, size_t *data_end)
3.31 + { return FilePager::mmap(position, length, start_pos, end_pos, data_end); }
3.32 +};
3.33 +
3.34 +
3.35 +
3.36 int main(void)
3.37 {
3.38 /* Some memory. */
3.39 @@ -44,9 +63,7 @@
3.40 Pages pages(&mem);
3.41 TestFileAccessor a(123UL);
3.42 PageMapper m(&a, &pages);
3.43 - Pager pager(&m);
3.44 -
3.45 - pager.mmap(0, page(10));
3.46 + MappedFileServer obj(123UL, &m);
3.47
3.48 /* Server capability. */
3.49
3.50 @@ -54,7 +71,7 @@
3.51
3.52 /* Register a server associating it with the given object. */
3.53
3.54 - long err = ipc_server_bind("server", (l4_umword_t) &pager, &server);
3.55 + long err = ipc_server_bind("server", (l4_umword_t) &obj, &server);
3.56
3.57 if (err)
3.58 {
3.59 @@ -64,8 +81,7 @@
3.60
3.61 /* Wait for messages, dispatching to the handler. */
3.62
3.63 - ipc_server_loop(Dataspace_expected_items, &pager,
3.64 - (ipc_server_handler_type) handle_Dataspace);
3.65 + ipc_server_loop_for(MappedFileObject, &obj);
3.66
3.67 return 0;
3.68 }
4.1 --- a/pager.cc Sat Jan 23 00:01:22 2021 +0100
4.2 +++ b/pager.cc Sat Jan 23 23:45:31 2021 +0100
4.3 @@ -15,12 +15,18 @@
4.4 _mapper->detach();
4.5 }
4.6
4.7 -PagerState Pager::mmap(offset_t start, offset_t size)
4.8 +/* Expose a region of the file. */
4.9 +
4.10 +long Pager::mmap(size_t position, size_t length, size_t *start_pos, size_t *end_pos, size_t *data_end)
4.11 {
4.12 - _start = trunc(start, PAGE_SIZE);
4.13 - _size = round(start + size, PAGE_SIZE) - _start;
4.14 + _start = trunc(position, PAGE_SIZE);
4.15 + _size = round(position + length, PAGE_SIZE) - _start;
4.16
4.17 - return PagerState(_start, _size, 0);
4.18 + *start_pos = _start;
4.19 + *end_pos = _start + _size;
4.20 + *data_end = 0;
4.21 +
4.22 + return L4_EOK;
4.23 }
4.24
4.25 /* Map a flexpage corresponding to the dataspace 'offset' involving a 'hot_spot'
5.1 --- a/pager.h Sat Jan 23 00:01:22 2021 +0100
5.2 +++ b/pager.h Sat Jan 23 23:45:31 2021 +0100
5.3 @@ -1,15 +1,13 @@
5.4 #pragma once
5.5
5.6 -#include "dataspace_interface.h"
5.7 #include "page_mapper.h"
5.8 -#include "pager_state.h"
5.9 #include "resource.h"
5.10
5.11
5.12
5.13 /* A pager exposing a dataspace. */
5.14
5.15 -class Pager : public Dataspace, public Resource
5.16 +class Pager : public Resource
5.17 {
5.18 protected:
5.19 offset_t _start, _size;
5.20 @@ -22,13 +20,15 @@
5.21
5.22 /* Paging methods. */
5.23
5.24 - long map(unsigned long offset, l4_addr_t hot_spot, unsigned long flags, l4_snd_fpage_t *region);
5.25 + virtual long map(unsigned long offset, l4_addr_t hot_spot, unsigned long flags, l4_snd_fpage_t *region);
5.26
5.27 /* Limit methods. */
5.28
5.29 offset_t get_data_size();
5.30
5.31 - PagerState mmap(offset_t start, offset_t size);
5.32 + /* Mapped file methods. */
5.33 +
5.34 + virtual long mmap(size_t position, size_t length, size_t *start_pos, size_t *end_pos, size_t *data_end);
5.35 };
5.36
5.37 // vim: tabstop=4 expandtab shiftwidth=4