diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2021-12-30 00:09:32 +0100 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2021-12-30 00:10:07 +0100 |
commit | be8fbc0fa5a36d538cf34df8d6f0d30683075851 (patch) | |
tree | 5f053dfd393dfd0223e005f13ffe52b7f12d39fe /mach-defpager | |
parent | 2a297c298df1eeea6a2839fcbc121f1b1aa13d81 (diff) | |
download | hurd-be8fbc0fa5a36d538cf34df8d6f0d30683075851.tar.gz hurd-be8fbc0fa5a36d538cf34df8d6f0d30683075851.tar.bz2 hurd-be8fbc0fa5a36d538cf34df8d6f0d30683075851.zip |
wire_task_self: Use in various translators
wire_task_self() was duplicating mach-defpager's wire_all_memory(), we
can just make mach-defpager now use the former (and not mlockall
either). Also pci-arbiter and rumpdisk can use it.
Diffstat (limited to 'mach-defpager')
-rw-r--r-- | mach-defpager/default_pager.c | 6 | ||||
-rw-r--r-- | mach-defpager/main.c | 4 | ||||
-rw-r--r-- | mach-defpager/wiring.c | 75 |
3 files changed, 4 insertions, 81 deletions
diff --git a/mach-defpager/default_pager.c b/mach-defpager/default_pager.c index 8b1f37d3..afdcc99e 100644 --- a/mach-defpager/default_pager.c +++ b/mach-defpager/default_pager.c @@ -3091,6 +3091,7 @@ default_pager_initialize(host_port) void default_pager() { + error_t err; kern_return_t kr; int i; @@ -3099,8 +3100,9 @@ default_pager() /* * Wire down code, data, stack */ - wire_all_memory(); - + err = wire_task_self(); + if (err) + error (1, errno, "cannot lock all memory"); /* * Initialize the list of all pagers. diff --git a/mach-defpager/main.c b/mach-defpager/main.c index 95e66703..0e42040b 100644 --- a/mach-defpager/main.c +++ b/mach-defpager/main.c @@ -90,10 +90,6 @@ main (int argc, char **argv) if (err) error (1, err, "cannot get privileged ports"); - err = mlockall(MCL_CURRENT | MCL_FUTURE); - if (err) - error (1, errno, "cannot lock all memory"); - defpager = MACH_PORT_NULL; err = vm_set_default_memory_manager (bootstrap_master_host_port, &defpager); if (err) diff --git a/mach-defpager/wiring.c b/mach-defpager/wiring.c index ac20dda7..43ed91de 100644 --- a/mach-defpager/wiring.c +++ b/mach-defpager/wiring.c @@ -58,78 +58,3 @@ wire_thread() if (kr != KERN_SUCCESS) panic("wire_thread: %d", kr); } - -void -wire_all_memory() -{ - kern_return_t kr; - vm_offset_t address; - vm_size_t size; - vm_prot_t protection; - vm_prot_t max_protection; - vm_inherit_t inheritance; - boolean_t is_shared; - memory_object_name_t object; - vm_offset_t offset; - - if (priv_host_port == MACH_PORT_NULL) - return; - - /* iterate through all regions, wiring */ - address = 0; - while ( - (kr = vm_region(this_task, &address, - &size, - &protection, - &max_protection, - &inheritance, - &is_shared, - &object, - &offset)) - == KERN_SUCCESS) - { - if (MACH_PORT_VALID(object)) - (void) mach_port_deallocate(this_task, object); - if (protection != VM_PROT_NONE) - { - /* The VM system cannot cope with a COW fault on another - unrelated virtual copy happening later when we have - wired down the original page. So we must touch all our - pages before wiring to make sure that only we will ever - use them. */ - void *page; - if (!(protection & VM_PROT_WRITE)) - { - kr = vm_protect(this_task, address, size, - 0, max_protection); - } - for (page = (void *) address; - page < (void *) (address + size); - page += vm_page_size) - *(volatile int *) page = *(int *) page; - - kr = vm_wire(priv_host_port, this_task, - address, size, protection); - if (kr != KERN_SUCCESS) - panic("vm_wire: %d", kr); - - if (!(protection & VM_PROT_WRITE)) - { - kr = vm_protect(this_task, address, size, - 0, protection); - } - } - address += size; - } - - /* - * Automatically wire down future mappings, including those - * that are currently PROT_NONE but become accessible. - */ - - kr = vm_wire_all(priv_host_port, this_task, VM_WIRE_ALL); - - if (kr != KERN_SUCCESS) { - panic("wire_all_memory: %d", kr); - } -} |