# HG changeset patch # User Paul Boddie # Date 1653255977 -7200 # Node ID 8349c51951e2cec851670601227a62042ff30db0 # Parent a3c858aa56bbf63a18c5ff69928885bf3de8f573 Changed the mmap interface to employ explicit visible region limits. diff -r a3c858aa56bb -r 8349c51951e2 libexec/lib/src/segment.cc --- a/libexec/lib/src/segment.cc Sun May 22 22:55:53 2022 +0200 +++ b/libexec/lib/src/segment.cc Sun May 22 23:46:17 2022 +0200 @@ -96,7 +96,7 @@ /* Provide the exposed file contents in a masked memory mapped region. */ - _buf = (char *) client_mmap(file, _file_offset - _region_offset, _region_size, 0, _flags); + _buf = (char *) client_mmap(file, _file_offset - _region_offset, _region_size, 0, 0, _flags); if (_buf == NULL) return -L4_EIO; diff -r a3c858aa56bb -r 8349c51951e2 libfsclient/include/fsclient/client.h --- a/libfsclient/include/fsclient/client.h Sun May 22 22:55:53 2022 +0200 +++ b/libfsclient/include/fsclient/client.h Sun May 22 23:46:17 2022 +0200 @@ -64,7 +64,8 @@ /* File and region operations. */ long client_flush(file_t *file); -void *client_mmap(file_t *file, offset_t position, offset_t length, int masked, +void *client_mmap(file_t *file, offset_t position, offset_t length, + offset_t start_visible, offset_t end_visible, l4re_rm_flags_t region_flags); l4re_rm_flags_t client_region_flags(prot_t prot, flags_t flags); diff -r a3c858aa56bb -r 8349c51951e2 libfsclient/include/fsclient/file.h --- a/libfsclient/include/fsclient/file.h Sun May 22 22:55:53 2022 +0200 +++ b/libfsclient/include/fsclient/file.h Sun May 22 23:46:17 2022 +0200 @@ -109,7 +109,8 @@ /* File and region operations. */ long file_flush(file_t *file); -long file_mmap(file_t *file, offset_t position, offset_t length, int masked, +long file_mmap(file_t *file, offset_t position, offset_t length, + offset_t start_visible, offset_t end_visible, l4re_rm_flags_t region_flags); l4re_rm_flags_t file_region_flags(flags_t flags); long file_resize(file_t *file, offset_t size); diff -r a3c858aa56bb -r 8349c51951e2 libfsclient/lib/src/client.cc --- a/libfsclient/lib/src/client.cc Sun May 22 22:55:53 2022 +0200 +++ b/libfsclient/lib/src/client.cc Sun May 22 23:46:17 2022 +0200 @@ -81,7 +81,7 @@ if ((position < file->start_pos) || (position >= file->end_pos)) { - if (file_mmap(file, position, file_span(file), 0, + if (file_mmap(file, position, file_span(file), 0, 0, file_region_flags(file->flags))) return -L4_EIO; } @@ -191,7 +191,7 @@ if (file->memory == NULL) { if (file->object_flags & OBJECT_SUPPORTS_MMAP) - return client_mmap(file, client_tell(file), count, 0, + return client_mmap(file, client_tell(file), count, 0, 0, file_region_flags(file->flags)); else if (pipe_current(file)) return NULL; @@ -487,10 +487,12 @@ /* Map a memory region to a file. */ -void *client_mmap(file_t *file, offset_t position, offset_t length, int masked, +void *client_mmap(file_t *file, offset_t position, offset_t length, + offset_t start_visible, offset_t end_visible, l4re_rm_flags_t region_flags) { - if ((file == NULL) || file_mmap(file, position, length, masked, region_flags)) + if ((file == NULL) || file_mmap(file, position, length, start_visible, + end_visible, region_flags)) return NULL; return file->memory; diff -r a3c858aa56bb -r 8349c51951e2 libfsclient/lib/src/file.cc --- a/libfsclient/lib/src/file.cc Sun May 22 22:55:53 2022 +0200 +++ b/libfsclient/lib/src/file.cc Sun May 22 23:46:17 2022 +0200 @@ -351,13 +351,14 @@ /* Map a region of the given file to a memory region, obtaining an updated file size and populated data details. Unmap any previously mapped region. */ -long file_mmap(file_t *file, offset_t position, offset_t length, int masked, +long file_mmap(file_t *file, offset_t position, offset_t length, + offset_t start_visible, offset_t end_visible, l4re_rm_flags_t region_flags) { char *memory = file->memory; client_MappedFile mapped_file(file->ref); - long err = mapped_file.mmap(position, length, masked, &file->start_pos, - &file->end_pos, &file->size); + long err = mapped_file.mmap(position, length, start_visible, end_visible, + &file->start_pos, &file->end_pos, &file->size); if (err) return err; diff -r a3c858aa56bb -r 8349c51951e2 libfsserver/include/fsserver/file_pager.h --- a/libfsserver/include/fsserver/file_pager.h Sun May 22 22:55:53 2022 +0200 +++ b/libfsserver/include/fsserver/file_pager.h Sun May 22 23:46:17 2022 +0200 @@ -69,7 +69,8 @@ virtual long map(offset_t offset, address_t hot_spot, map_flags_t flags, l4_snd_fpage_t *region); - virtual long mmap(offset_t position, offset_t length, int masked, + virtual long mmap(offset_t position, offset_t length, + offset_t start_visible, offset_t end_visible, offset_t *start_pos, offset_t *end_pos, offset_t *size); /* Notification methods. */ diff -r a3c858aa56bb -r 8349c51951e2 libfsserver/include/fsserver/pager.h --- a/libfsserver/include/fsserver/pager.h Sun May 22 22:55:53 2022 +0200 +++ b/libfsserver/include/fsserver/pager.h Sun May 22 23:46:17 2022 +0200 @@ -74,7 +74,8 @@ /* Mapped file methods. */ - virtual long mmap(offset_t position, offset_t length, int masked, + virtual long mmap(offset_t position, offset_t length, + offset_t start_visible, offset_t end_visible, offset_t *start_pos, offset_t *end_pos, offset_t *size); }; diff -r a3c858aa56bb -r 8349c51951e2 libfsserver/lib/files/file_pager.cc --- a/libfsserver/lib/files/file_pager.cc Sun May 22 22:55:53 2022 +0200 +++ b/libfsserver/lib/files/file_pager.cc Sun May 22 23:46:17 2022 +0200 @@ -1,7 +1,7 @@ /* * File-specific pager functionality. * - * Copyright (C) 2021 Paul Boddie + * Copyright (C) 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 @@ -90,12 +90,14 @@ return err; } -long FilePager::mmap(offset_t position, offset_t length, int masked, +long FilePager::mmap(offset_t position, offset_t length, + offset_t start_visible, offset_t end_visible, offset_t *start_pos, offset_t *end_pos, offset_t *size) { /* Set the limits of the paged region. */ - return Pager::mmap(position, length, masked, start_pos, end_pos, size); + return Pager::mmap(position, length, start_visible, end_visible, start_pos, + end_pos, size); } diff -r a3c858aa56bb -r 8349c51951e2 libfsserver/lib/generic/pager.cc --- a/libfsserver/lib/generic/pager.cc Sun May 22 22:55:53 2022 +0200 +++ b/libfsserver/lib/generic/pager.cc Sun May 22 23:46:17 2022 +0200 @@ -64,7 +64,8 @@ /* Expose a region of the file. */ -long Pager::mmap(offset_t position, offset_t length, int masked, +long Pager::mmap(offset_t position, offset_t length, + offset_t start_visible, offset_t end_visible, offset_t *start_pos, offset_t *end_pos, offset_t *size) { /* Define region characteristics. */ @@ -80,10 +81,10 @@ /* Permit masking of mapped regions. */ - if (masked) + if (start_visible || end_visible) { - _start_visible = position; - _end_visible = position + length; + _start_visible = start_visible; + _end_visible = end_visible; _is_masked = (*start_pos != _start_visible) || (*end_pos != _end_visible); } else diff -r a3c858aa56bb -r 8349c51951e2 libsystypes/idl/mapped_file.idl --- a/libsystypes/idl/mapped_file.idl Sun May 22 22:55:53 2022 +0200 +++ b/libsystypes/idl/mapped_file.idl Sun May 22 23:46:17 2022 +0200 @@ -4,12 +4,12 @@ interface MappedFile { - /* Memory-map a file for the given file position and length, masking out of - range regions if indicated, obtaining the limits of the mapped region and - the size of the file. */ + /* Memory-map a file for the given file position and length, masking regions + beyond any visible range if indicated, obtaining the limits of the mapped + region and the size of the file. */ [opcode(7)] void mmap(in offset_t position, in offset_t length, - in int masked, + in offset_t start_visible, in offset_t end_visible, out offset_t start_pos, out offset_t end_pos, out offset_t size); }; diff -r a3c858aa56bb -r 8349c51951e2 tests/dstest_block_client.cc --- a/tests/dstest_block_client.cc Sun May 22 22:55:53 2022 +0200 +++ b/tests/dstest_block_client.cc Sun May 22 23:46:17 2022 +0200 @@ -98,7 +98,7 @@ /* A region of the file is mapped. Here, the start and length will not provide page-aligned offsets, but the region is nevertheless not masked. */ - err = file_mmap(&file, 10, 290, 0, file_region_flags(file.flags)); + err = file_mmap(&file, 10, 290, 0, 0, file_region_flags(file.flags)); if (err) { @@ -115,7 +115,7 @@ /* A region of the file is mapped. Here, the resulting offsets will be used to define a masked region. */ - err = file_mmap(&file, 10, 290, 1, file_region_flags(file.flags)); + err = file_mmap(&file, 10, 290, 10, 290, file_region_flags(file.flags)); if (err) { @@ -150,7 +150,7 @@ /* Re-map to avoid masking the region. */ - err = file_mmap(&file, 10, new_size - 20, 0, file_region_flags(file.flags)); + err = file_mmap(&file, 10, new_size - 20, 0, 0, file_region_flags(file.flags)); if (err) { @@ -178,7 +178,7 @@ /* Re-map to mask the region again. */ - err = file_mmap(&file, 10, new_size - 20, 1, file_region_flags(file.flags)); + err = file_mmap(&file, 0, new_size, 10, new_size - 20, file_region_flags(file.flags)); if (err) { diff -r a3c858aa56bb -r 8349c51951e2 tests/dstest_host_client.cc --- a/tests/dstest_host_client.cc Sun May 22 22:55:53 2022 +0200 +++ b/tests/dstest_host_client.cc Sun May 22 23:46:17 2022 +0200 @@ -68,7 +68,7 @@ /* A region of the file is mapped. */ - err = file_mmap(&file, 0, page(10), 0, file_region_flags(file.flags)); + err = file_mmap(&file, 0, page(10), 0, 0, file_region_flags(file.flags)); if (err) { diff -r a3c858aa56bb -r 8349c51951e2 tests/dstest_test_client.cc --- a/tests/dstest_test_client.cc Sun May 22 22:55:53 2022 +0200 +++ b/tests/dstest_test_client.cc Sun May 22 23:46:17 2022 +0200 @@ -77,7 +77,7 @@ /* A region of the file is mapped. */ - err = file_mmap(&file, page(start_page), page(MAP_PAGES), 0, file_region_flags(file.flags)); + err = file_mmap(&file, page(start_page), page(MAP_PAGES), 0, 0, file_region_flags(file.flags)); if (err) {