1.1 --- a/libexec/lib/src/segment.cc Thu Jun 02 01:09:30 2022 +0200
1.2 +++ b/libexec/lib/src/segment.cc Fri Jun 03 00:21:10 2022 +0200
1.3 @@ -31,20 +31,22 @@
1.4
1.5
1.6
1.7 -/* Initialise a memory segment. */
1.8 +/* Obligatory destructor. */
1.9
1.10 -Segment::Segment(l4_addr_t base, offset_t size, l4re_rm_flags_t flags,
1.11 - offset_t file_offset, offset_t file_contents)
1.12 +Segment::~Segment()
1.13 +{
1.14 +}
1.15
1.16 -: _base(base), _size(size), _flags(flags), _file_offset(file_offset),
1.17 - _file_contents(file_contents)
1.18 +/* Common initialisation. */
1.19 +
1.20 +void Segment::init()
1.21 {
1.22 - _region_base = trunc(_base, L4_PAGESIZE);
1.23 - _region_offset = _base - _region_base;
1.24 + _region_base = trunc(region_address(), L4_PAGESIZE);
1.25 + _region_content_offset = region_address() - _region_base;
1.26
1.27 /* Expand the region size. */
1.28
1.29 - _region_size = round(_size + _region_offset, L4_PAGESIZE);
1.30 + _region_allocated_size = round(region_size() + _region_content_offset, L4_PAGESIZE);
1.31 }
1.32
1.33 /* Return the address of allocated memory. */
1.34 @@ -58,14 +60,14 @@
1.35
1.36 offset_t Segment::size()
1.37 {
1.38 - return _region_size;
1.39 + return _region_allocated_size;
1.40 }
1.41
1.42 /* Allocate a writable region for the segment. */
1.43
1.44 long Segment::allocate()
1.45 {
1.46 - return ipc_allocate_align(_region_size, L4RE_RM_F_SEARCH_ADDR | L4RE_RM_F_RW,
1.47 + return ipc_allocate_align(_region_allocated_size, L4RE_RM_F_SEARCH_ADDR | L4RE_RM_F_RW,
1.48 L4_PAGESHIFT, (void **) &_buf, &_ds);
1.49 }
1.50
1.51 @@ -76,11 +78,11 @@
1.52 /* Provide the exposed file contents in a masked memory mapped region. */
1.53
1.54 _buf = (char *) client_mmap(file,
1.55 - _file_offset - _region_offset,
1.56 - _region_size,
1.57 - _file_offset,
1.58 - _file_offset + _file_contents,
1.59 - _flags);
1.60 + file_offset() - _region_content_offset,
1.61 + _region_allocated_size,
1.62 + file_offset(),
1.63 + file_offset() + file_contents(),
1.64 + region_flags());
1.65
1.66 if (_buf == NULL)
1.67 return -L4_EIO;
1.68 @@ -92,7 +94,7 @@
1.69
1.70 MappedRegion &Segment::region()
1.71 {
1.72 - _region = MappedRegion((l4_addr_t) _buf, _region_size, _flags, _region_base);
1.73 + _region = MappedRegion((l4_addr_t) _buf, _region_allocated_size, region_flags(), _region_base);
1.74 return _region;
1.75 }
1.76
1.77 @@ -108,16 +110,49 @@
1.78 return (address - (l4_addr_t) _buf) + _region_base;
1.79 }
1.80
1.81 +
1.82 +
1.83 +/* Initialise a memory segment using explicit parameters. */
1.84 +
1.85 +ExplicitSegment::ExplicitSegment(l4_addr_t base, offset_t size,
1.86 + l4re_rm_flags_t flags, offset_t file_offset,
1.87 + offset_t file_contents)
1.88 +: _base(base), _size(size), _flags(flags), _file_offset(file_offset),
1.89 + _file_contents(file_contents)
1.90 +{
1.91 + init();
1.92 +}
1.93 +
1.94 /* Return the amount of file content loaded into the segment. */
1.95
1.96 -offset_t Segment::file_contents()
1.97 +bool ExplicitSegment::loadable()
1.98 +{
1.99 + return false;
1.100 +}
1.101 +
1.102 +offset_t ExplicitSegment::file_contents()
1.103 {
1.104 return _file_contents;
1.105 }
1.106
1.107 +offset_t ExplicitSegment::file_offset()
1.108 +{
1.109 + return _file_offset;
1.110 +}
1.111 +
1.112 +l4_addr_t ExplicitSegment::region_address()
1.113 +{
1.114 + return _base;
1.115 +}
1.116 +
1.117 +offset_t ExplicitSegment::region_size()
1.118 +{
1.119 + return _size;
1.120 +}
1.121 +
1.122 /* Return the region flags for the segment. */
1.123
1.124 -l4re_rm_flags_t Segment::region_flags()
1.125 +l4re_rm_flags_t ExplicitSegment::region_flags()
1.126 {
1.127 return _flags;
1.128 }