aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/mem/memdev.c
diff options
context:
space:
mode:
authorMark Johnston <markj@FreeBSD.org>2020-09-16 13:46:58 +0000
committerMark Johnston <markj@FreeBSD.org>2020-09-16 13:46:58 +0000
commit3aec534121f32ba9a89590554d19b4126f358b37 (patch)
treef837ad51126619e5035fd3a1134a5e5e34255e0b /sys/dev/mem/memdev.c
parent88f392e15c26b55211ecd6eea95c199348059bda (diff)
Notes
Diffstat (limited to 'sys/dev/mem/memdev.c')
-rw-r--r--sys/dev/mem/memdev.c45
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)