1.1 --- a/libexec/lib/src/segment.cc Sun May 22 22:51:57 2022 +0200
1.2 +++ b/libexec/lib/src/segment.cc Sun May 22 22:55:53 2022 +0200
1.3 @@ -58,7 +58,7 @@
1.4
1.5 offset_t Segment::size()
1.6 {
1.7 - return _size;
1.8 + return _region_size;
1.9 }
1.10
1.11 /* Allocate a writable region for the segment. */
1.12 @@ -73,25 +73,32 @@
1.13
1.14 long Segment::fill(file_t *file)
1.15 {
1.16 - /* Allocate writable memory to populate. */
1.17 + /* NOTE: This should be replaced by copy-on-write dataspace usage. */
1.18 +
1.19 + if (_flags & L4RE_RM_F_W)
1.20 + {
1.21 + long err = allocate();
1.22
1.23 - long err = ipc_allocate_align(_region_size,
1.24 - L4RE_RM_F_SEARCH_ADDR | _flags | L4RE_RM_F_W,
1.25 - L4_PAGESHIFT, (void **) &_buf, &_ds);
1.26 + if (err)
1.27 + return err;
1.28
1.29 - if (err)
1.30 - return err;
1.31 + client_seek(file, _file_offset - _region_offset, SEEK_SET);
1.32 + offset_t nread = client_read(file, _buf, _region_size);
1.33
1.34 - /* Align the exposed file contents to the memory mapped region.
1.35 - Since the region is page-aligned, the region offset is introduced to map
1.36 - from an earlier part of the file, if appropriate. */
1.37 + memset(_buf, 0, _region_offset);
1.38 + memset(_buf + _region_offset + _file_contents, 0, _region_size - _region_offset - _file_contents);
1.39
1.40 - memset(_buf, 0, _region_size);
1.41 + if (nread < _file_contents)
1.42 + return -L4_EIO;
1.43 + else
1.44 + return L4_EOK;
1.45 + }
1.46
1.47 - client_seek(file, _file_offset, SEEK_SET);
1.48 - offset_t nread = client_read(file, _buf + _region_offset, _file_contents);
1.49 + /* Provide the exposed file contents in a masked memory mapped region. */
1.50
1.51 - if (nread < _file_contents)
1.52 + _buf = (char *) client_mmap(file, _file_offset - _region_offset, _region_size, 0, _flags);
1.53 +
1.54 + if (_buf == NULL)
1.55 return -L4_EIO;
1.56 else
1.57 return L4_EOK;