1.1 --- a/libfsclient/include/fsclient/client.h Fri May 20 00:40:27 2022 +0200 1.2 +++ b/libfsclient/include/fsclient/client.h Fri May 20 22:54:36 2022 +0200 1.3 @@ -64,7 +64,8 @@ 1.4 /* File and region operations. */ 1.5 1.6 long client_flush(file_t *file); 1.7 -void *client_mmap(file_t *file, offset_t position, offset_t length, l4re_rm_flags_t region_flags); 1.8 +void *client_mmap(file_t *file, offset_t position, offset_t length, int masked, 1.9 + l4re_rm_flags_t region_flags); 1.10 l4re_rm_flags_t client_region_flags(prot_t prot, flags_t flags); 1.11 1.12 /* Pipe region operations. */
2.1 --- a/libfsclient/include/fsclient/file.h Fri May 20 00:40:27 2022 +0200 2.2 +++ b/libfsclient/include/fsclient/file.h Fri May 20 22:54:36 2022 +0200 2.3 @@ -109,7 +109,8 @@ 2.4 /* File and region operations. */ 2.5 2.6 long file_flush(file_t *file); 2.7 -long file_mmap(file_t *file, offset_t position, offset_t length, l4re_rm_flags_t region_flags); 2.8 +long file_mmap(file_t *file, offset_t position, offset_t length, int masked, 2.9 + l4re_rm_flags_t region_flags); 2.10 l4re_rm_flags_t file_region_flags(flags_t flags); 2.11 long file_resize(file_t *file, offset_t size); 2.12
3.1 --- a/libfsclient/lib/src/client.cc Fri May 20 00:40:27 2022 +0200 3.2 +++ b/libfsclient/lib/src/client.cc Fri May 20 22:54:36 2022 +0200 3.3 @@ -81,7 +81,7 @@ 3.4 3.5 if ((position < file->start_pos) || (position >= file->end_pos)) 3.6 { 3.7 - if (file_mmap(file, position, file_span(file), 3.8 + if (file_mmap(file, position, file_span(file), 0, 3.9 file_region_flags(file->flags))) 3.10 return -L4_EIO; 3.11 } 3.12 @@ -191,7 +191,7 @@ 3.13 if (file->memory == NULL) 3.14 { 3.15 if (file->object_flags & OBJECT_SUPPORTS_MMAP) 3.16 - return client_mmap(file, client_tell(file), count, 3.17 + return client_mmap(file, client_tell(file), count, 0, 3.18 file_region_flags(file->flags)); 3.19 else if (pipe_current(file)) 3.20 return NULL; 3.21 @@ -487,10 +487,10 @@ 3.22 3.23 /* Map a memory region to a file. */ 3.24 3.25 -void *client_mmap(file_t *file, offset_t position, offset_t length, 3.26 +void *client_mmap(file_t *file, offset_t position, offset_t length, int masked, 3.27 l4re_rm_flags_t region_flags) 3.28 { 3.29 - if ((file == NULL) || file_mmap(file, position, length, region_flags)) 3.30 + if ((file == NULL) || file_mmap(file, position, length, masked, region_flags)) 3.31 return NULL; 3.32 3.33 return file->memory;
4.1 --- a/libfsclient/lib/src/file.cc Fri May 20 00:40:27 2022 +0200 4.2 +++ b/libfsclient/lib/src/file.cc Fri May 20 22:54:36 2022 +0200 4.3 @@ -351,12 +351,12 @@ 4.4 /* Map a region of the given file to a memory region, obtaining an updated file 4.5 size and populated data details. Unmap any previously mapped region. */ 4.6 4.7 -long file_mmap(file_t *file, offset_t position, offset_t length, 4.8 +long file_mmap(file_t *file, offset_t position, offset_t length, int masked, 4.9 l4re_rm_flags_t region_flags) 4.10 { 4.11 char *memory = file->memory; 4.12 client_MappedFile mapped_file(file->ref); 4.13 - long err = mapped_file.mmap(position, length, &file->start_pos, 4.14 + long err = mapped_file.mmap(position, length, masked, &file->start_pos, 4.15 &file->end_pos, &file->size); 4.16 4.17 if (err)
5.1 --- a/libfsserver/include/fsserver/file_pager.h Fri May 20 00:40:27 2022 +0200 5.2 +++ b/libfsserver/include/fsserver/file_pager.h Fri May 20 22:54:36 2022 +0200 5.3 @@ -69,8 +69,8 @@ 5.4 virtual long map(offset_t offset, address_t hot_spot, map_flags_t flags, 5.5 l4_snd_fpage_t *region); 5.6 5.7 - virtual long mmap(offset_t position, offset_t length, offset_t *start_pos, 5.8 - offset_t *end_pos, offset_t *size); 5.9 + virtual long mmap(offset_t position, offset_t length, int masked, 5.10 + offset_t *start_pos, offset_t *end_pos, offset_t *size); 5.11 5.12 /* Notification methods. */ 5.13
6.1 --- a/libfsserver/include/fsserver/pager.h Fri May 20 00:40:27 2022 +0200 6.2 +++ b/libfsserver/include/fsserver/pager.h Fri May 20 22:54:36 2022 +0200 6.3 @@ -1,7 +1,7 @@ 6.4 /* 6.5 * Generic pager functionality. 6.6 * 6.7 - * Copyright (C) 2021 Paul Boddie <paul@boddie.org.uk> 6.8 + * Copyright (C) 2021, 2022 Paul Boddie <paul@boddie.org.uk> 6.9 * 6.10 * This program is free software; you can redistribute it and/or 6.11 * modify it under the terms of the GNU General Public License as 6.12 @@ -25,6 +25,7 @@ 6.13 6.14 #include <fsserver/page_mapper.h> 6.15 #include <fsserver/resource.h> 6.16 +#include <mem/memory_incremental.h> 6.17 6.18 6.19 6.20 @@ -37,6 +38,20 @@ 6.21 PageMapper *_mapper; 6.22 map_flags_t _flags; 6.23 6.24 + /* Masked region support. */ 6.25 + 6.26 + bool _is_masked; 6.27 + offset_t _start_visible, _end_visible; 6.28 + Flexpage _start_flexpage, _end_flexpage, _zero_flexpage; 6.29 + MemoryIncremental _memory; 6.30 + 6.31 + Flexpage *get_masked_flexpage(Flexpage *flexpage); 6.32 + 6.33 + void allocate_region(Flexpage *flexpage, Flexpage &masked); 6.34 + 6.35 + void populate_region(Flexpage *flexpage, Flexpage &masked, 6.36 + bool has_start, bool has_end); 6.37 + 6.38 public: 6.39 explicit Pager(PageMapper *mapper, map_flags_t flags); 6.40 6.41 @@ -59,8 +74,8 @@ 6.42 6.43 /* Mapped file methods. */ 6.44 6.45 - virtual long mmap(offset_t position, offset_t length, offset_t *start_pos, 6.46 - offset_t *end_pos, offset_t *size); 6.47 + virtual long mmap(offset_t position, offset_t length, int masked, 6.48 + offset_t *start_pos, offset_t *end_pos, offset_t *size); 6.49 }; 6.50 6.51 // vim: tabstop=4 expandtab shiftwidth=4
7.1 --- a/libfsserver/lib/files/file_pager.cc Fri May 20 00:40:27 2022 +0200 7.2 +++ b/libfsserver/lib/files/file_pager.cc Fri May 20 22:54:36 2022 +0200 7.3 @@ -90,12 +90,12 @@ 7.4 return err; 7.5 } 7.6 7.7 -long FilePager::mmap(offset_t position, offset_t length, offset_t *start_pos, 7.8 - offset_t *end_pos, offset_t *size) 7.9 +long FilePager::mmap(offset_t position, offset_t length, int masked, 7.10 + offset_t *start_pos, offset_t *end_pos, offset_t *size) 7.11 { 7.12 /* Set the limits of the paged region. */ 7.13 7.14 - return Pager::mmap(position, length, start_pos, end_pos, size); 7.15 + return Pager::mmap(position, length, masked, start_pos, end_pos, size); 7.16 } 7.17 7.18
8.1 --- a/libfsserver/lib/generic/pager.cc Fri May 20 00:40:27 2022 +0200 8.2 +++ b/libfsserver/lib/generic/pager.cc Fri May 20 22:54:36 2022 +0200 8.3 @@ -1,7 +1,7 @@ 8.4 /* 8.5 * Generic pager functionality. 8.6 * 8.7 - * Copyright (C) 2021 Paul Boddie <paul@boddie.org.uk> 8.8 + * Copyright (C) 2021, 2022 Paul Boddie <paul@boddie.org.uk> 8.9 * 8.10 * This program is free software; you can redistribute it and/or 8.11 * modify it under the terms of the GNU General Public License as 8.12 @@ -23,13 +23,16 @@ 8.13 #include "ipc.h" 8.14 #include "pager.h" 8.15 8.16 +#include <string.h> 8.17 + 8.18 8.19 8.20 /* Initialise the pager with a page mapper and the given flags controlling 8.21 access to a file. */ 8.22 8.23 Pager::Pager(PageMapper *mapper, map_flags_t flags) 8.24 -: _start(0), _size(0), _mapper(mapper), _flags(flags) 8.25 +: _start(0), _size(0), _mapper(mapper), _flags(flags), 8.26 + _is_masked(false), _start_visible(0), _end_visible(0) 8.27 { 8.28 } 8.29 8.30 @@ -61,8 +64,8 @@ 8.31 8.32 /* Expose a region of the file. */ 8.33 8.34 -long Pager::mmap(offset_t position, offset_t length, offset_t *start_pos, 8.35 - offset_t *end_pos, offset_t *size) 8.36 +long Pager::mmap(offset_t position, offset_t length, int masked, 8.37 + offset_t *start_pos, offset_t *end_pos, offset_t *size) 8.38 { 8.39 /* Define region characteristics. */ 8.40 8.41 @@ -75,6 +78,17 @@ 8.42 *end_pos = _start + _size; 8.43 *size = _mapper->get_data_size(); 8.44 8.45 + /* Permit masking of mapped regions. */ 8.46 + 8.47 + if (masked) 8.48 + { 8.49 + _start_visible = position; 8.50 + _end_visible = position + length; 8.51 + _is_masked = (*start_pos != _start_visible) || (*end_pos != _end_visible); 8.52 + } 8.53 + else 8.54 + _is_masked = false; 8.55 + 8.56 return L4_EOK; 8.57 } 8.58 8.59 @@ -87,17 +101,23 @@ 8.60 offset_t file_offset = _start + offset; 8.61 offset_t max_offset = _start + _size; 8.62 8.63 - /* Prevent access beyond that defined by the pager. */ 8.64 + /* Prevent access beyond that defined by the pager. 8.65 + NOTE: Permitting executable requests here. This needs to be configured 8.66 + when opening the pager or by another means. */ 8.67 8.68 if (flags & (~(_flags | L4RE_DS_F_X))) 8.69 return -L4_EACCESS; 8.70 8.71 Flexpage *flexpage = _mapper->get(file_offset, flags); 8.72 8.73 + /* Determine if the flexpage should be masked. */ 8.74 + 8.75 + Flexpage *issued_flexpage = get_masked_flexpage(flexpage); 8.76 + 8.77 /* Issue the flexpage via the IPC system. */ 8.78 8.79 - long err = ipc_prepare_flexpage(flexpage, file_offset, max_offset, hot_spot, 8.80 - flags, region); 8.81 + long err = ipc_prepare_flexpage(issued_flexpage, file_offset, max_offset, 8.82 + hot_spot, flags, region); 8.83 8.84 if (!err) 8.85 err = complete_Dataspace_map(*region); 8.86 @@ -119,4 +139,93 @@ 8.87 return _mapper->get_data_size(); 8.88 } 8.89 8.90 +/* Detect flexpages with masked content, introducing separate flexpages 8.91 + offering masked content from the same region. */ 8.92 + 8.93 +Flexpage *Pager::get_masked_flexpage(Flexpage *flexpage) 8.94 +{ 8.95 + /* If not masking content, return the original flexpage. */ 8.96 + 8.97 + if (!_is_masked) 8.98 + return flexpage; 8.99 + 8.100 + /* Determine whether the flexpage involves the limits of the visible 8.101 + region. */ 8.102 + 8.103 + bool has_start = flexpage->supports_position(_start_visible) && 8.104 + flexpage->base_offset != _start_visible; 8.105 + bool has_end = flexpage->supports_position(_end_visible); 8.106 + bool has_zero = (flexpage->base_offset >= _end_visible) || 8.107 + (flexpage->base_offset + flexpage->size < _start_visible); 8.108 + 8.109 + /* Return the original flexpage within the visible limits. */ 8.110 + 8.111 + if (!has_start && !has_end && !has_zero) 8.112 + return flexpage; 8.113 + 8.114 + /* Allocate and populate a region in one of the preallocated flexpages for 8.115 + masked content. 8.116 + NOTE: A general copy-on-write solution will maintain a collection of 8.117 + flexpages. */ 8.118 + 8.119 + Flexpage &masked = has_start ? _start_flexpage : 8.120 + has_end ? _end_flexpage : 8.121 + _zero_flexpage; 8.122 + 8.123 + allocate_region(flexpage, masked); 8.124 + populate_region(flexpage, masked, has_start, has_end); 8.125 + 8.126 + /* Associate the preallocated flexpage with the original flexpage. */ 8.127 + 8.128 + flexpage->associate(&masked); 8.129 + return &masked; 8.130 +} 8.131 + 8.132 +void Pager::allocate_region(Flexpage *flexpage, Flexpage &masked) 8.133 +{ 8.134 + offset_t needed = flexpage->region->size(); 8.135 + 8.136 + /* Attempt to re-use an existing region. */ 8.137 + 8.138 + if (masked.region != NULL) 8.139 + { 8.140 + if (masked.region->size() == needed) 8.141 + return; 8.142 + else 8.143 + _memory.release(masked.region); 8.144 + } 8.145 + 8.146 + /* Set the region in the flexpage. */ 8.147 + 8.148 + masked.set_region(_memory.region(needed)); 8.149 + masked.reset(flexpage->base_offset); 8.150 +} 8.151 + 8.152 +void Pager::populate_region(Flexpage *flexpage, Flexpage &masked, 8.153 + bool has_start, bool has_end) 8.154 +{ 8.155 + /* Without any limits involved, provide a zero flexpage. */ 8.156 + 8.157 + if (!has_start && !has_end) 8.158 + { 8.159 + memset((void *) masked.region->start, 0, masked.size); 8.160 + return; 8.161 + } 8.162 + 8.163 + /* Determine the content limits given start and/or end offsets. */ 8.164 + 8.165 + offset_t start_offset = has_start ? _start_visible - masked.base_offset : 0; 8.166 + offset_t end_offset = has_end ? _end_visible - masked.base_offset : masked.size; 8.167 + 8.168 + if (has_start) 8.169 + memset((void *) masked.region->start, 0, start_offset); 8.170 + 8.171 + memcpy((void *) (masked.region->start + start_offset), 8.172 + (const void *) (flexpage->region->start + start_offset), 8.173 + end_offset - start_offset); 8.174 + 8.175 + if (has_end) 8.176 + memset((void *) (masked.region->start + end_offset), 0, masked.size - end_offset); 8.177 +} 8.178 + 8.179 // vim: tabstop=4 expandtab shiftwidth=4
9.1 --- a/libfsserver/lib/mapping/page_mapper.cc Fri May 20 00:40:27 2022 +0200 9.2 +++ b/libfsserver/lib/mapping/page_mapper.cc Fri May 20 22:54:36 2022 +0200 9.3 @@ -162,11 +162,31 @@ 9.4 { 9.5 if (flexpage->decrement() || purge) 9.6 { 9.7 + /* NOTE: Derived flexpages might potentially support their contents 9.8 + being merged into the flushed data, although this is a 9.9 + non-trivial problem. */ 9.10 + 9.11 if (flexpage->modified()) 9.12 _accessor->flush(flexpage); 9.13 9.14 + /* Unmap the flexpage, requiring users of its memory to request another 9.15 + flexpage in future. */ 9.16 + 9.17 ipc_unmap_flexpage(flexpage); 9.18 flexpage->invalidate(); 9.19 + 9.20 + /* Unmap all derived flexpages, since these rely on the underlying file 9.21 + contents. */ 9.22 + 9.23 + DerivedFlexpages::iterator it; 9.24 + 9.25 + for (it = flexpage->derived.begin(); it != flexpage->derived.end(); it++) 9.26 + { 9.27 + ipc_unmap_flexpage(*it); 9.28 + (*it)->invalidate(); 9.29 + } 9.30 + 9.31 + flexpage->disassociate(); 9.32 } 9.33 } 9.34
10.1 --- a/libmem/include/mem/flexpage.h Fri May 20 00:40:27 2022 +0200 10.2 +++ b/libmem/include/mem/flexpage.h Fri May 20 22:54:36 2022 +0200 10.3 @@ -1,7 +1,7 @@ 10.4 /* 10.5 * A flexpage abstraction. 10.6 * 10.7 - * Copyright (C) 2021 Paul Boddie <paul@boddie.org.uk> 10.8 + * Copyright (C) 2021, 2022 Paul Boddie <paul@boddie.org.uk> 10.9 * 10.10 * This program is free software; you can redistribute it and/or 10.11 * modify it under the terms of the GNU General Public License as 10.12 @@ -21,6 +21,8 @@ 10.13 10.14 #pragma once 10.15 10.16 +#include <list> 10.17 + 10.18 #include <mem/memory_utils.h> 10.19 #include <mem/region.h> 10.20 #include <mem/send_flexpage.h> 10.21 @@ -34,6 +36,16 @@ 10.22 10.23 10.24 10.25 +/* Forward declaration. */ 10.26 + 10.27 +class Flexpage; 10.28 + 10.29 +/* Employed data types. */ 10.30 + 10.31 +typedef std::list<Flexpage *> DerivedFlexpages; 10.32 + 10.33 + 10.34 + 10.35 /* A flexpage abstraction. */ 10.36 10.37 class Flexpage 10.38 @@ -45,6 +57,10 @@ 10.39 public: 10.40 Region *region; 10.41 10.42 + /* Flexpage relationships to support masked regions. */ 10.43 + 10.44 + DerivedFlexpages derived; 10.45 + 10.46 /* General flexpage characteristics. */ 10.47 10.48 offset_t base_addr, size; 10.49 @@ -56,10 +72,13 @@ 10.50 10.51 /* Associate a flexpage with a memory 'region'. */ 10.52 10.53 - explicit Flexpage(Region *region) : region(region) 10.54 + explicit Flexpage(Region *region = NULL) 10.55 + : region(region) 10.56 { 10.57 } 10.58 10.59 + void set_region(Region *region); 10.60 + 10.61 void reset(offset_t offset); 10.62 10.63 bool decrement(); 10.64 @@ -80,6 +99,12 @@ 10.65 offset_t max_offset=0); 10.66 10.67 SendFlexpage to_unmap(); 10.68 + 10.69 + /* Associate other flexpages with this flexpage. */ 10.70 + 10.71 + void associate(Flexpage *flexpage); 10.72 + 10.73 + void disassociate(); 10.74 }; 10.75 10.76 // vim: tabstop=4 expandtab shiftwidth=4
11.1 --- a/libmem/lib/src/flexpage.cc Fri May 20 00:40:27 2022 +0200 11.2 +++ b/libmem/lib/src/flexpage.cc Fri May 20 22:54:36 2022 +0200 11.3 @@ -1,7 +1,7 @@ 11.4 /* 11.5 * A flexpage abstraction. 11.6 * 11.7 - * Copyright (C) 2021 Paul Boddie <paul@boddie.org.uk> 11.8 + * Copyright (C) 2021, 2022 Paul Boddie <paul@boddie.org.uk> 11.9 * 11.10 * This program is free software; you can redistribute it and/or 11.11 * modify it under the terms of the GNU General Public License as 11.12 @@ -31,6 +31,9 @@ 11.13 11.14 void Flexpage::reset(offset_t offset) 11.15 { 11.16 + if (region == NULL) 11.17 + return; 11.18 + 11.19 _counter = 0; 11.20 11.21 /* By definition (see "Flexible-Sized Page Objects - Object-Orientation 11.22 @@ -63,6 +66,13 @@ 11.23 page_addr = base_addr + page_offset; 11.24 } 11.25 11.26 +/* Set a region. */ 11.27 + 11.28 +void Flexpage::set_region(Region *region) 11.29 +{ 11.30 + this->region = region; 11.31 +} 11.32 + 11.33 /* Decrement the usage counter, returning whether the flexpage is now no longer 11.34 used. */ 11.35 11.36 @@ -179,4 +189,16 @@ 11.37 return SendFlexpage(base_addr, page_order(size), _flags); 11.38 } 11.39 11.40 +/* Associate another flexpage with this flexpage. */ 11.41 + 11.42 +void Flexpage::associate(Flexpage *flexpage) 11.43 +{ 11.44 + derived.push_back(flexpage); 11.45 +} 11.46 + 11.47 +void Flexpage::disassociate() 11.48 +{ 11.49 + derived.clear(); 11.50 +} 11.51 + 11.52 // vim: tabstop=4 expandtab shiftwidth=4
12.1 --- a/libsystypes/idl/mapped_file.idl Fri May 20 00:40:27 2022 +0200 12.2 +++ b/libsystypes/idl/mapped_file.idl Fri May 20 22:54:36 2022 +0200 12.3 @@ -4,10 +4,12 @@ 12.4 12.5 interface MappedFile 12.6 { 12.7 - /* Memory-map a file for the given file position and length, obtaining the 12.8 - limits of the mapped region and the size of the file. */ 12.9 + /* Memory-map a file for the given file position and length, masking out of 12.10 + range regions if indicated, obtaining the limits of the mapped region and 12.11 + the size of the file. */ 12.12 12.13 [opcode(7)] void mmap(in offset_t position, in offset_t length, 12.14 + in int masked, 12.15 out offset_t start_pos, out offset_t end_pos, 12.16 out offset_t size); 12.17 };
13.1 --- a/tests/dstest_block_client.cc Fri May 20 00:40:27 2022 +0200 13.2 +++ b/tests/dstest_block_client.cc Fri May 20 22:54:36 2022 +0200 13.3 @@ -45,9 +45,24 @@ 13.4 unsigned long sample_remaining = remaining < sample ? remaining : sample; 13.5 13.6 printf("%ld bytes from %p...\n", sample_remaining, (file->memory + offset)); 13.7 - strncpy(buf, (file->memory + offset), sample_remaining); 13.8 + memcpy(buf, (file->memory + offset), sample_remaining); 13.9 buf[sample_remaining] = '\0'; 13.10 - printf("%s\n", buf); 13.11 + 13.12 + unsigned long leading = 0; 13.13 + char *outbuf = buf; 13.14 + 13.15 + while ((*outbuf == '\0') && (leading < sample_remaining)) 13.16 + { 13.17 + outbuf++; 13.18 + leading++; 13.19 + } 13.20 + 13.21 + if (leading) 13.22 + printf("[%ld zero bytes]\n", leading); 13.23 + 13.24 + printf("%s\n", outbuf); 13.25 + 13.26 + printf("[%ld bytes after string]\n", sample_remaining - leading - strlen(outbuf)); 13.27 } 13.28 } 13.29 13.30 @@ -80,9 +95,10 @@ 13.31 return 1; 13.32 } 13.33 13.34 - /* A region of the file is mapped. */ 13.35 + /* A region of the file is mapped. Here, the start and length will not provide 13.36 + page-aligned offsets, but the region is nevertheless not masked. */ 13.37 13.38 - err = file_mmap(&file, 0, page(10), file_region_flags(file.flags)); 13.39 + err = file_mmap(&file, 10, 290, 0, file_region_flags(file.flags)); 13.40 13.41 if (err) 13.42 { 13.43 @@ -90,16 +106,39 @@ 13.44 return 1; 13.45 } 13.46 13.47 + printf("File contents:\n"); 13.48 + 13.49 show(&file, step, sample); 13.50 13.51 + printf("File shown.\n"); 13.52 + 13.53 + /* A region of the file is mapped. Here, the resulting offsets will be used to 13.54 + define a masked region. */ 13.55 + 13.56 + err = file_mmap(&file, 10, 290, 1, file_region_flags(file.flags)); 13.57 + 13.58 + if (err) 13.59 + { 13.60 + printf("Could not map file region: %s\n", l4sys_errtostr(err)); 13.61 + return 1; 13.62 + } 13.63 + 13.64 + printf("File contents:\n"); 13.65 + 13.66 + show(&file, step, sample); 13.67 + 13.68 + printf("File shown.\n"); 13.69 + 13.70 /* Resizing must occur before writing beyond the end of file. Otherwise, the 13.71 data may get discarded if the supporting flexpage needs to be flushed. */ 13.72 13.73 - offset_t new_region = round(file_populated_span(&file), page(1)); 13.74 + offset_t old_size = file_populated_span(&file); 13.75 + offset_t new_region = round(old_size, page(1)); 13.76 + offset_t new_size = new_region + old_size; 13.77 13.78 - printf("Resize to %ld...\n", new_region + file_populated_span(&file)); 13.79 + printf("Resize to %ld...\n", new_size); 13.80 13.81 - err = file_resize(&file, new_region + file_populated_span(&file)); 13.82 + err = file_resize(&file, new_size); 13.83 13.84 if (err) 13.85 { 13.86 @@ -109,17 +148,46 @@ 13.87 13.88 printf("Resized file...\n"); 13.89 13.90 + /* Re-map to avoid masking the region. */ 13.91 + 13.92 + err = file_mmap(&file, 10, new_size - 20, 0, file_region_flags(file.flags)); 13.93 + 13.94 + if (err) 13.95 + { 13.96 + printf("Could not map file region: %s\n", l4sys_errtostr(err)); 13.97 + return 1; 13.98 + } 13.99 + 13.100 /* Copy the sampled data to another file region. */ 13.101 13.102 printf("Copy data to %ld...\n", new_region); 13.103 13.104 - for (unsigned long offset = 0; offset < file_populated_span(&file); offset += step) 13.105 + for (unsigned long offset = 0; offset < old_size; offset += step) 13.106 { 13.107 + printf("Copying to %ld...\n", new_region + offset); 13.108 memcpy(file.memory + new_region + offset, file.memory + offset, sample); 13.109 if (step > sample) 13.110 memset(file.memory + new_region + offset + sample, 0, step - sample); 13.111 } 13.112 13.113 + printf("File contents:\n"); 13.114 + 13.115 + show(&file, step, sample); 13.116 + 13.117 + printf("File shown.\n"); 13.118 + 13.119 + /* Re-map to mask the region again. */ 13.120 + 13.121 + err = file_mmap(&file, 10, new_size - 20, 1, file_region_flags(file.flags)); 13.122 + 13.123 + if (err) 13.124 + { 13.125 + printf("Could not map file region: %s\n", l4sys_errtostr(err)); 13.126 + return 1; 13.127 + } 13.128 + 13.129 + printf("File contents:\n"); 13.130 + 13.131 show(&file, step, sample); 13.132 13.133 printf("File shown.\n");
14.1 --- a/tests/dstest_host_client.cc Fri May 20 00:40:27 2022 +0200 14.2 +++ b/tests/dstest_host_client.cc Fri May 20 22:54:36 2022 +0200 14.3 @@ -68,7 +68,7 @@ 14.4 14.5 /* A region of the file is mapped. */ 14.6 14.7 - err = file_mmap(&file, 0, page(10), file_region_flags(file.flags)); 14.8 + err = file_mmap(&file, 0, page(10), 0, file_region_flags(file.flags)); 14.9 14.10 if (err) 14.11 {
15.1 --- a/tests/dstest_test_client.cc Fri May 20 00:40:27 2022 +0200 15.2 +++ b/tests/dstest_test_client.cc Fri May 20 22:54:36 2022 +0200 15.3 @@ -77,7 +77,7 @@ 15.4 15.5 /* A region of the file is mapped. */ 15.6 15.7 - err = file_mmap(&file, page(start_page), page(MAP_PAGES), file_region_flags(file.flags)); 15.8 + err = file_mmap(&file, page(start_page), page(MAP_PAGES), 0, file_region_flags(file.flags)); 15.9 15.10 if (err) 15.11 {