diff --git a/sys/conf/files b/sys/conf/files index 3419e48..39328ee 100644 --- a/sys/conf/files +++ b/sys/conf/files @@ -4692,3 +4692,4 @@ xdr/xdr_mbuf.c optional krpc | nfslockd | nfscl | nfsd xdr/xdr_mem.c optional krpc | nfslockd | nfscl | nfsd xdr/xdr_reference.c optional krpc | nfslockd | nfscl | nfsd xdr/xdr_sizeof.c optional krpc | nfslockd | nfscl | nfsd +dev/dummy.c standard diff --git a/sys/dev/dummy.c b/sys/dev/dummy.c new file mode 100644 index 0000000..381e76a --- /dev/null +++ b/sys/dev/dummy.c @@ -0,0 +1,141 @@ +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +static d_mmap_single_t dummy_mmap_single; + +static struct cdevsw dummy_devsw = { + .d_version = D_VERSION, + .d_mmap_single = dummy_mmap_single, + .d_name = "dummy", +}; + +static int dummy_pg_ctor(void *handle, vm_ooffset_t size, vm_prot_t prot, + vm_ooffset_t foff, struct ucred *cred, u_short *color); +static void dummy_pg_dtor(void *handle); +static int dummy_pg_fault(vm_object_t object, vm_ooffset_t offset, + int prot, vm_page_t *mres); + +static struct cdev_pager_ops dummy_pg_ops = { + .cdev_pg_fault = dummy_pg_fault, + .cdev_pg_ctor = dummy_pg_ctor, + .cdev_pg_dtor = dummy_pg_dtor, +}; + +/*------------------------- Privcmd Pager functions --------------------------*/ +static int +dummy_pg_ctor(void *handle, vm_ooffset_t size, vm_prot_t prot, + vm_ooffset_t foff, struct ucred *cred, u_short *color) +{ + + return (0); +} + +static void +dummy_pg_dtor(void *handle) +{ +} + +static int +dummy_pg_fault(vm_object_t object, vm_ooffset_t offset, + int prot, vm_page_t *mres) +{ + + printf("Page-fault handler called\n"); + return (VM_PAGER_FAIL); +} + +/*----------------------- Privcmd char device methods ------------------------*/ +static int +dummy_mmap_single(struct cdev *cdev, vm_ooffset_t *offset, vm_size_t size, + vm_object_t *object, int nprot) +{ + + printf("size: %#lx offset: %#lx\n", size, *offset); + + *object = cdev_pager_allocate(cdev, OBJT_MGTDEVICE, &dummy_pg_ops, + size, nprot, *offset, NULL); + if (*object == NULL) { + printf("Failed to alloc pager\n"); + return (ENOMEM); + } + + return (0); +} + +/*------------------ Private Device Attachment Functions --------------------*/ +static void +dummy_identify(driver_t *driver, device_t parent) +{ + + if (BUS_ADD_CHILD(parent, 0, "dummy", 0) == NULL) + panic("unable to attach dummy user-space device"); +} + +static int +dummy_probe(device_t dev) +{ + + device_set_desc(dev, "Dummy mmap user-space device"); + return (BUS_PROBE_NOWILDCARD); +} + +static int +dummy_attach(device_t dev) +{ + + make_dev_credf(MAKEDEV_ETERNAL, &dummy_devsw, 0, NULL, UID_ROOT, + GID_WHEEL, 0600, "dummy"); + return (0); +} + +/*-------------------- Private Device Attachment Data -----------------------*/ +static device_method_t dummy_methods[] = { + DEVMETHOD(device_identify, dummy_identify), + DEVMETHOD(device_probe, dummy_probe), + DEVMETHOD(device_attach, dummy_attach), + + DEVMETHOD_END +}; + +static driver_t dummy_driver = { + "dummy", + dummy_methods, + 0, +}; + +devclass_t dummy_devclass; + +DRIVER_MODULE(dummy, nexus, dummy_driver, dummy_devclass, 0, 0); +MODULE_DEPEND(dummy, nexus, 1, 1, 1);