# HG changeset patch # User Paul Boddie # Date 1653252953 -7200 # Node ID a3c858aa56bbf63a18c5ff69928885bf3de8f573 # Parent 0a74c259c65fc3d34c2498d5e12a7d8e52cde996 Introduced memory mapping of the program code from the executable file segment. diff -r 0a74c259c65f -r a3c858aa56bb libexec/lib/src/segment.cc --- a/libexec/lib/src/segment.cc Sun May 22 22:51:57 2022 +0200 +++ b/libexec/lib/src/segment.cc Sun May 22 22:55:53 2022 +0200 @@ -58,7 +58,7 @@ offset_t Segment::size() { - return _size; + return _region_size; } /* Allocate a writable region for the segment. */ @@ -73,25 +73,32 @@ long Segment::fill(file_t *file) { - /* Allocate writable memory to populate. */ + /* NOTE: This should be replaced by copy-on-write dataspace usage. */ + + if (_flags & L4RE_RM_F_W) + { + long err = allocate(); - long err = ipc_allocate_align(_region_size, - L4RE_RM_F_SEARCH_ADDR | _flags | L4RE_RM_F_W, - L4_PAGESHIFT, (void **) &_buf, &_ds); + if (err) + return err; - if (err) - return err; + client_seek(file, _file_offset - _region_offset, SEEK_SET); + offset_t nread = client_read(file, _buf, _region_size); - /* Align the exposed file contents to the memory mapped region. - Since the region is page-aligned, the region offset is introduced to map - from an earlier part of the file, if appropriate. */ + memset(_buf, 0, _region_offset); + memset(_buf + _region_offset + _file_contents, 0, _region_size - _region_offset - _file_contents); - memset(_buf, 0, _region_size); + if (nread < _file_contents) + return -L4_EIO; + else + return L4_EOK; + } - client_seek(file, _file_offset, SEEK_SET); - offset_t nread = client_read(file, _buf + _region_offset, _file_contents); + /* Provide the exposed file contents in a masked memory mapped region. */ - if (nread < _file_contents) + _buf = (char *) client_mmap(file, _file_offset - _region_offset, _region_size, 0, _flags); + + if (_buf == NULL) return -L4_EIO; else return L4_EOK;