diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2021-01-04 01:53:01 +0100 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2021-01-04 03:29:09 +0100 |
commit | d7278d1176391dc717293111042c3fcb56e6ca85 (patch) | |
tree | f9e2be107b876c59a46cd9d965cf0571e95713b0 /vm | |
parent | ae7bdaf9ed238500aaa91080126fff356e5e2800 (diff) | |
download | gnumach-d7278d1176391dc717293111042c3fcb56e6ca85.tar.gz gnumach-d7278d1176391dc717293111042c3fcb56e6ca85.tar.bz2 gnumach-d7278d1176391dc717293111042c3fcb56e6ca85.zip |
vm_map: Avoid linking gaps for vm_copy_t
This does not make sense, and produces incorrect results (since
vme_end is 0, etc.)
* vm/vm_map.h (_vm_map_clip_start, _vm_map_clip_end): Add link_gap
parameter.
* vm/vm_map.c (_vm_map_entry_link): Add link_gap parameter, do not call
vm_map_gap_insert if it is 0.
(vm_map_entry_link): Set link_gap to 1 in _vm_map_entry_link call.
(_vm_map_clip_start): Add link_gap parameter, pass it to
_vm_map_entry_link call..
(vm_map_clip_start): Set link_gap_to 1 in _vm_map_clip_start call.
(vm_map_copy_entry_link): Set link_gap to 0 in _vm_map_entry_link call.
(vm_map_copy_clip_start): Set link_gap_to 0 in _vm_map_clip_start call.
(_vm_map_entry_unlink): Add unlink_gap parameter, do not call
vm_map_gap_remove if it is 0.
(vm_map_entry_unlink): Set unlink_gap to 1 in _vm_map_entry_unlink call.
(_vm_map_clip_end): Add link_gap parameter, pass it to
_vm_map_entry_link call..
(vm_map_clip_end): Set link_gap_to 1 in _vm_map_clip_end call.
(vm_map_copy_entry_unlink): Set unlink_gap to 0 in _vm_map_entry_unlink call.
(vm_map_copy_clip_end): Set link_gap_to 0 in _vm_map_clip_end call.
* vm/vm_kern.c (projected_buffer_deallocate): set link_gap to 1 in
_vm_map_clip_start and _vm_map_clip_end calls.
Diffstat (limited to 'vm')
-rw-r--r-- | vm/vm_kern.c | 4 | ||||
-rw-r--r-- | vm/vm_map.c | 36 | ||||
-rw-r--r-- | vm/vm_map.h | 6 |
3 files changed, 26 insertions, 20 deletions
diff --git a/vm/vm_kern.c b/vm/vm_kern.c index 8ecd2ed9..705b0acb 100644 --- a/vm/vm_kern.c +++ b/vm/vm_kern.c @@ -271,9 +271,9 @@ projected_buffer_deallocate( /*Prepare for deallocation*/ if (entry->vme_start < start) - _vm_map_clip_start(&map->hdr, entry, start); + _vm_map_clip_start(&map->hdr, entry, start, 1); if (entry->vme_end > end) - _vm_map_clip_end(&map->hdr, entry, end); + _vm_map_clip_end(&map->hdr, entry, end, 1); if (map->first_free == entry) /*Adjust first_free hint*/ map->first_free = entry->vme_prev; entry->projected_on = 0; /*Needed to allow deletion*/ diff --git a/vm/vm_map.c b/vm/vm_map.c index 9bd67474..f8f265c2 100644 --- a/vm/vm_map.c +++ b/vm/vm_map.c @@ -481,12 +481,12 @@ vm_map_gap_remove(struct vm_map_header *hdr, struct vm_map_entry *entry) * before using these macros. */ #define vm_map_entry_link(map, after_where, entry) \ - _vm_map_entry_link(&(map)->hdr, after_where, entry) + _vm_map_entry_link(&(map)->hdr, after_where, entry, 1) #define vm_map_copy_entry_link(copy, after_where, entry) \ - _vm_map_entry_link(&(copy)->cpy_hdr, after_where, entry) + _vm_map_entry_link(&(copy)->cpy_hdr, after_where, entry, 0) -#define _vm_map_entry_link(hdr, after_where, entry) \ +#define _vm_map_entry_link(hdr, after_where, entry, link_gap) \ MACRO_BEGIN \ (hdr)->nentries++; \ (entry)->vme_prev = (after_where); \ @@ -495,22 +495,24 @@ vm_map_gap_remove(struct vm_map_header *hdr, struct vm_map_entry *entry) (entry)->vme_next->vme_prev = (entry); \ rbtree_insert(&(hdr)->tree, &(entry)->tree_node, \ vm_map_entry_cmp_insert); \ - vm_map_gap_insert((hdr), (entry)); \ + if (link_gap) \ + vm_map_gap_insert((hdr), (entry)); \ MACRO_END #define vm_map_entry_unlink(map, entry) \ - _vm_map_entry_unlink(&(map)->hdr, entry) + _vm_map_entry_unlink(&(map)->hdr, entry, 1) #define vm_map_copy_entry_unlink(copy, entry) \ - _vm_map_entry_unlink(&(copy)->cpy_hdr, entry) + _vm_map_entry_unlink(&(copy)->cpy_hdr, entry, 0) -#define _vm_map_entry_unlink(hdr, entry) \ +#define _vm_map_entry_unlink(hdr, entry, unlink_gap) \ MACRO_BEGIN \ (hdr)->nentries--; \ (entry)->vme_next->vme_prev = (entry)->vme_prev; \ (entry)->vme_prev->vme_next = (entry)->vme_next; \ rbtree_remove(&(hdr)->tree, &(entry)->tree_node); \ - vm_map_gap_remove((hdr), (entry)); \ + if (unlink_gap) \ + vm_map_gap_remove((hdr), (entry)); \ MACRO_END /* @@ -1181,13 +1183,13 @@ kern_return_t vm_map_enter( #define vm_map_clip_start(map, entry, startaddr) \ MACRO_BEGIN \ if ((startaddr) > (entry)->vme_start) \ - _vm_map_clip_start(&(map)->hdr,(entry),(startaddr)); \ + _vm_map_clip_start(&(map)->hdr,(entry),(startaddr),1); \ MACRO_END #define vm_map_copy_clip_start(copy, entry, startaddr) \ MACRO_BEGIN \ if ((startaddr) > (entry)->vme_start) \ - _vm_map_clip_start(&(copy)->cpy_hdr,(entry),(startaddr)); \ + _vm_map_clip_start(&(copy)->cpy_hdr,(entry),(startaddr),0); \ MACRO_END /* @@ -1197,7 +1199,8 @@ kern_return_t vm_map_enter( void _vm_map_clip_start( struct vm_map_header *map_header, vm_map_entry_t entry, - vm_offset_t start) + vm_offset_t start, + boolean_t link_gap) { vm_map_entry_t new_entry; @@ -1216,7 +1219,7 @@ void _vm_map_clip_start( entry->offset += (start - entry->vme_start); entry->vme_start = start; - _vm_map_entry_link(map_header, entry->vme_prev, new_entry); + _vm_map_entry_link(map_header, entry->vme_prev, new_entry, link_gap); if (entry->is_sub_map) vm_map_reference(new_entry->object.sub_map); @@ -1234,13 +1237,13 @@ void _vm_map_clip_start( #define vm_map_clip_end(map, entry, endaddr) \ MACRO_BEGIN \ if ((endaddr) < (entry)->vme_end) \ - _vm_map_clip_end(&(map)->hdr,(entry),(endaddr)); \ + _vm_map_clip_end(&(map)->hdr,(entry),(endaddr),1); \ MACRO_END #define vm_map_copy_clip_end(copy, entry, endaddr) \ MACRO_BEGIN \ if ((endaddr) < (entry)->vme_end) \ - _vm_map_clip_end(&(copy)->cpy_hdr,(entry),(endaddr)); \ + _vm_map_clip_end(&(copy)->cpy_hdr,(entry),(endaddr),0); \ MACRO_END /* @@ -1250,7 +1253,8 @@ void _vm_map_clip_start( void _vm_map_clip_end( struct vm_map_header *map_header, vm_map_entry_t entry, - vm_offset_t end) + vm_offset_t end, + boolean_t link_gap) { vm_map_entry_t new_entry; @@ -1265,7 +1269,7 @@ void _vm_map_clip_end( new_entry->vme_start = entry->vme_end = end; new_entry->offset += (end - entry->vme_start); - _vm_map_entry_link(map_header, entry, new_entry); + _vm_map_entry_link(map_header, entry, new_entry, link_gap); if (entry->is_sub_map) vm_map_reference(new_entry->object.sub_map); diff --git a/vm/vm_map.h b/vm/vm_map.h index 2561ec44..57bdf651 100644 --- a/vm/vm_map.h +++ b/vm/vm_map.h @@ -560,7 +560,8 @@ extern kern_return_t vm_map_submap( extern void _vm_map_clip_start( struct vm_map_header *map_header, vm_map_entry_t entry, - vm_offset_t start); + vm_offset_t start, + boolean_t link_gap); /* * vm_map_clip_end: [ internal use only ] @@ -572,6 +573,7 @@ extern void _vm_map_clip_start( void _vm_map_clip_end( struct vm_map_header *map_header, vm_map_entry_t entry, - vm_offset_t end); + vm_offset_t end, + boolean_t link_gap); #endif /* _VM_VM_MAP_H_ */ |