summaryrefslogtreecommitdiff
path: root/mach-defpager
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2021-12-30 00:09:32 +0100
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2021-12-30 00:10:07 +0100
commitbe8fbc0fa5a36d538cf34df8d6f0d30683075851 (patch)
tree5f053dfd393dfd0223e005f13ffe52b7f12d39fe /mach-defpager
parent2a297c298df1eeea6a2839fcbc121f1b1aa13d81 (diff)
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.c6
-rw-r--r--mach-defpager/main.c4
-rw-r--r--mach-defpager/wiring.c75
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);
- }
-}