1.1 --- a/flexpage.cc Mon Feb 01 00:10:21 2021 +0100
1.2 +++ b/flexpage.cc Mon Feb 01 01:04:30 2021 +0100
1.3 @@ -74,6 +74,12 @@
1.4 return (base_offset <= position) && (position < (base_offset + size));
1.5 }
1.6
1.7 +void Flexpage::upgrade(unsigned long flags)
1.8 +{
1.9 + if (flags && (flags != _flags))
1.10 + _flags |= flags;
1.11 +}
1.12 +
1.13 /* Return a "send" flexpage for an access to 'offset' by positioning it relative
1.14 to 'hot_spot' for the receive flexpage window. */
1.15
1.16 @@ -100,7 +106,7 @@
1.17 receive_size = size;
1.18
1.19 if (!receive_size)
1.20 - return SendFlexpage(base_addr, page_order(0));
1.21 + return SendFlexpage(base_addr, page_order(0), _flags);
1.22
1.23 offset_t receive_page_offset = hot_spot % receive_size;
1.24
1.25 @@ -116,14 +122,14 @@
1.26
1.27 offset_t adjustment = page_offset - receive_page_offset;
1.28
1.29 - return SendFlexpage(base_addr + adjustment, page_order(receive_size));
1.30 + return SendFlexpage(base_addr + adjustment, page_order(receive_size), _flags);
1.31 }
1.32
1.33 /* Return a representation of the flexpage for unmapping. */
1.34
1.35 SendFlexpage Flexpage::to_unmap()
1.36 {
1.37 - return SendFlexpage(base_addr, page_order(size));
1.38 + return SendFlexpage(base_addr, page_order(size), _flags);
1.39 }
1.40
1.41 /* Debugging methods. */
2.1 --- a/flexpage.h Mon Feb 01 00:10:21 2021 +0100
2.2 +++ b/flexpage.h Mon Feb 01 01:04:30 2021 +0100
2.3 @@ -14,6 +14,7 @@
2.4 {
2.5 protected:
2.6 unsigned int _counter;
2.7 + unsigned long _flags;
2.8
2.9 public:
2.10 Region *region;
2.11 @@ -45,6 +46,8 @@
2.12
2.13 bool supports_position(offset_t position);
2.14
2.15 + void upgrade(unsigned long flags);
2.16 +
2.17 SendFlexpage to_send(offset_t offset, offset_t hot_spot, offset_t max_offset=0);
2.18
2.19 SendFlexpage to_unmap();
3.1 --- a/ipc.cc Mon Feb 01 00:10:21 2021 +0100
3.2 +++ b/ipc.cc Mon Feb 01 01:04:30 2021 +0100
3.3 @@ -9,26 +9,24 @@
3.4
3.5 /* Make an L4 representation of the given flexpage. */
3.6
3.7 -static l4_fpage_t ipc_get_fpage(SendFlexpage *send_flexpage, unsigned long flags)
3.8 +static l4_fpage_t ipc_get_fpage(SendFlexpage *send_flexpage)
3.9 {
3.10 - // NOTE: To introduce flags properly in the flexpage abstractions.
3.11 -
3.12 return l4_fpage(send_flexpage->base_addr, send_flexpage->order,
3.13 - (flags & L4RE_DS_MAP_FLAG_RW) ? L4_FPAGE_RW : L4_FPAGE_RO);
3.14 + (send_flexpage->flags & L4RE_DS_MAP_FLAG_RW) ? L4_FPAGE_RW : L4_FPAGE_RO);
3.15 }
3.16
3.17 /* Make a representation of a flexpage for the IPC system. */
3.18
3.19 long ipc_prepare_flexpage(Flexpage *flexpage, unsigned long offset,
3.20 unsigned long max_offset, l4_addr_t hot_spot,
3.21 - unsigned long flags, l4_snd_fpage_t *region)
3.22 + l4_snd_fpage_t *region)
3.23 {
3.24 SendFlexpage send_flexpage = flexpage->to_send(offset, hot_spot, max_offset);
3.25
3.26 if (!send_flexpage.order)
3.27 return -L4_ERANGE;
3.28
3.29 - region->fpage = ipc_get_fpage(&send_flexpage, flags);
3.30 + region->fpage = ipc_get_fpage(&send_flexpage);
3.31 region->snd_base = hot_spot;
3.32
3.33 return L4_EOK;
3.34 @@ -40,9 +38,7 @@
3.35 {
3.36 SendFlexpage send_flexpage = flexpage->to_unmap();
3.37
3.38 - // NOTE: To introduce flags properly in the flexpage abstractions.
3.39 -
3.40 - l4_task_unmap(L4RE_THIS_TASK_CAP, ipc_get_fpage(&send_flexpage, L4_FPAGE_RW), L4_FP_OTHER_SPACES);
3.41 + l4_task_unmap(L4RE_THIS_TASK_CAP, ipc_get_fpage(&send_flexpage), L4_FP_OTHER_SPACES);
3.42 }
3.43
3.44 // vim: tabstop=4 expandtab shiftwidth=4
4.1 --- a/ipc.h Mon Feb 01 00:10:21 2021 +0100
4.2 +++ b/ipc.h Mon Feb 01 01:04:30 2021 +0100
4.3 @@ -8,7 +8,7 @@
4.4
4.5 long ipc_prepare_flexpage(Flexpage *flexpage, unsigned long offset,
4.6 unsigned long max_offset, l4_addr_t hot_spot,
4.7 - unsigned long flags, l4_snd_fpage_t *region);
4.8 + l4_snd_fpage_t *region);
4.9
4.10 void ipc_unmap_flexpage(Flexpage *flexpage);
4.11
5.1 --- a/page_mapper.cc Mon Feb 01 00:10:21 2021 +0100
5.2 +++ b/page_mapper.cc Mon Feb 01 01:04:30 2021 +0100
5.3 @@ -54,7 +54,7 @@
5.4 same details, with the lock held until the queue or flush_all operations
5.5 release the lock. */
5.6
5.7 -Flexpage *PageMapper::get(offset_t offset)
5.8 +Flexpage *PageMapper::get(offset_t offset, unsigned long flags)
5.9 {
5.10 _lock.lock();
5.11
5.12 @@ -63,7 +63,10 @@
5.13 if (f == NULL)
5.14 f = flexpage(offset);
5.15
5.16 + /* Record a new user of the flexpage and upgrade the access flags. */
5.17 +
5.18 f->increment();
5.19 + f->upgrade(flags);
5.20 return f;
5.21 }
5.22
6.1 --- a/page_mapper.h Mon Feb 01 00:10:21 2021 +0100
6.2 +++ b/page_mapper.h Mon Feb 01 01:04:30 2021 +0100
6.3 @@ -34,7 +34,7 @@
6.4
6.5 /* Interface for the pager. */
6.6
6.7 - Flexpage *get(offset_t offset);
6.8 + Flexpage *get(offset_t offset, unsigned long flags);
6.9
6.10 void queue(Flexpage *flexpage);
6.11
7.1 --- a/pager.cc Mon Feb 01 00:10:21 2021 +0100
7.2 +++ b/pager.cc Mon Feb 01 01:04:30 2021 +0100
7.3 @@ -36,11 +36,11 @@
7.4 {
7.5 offset_t file_offset = _start + offset;
7.6 offset_t max_offset = _start + _size;
7.7 - Flexpage *flexpage = _mapper->get(file_offset);
7.8 + Flexpage *flexpage = _mapper->get(file_offset, flags);
7.9
7.10 /* Issue the flexpage via the IPC system. */
7.11
7.12 - long err = ipc_prepare_flexpage(flexpage, file_offset, max_offset, hot_spot, flags, region);
7.13 + long err = ipc_prepare_flexpage(flexpage, file_offset, max_offset, hot_spot, region);
7.14
7.15 if (err)
7.16 return err;
8.1 --- a/send_flexpage.h Mon Feb 01 00:10:21 2021 +0100
8.2 +++ b/send_flexpage.h Mon Feb 01 01:04:30 2021 +0100
8.3 @@ -9,9 +9,11 @@
8.4 public:
8.5 offset_t base_addr;
8.6 unsigned int order;
8.7 + unsigned long flags;
8.8
8.9 - explicit SendFlexpage(offset_t base_addr, unsigned int order)
8.10 - : base_addr(base_addr), order(order)
8.11 + explicit SendFlexpage(offset_t base_addr, unsigned int order,
8.12 + unsigned long flags)
8.13 + : base_addr(base_addr), order(order), flags(flags)
8.14 {
8.15 }
8.16 };
9.1 --- a/simple_pager.cc Mon Feb 01 00:10:21 2021 +0100
9.2 +++ b/simple_pager.cc Mon Feb 01 01:04:30 2021 +0100
9.3 @@ -33,10 +33,11 @@
9.4 Flexpage flexpage(_region);
9.5
9.6 flexpage.reset(offset);
9.7 + flexpage.upgrade(flags);
9.8
9.9 /* Send the flexpage explicitly. */
9.10
9.11 - long err = ipc_prepare_flexpage(&flexpage, offset, _region->size(), hot_spot, flags, region);
9.12 + long err = ipc_prepare_flexpage(&flexpage, offset, _region->size(), hot_spot, region);
9.13
9.14 if (err)
9.15 return err;