Writing Device Drivers

segmap(9E)

int xxsegmap(dev_t dev, off_t off, struct as *asp, caddr_t *addrp,
 	off_t len, unsigned int prot, unsigned int maxprot,
 	unsigned int flags, cred_t *credp);

segmap(9E) is the entry point responsible for actually setting up a memory mapping requested by the system on behalf of an mmap(2) system call. Drivers for many memory-mapped devices will use ddi_devmap_segmap(9F) as the entry point rather than define their own segmap(9E) routine.

If a driver wants to check mapping permissions or allocate private mapping resources before setting up the mapping, the driver can provide its own segmap(9E) entry point. segmap(9E) must call devmap_setup(9F) before returning.

In Example 9-10, the driver controls a frame buffer that allows write-only mappings. The driver returns EINVAL if the application tries to gain read access and then calls devmap_setup(9F) to set up the user mapping.


Example 9-10 segmap(9E) Routine

static int
xxsegmap(dev_t dev, off_t off, struct as *asp, caddr_t *addrp,
	off_t len, unsigned int prot, unsigned int maxprot,
	unsigned int flags, cred_t *credp)
{
	   if (prot & PROT_READ)
		    return (EINVAL);
 	return (devmap_setup(dev, (offset_t)off, as, addrp,
   (size_t)len, prot, maxprot, flags, cred));
} 

devmap(9E)

int xxdevmap(dev_t dev, devmap_cookie_t handle, offset_t off,
 	size_t len, size_t *maplen, uint_t model);

This entry point is called to export device memory or kernel memory to user applications. devmap(9E) is called from devmap_setup(9F) inside segmap(9E) or on behalf of ddi_devmap_segmap(9F). See Chapter 11, Mapping Device or Kernel Memory and Chapter 12, Device Context Management for details.