diff options
| author | Mark Johnston <markj@FreeBSD.org> | 2020-09-16 13:46:58 +0000 |
|---|---|---|
| committer | Mark Johnston <markj@FreeBSD.org> | 2020-09-16 13:46:58 +0000 |
| commit | 3aec534121f32ba9a89590554d19b4126f358b37 (patch) | |
| tree | f837ad51126619e5035fd3a1134a5e5e34255e0b /sys/dev/mem/memdev.c | |
| parent | 88f392e15c26b55211ecd6eea95c199348059bda (diff) | |
Notes
Diffstat (limited to 'sys/dev/mem/memdev.c')
| -rw-r--r-- | sys/dev/mem/memdev.c | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/sys/dev/mem/memdev.c b/sys/dev/mem/memdev.c index 2436c173418b..8094cf827ce8 100644 --- a/sys/dev/mem/memdev.c +++ b/sys/dev/mem/memdev.c @@ -33,6 +33,7 @@ __FBSDID("$FreeBSD$"); #include <sys/param.h> #include <sys/conf.h> #include <sys/fcntl.h> +#include <sys/ioccom.h> #include <sys/kernel.h> #include <sys/lock.h> #include <sys/malloc.h> @@ -46,12 +47,19 @@ __FBSDID("$FreeBSD$"); #include <sys/uio.h> #include <vm/vm.h> +#include <vm/vm_param.h> #include <vm/pmap.h> +#include <vm/vm_map.h> +#include <vm/vm_object.h> +#include <vm/vm_page.h> +#include <vm/vm_phys.h> #include <machine/memdev.h> static struct cdev *memdev, *kmemdev; +static d_ioctl_t memioctl; + static struct cdevsw mem_cdevsw = { .d_version = D_VERSION, .d_flags = D_MEM, @@ -82,6 +90,43 @@ memopen(struct cdev *dev __unused, int flags, int fmt __unused, return (error); } +static int +memioctl(struct cdev *dev, u_long cmd, caddr_t data, int flags, + struct thread *td) +{ + vm_map_t map; + vm_map_entry_t entry; + struct mem_extract *me; + int error; + + error = 0; + switch (cmd) { + case MEM_EXTRACT_PADDR: + me = (struct mem_extract *)data; + + map = &td->td_proc->p_vmspace->vm_map; + vm_map_lock_read(map); + if (vm_map_lookup_entry(map, me->me_vaddr, &entry)) { + me->me_paddr = pmap_extract( + &td->td_proc->p_vmspace->vm_pmap, me->me_vaddr); + if (me->me_paddr != 0) { + me->me_state = ME_STATE_MAPPED; + me->me_domain = _vm_phys_domain(me->me_paddr); + } else { + me->me_state = ME_STATE_VALID; + } + } else { + me->me_state = ME_STATE_INVALID; + } + vm_map_unlock_read(map); + break; + default: + error = memioctl_md(dev, cmd, data, flags, td); + break; + } + return (error); +} + /* ARGSUSED */ static int mem_modevent(module_t mod __unused, int type, void *data __unused) |
