diff options
author | Joan Lledó <jlledom@member.fsf.org> | 2021-02-13 13:09:52 +0100 |
---|---|---|
committer | Joan Lledó <jlledom@member.fsf.org> | 2021-11-21 11:40:17 +0100 |
commit | c7f5eb16ea0d3305d524a14a4d0649fe94cac23e (patch) | |
tree | e9d7db42573223b06b10aa6f05d1a83909da020e | |
parent | 86b0307e489558fe661e2877f4945240230984bf (diff) |
pci-arbiter: Fix bug on netfs_get_filemap()
Take the right pager to create the proxy from
-rw-r--r-- | pci-arbiter/netfs_impl.c | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/pci-arbiter/netfs_impl.c b/pci-arbiter/netfs_impl.c index 93a234bf..b3ca5bc6 100644 --- a/pci-arbiter/netfs_impl.c +++ b/pci-arbiter/netfs_impl.c @@ -31,6 +31,7 @@ #include <hurd/netfs.h> #include <hurd/paths.h> #include <mach/mach4.h> +#include <device/device.h> #include "pcifs.h" #include "ncache.h" @@ -570,9 +571,10 @@ mach_port_t netfs_get_filemap (struct node *node, vm_prot_t prot) { error_t err; - mach_port_t host_priv; + mach_port_t master_device, devmem; memory_object_t default_pager, proxy; - vm_prot_t max_prot; + dev_mode_t mode; + vm_prot_t mprot, max_prot; size_t reg_num, count; struct pci_mem_region *region; memory_object_t objects[1]; @@ -593,8 +595,13 @@ netfs_get_filemap (struct node *node, vm_prot_t prot) return node->nn->ln->memproxy; } + /* Get region info */ + reg_num = + strtol (&node->nn->ln->name[strlen (node->nn->ln->name) - 1], 0, 16); + region = &node->nn->ln->device->regions[reg_num]; + /* Get our port to the default pager */ - err = get_privileged_ports (&host_priv, NULL); + err = get_privileged_ports (NULL, &master_device); if (err == EPERM) { default_pager = file_name_lookup (_SERVERS_DEFPAGER, O_EXEC, 0); @@ -605,9 +612,13 @@ netfs_get_filemap (struct node *node, vm_prot_t prot) goto error; else { - default_pager = MACH_PORT_NULL; - err = vm_set_default_memory_manager (host_priv, &default_pager); - mach_port_deallocate (mach_task_self (), host_priv); + mode = D_READ | D_WRITE; + mprot = VM_PROT_READ | VM_PROT_WRITE; + err = device_open (master_device, mode, "mem", &devmem); + if (err) + goto error; + err = device_map (devmem, mprot, 0x0, region->base_addr * region->size, + &default_pager, 0); if (err) goto error; } @@ -616,9 +627,6 @@ netfs_get_filemap (struct node *node, vm_prot_t prot) /* Get all params to create the proxy */ max_prot = (VM_PROT_READ | VM_PROT_WRITE) & prot; - reg_num = - strtol (&node->nn->ln->name[strlen (node->nn->ln->name) - 1], 0, 16); - region = &node->nn->ln->device->regions[reg_num]; objects[0] = default_pager; offsets[0] = 0; starts[0] = region->base_addr; |