svn commit: r194275 - projects/mips/sys/mips/mips

Oleksandr Tymoshenko gonzo at FreeBSD.org
Tue Jun 16 01:43:34 UTC 2009


Author: gonzo
Date: Tue Jun 16 01:43:33 2009
New Revision: 194275
URL: http://svn.freebsd.org/changeset/base/194275

Log:
  - Handle KSEG0/KSEG1 addresses for /dev/mem as well. netstat requires it

Modified:
  projects/mips/sys/mips/mips/mem.c

Modified: projects/mips/sys/mips/mips/mem.c
==============================================================================
--- projects/mips/sys/mips/mips/mem.c	Tue Jun 16 00:09:06 2009	(r194274)
+++ projects/mips/sys/mips/mips/mem.c	Tue Jun 16 01:43:33 2009	(r194275)
@@ -124,8 +124,10 @@ memrw(dev, uio, flags)
 				pmap_unmap_fpage(pa, fp);
 				sched_unpin();
 				mtx_unlock(&sysmaps->lock);
-			} else
+			} else {
+				printf("NOT OK\n");
 				return (EFAULT);
+			}
 			continue;
 		}
 
@@ -133,6 +135,7 @@ memrw(dev, uio, flags)
 		else if (dev2unit(dev) == CDEV_MINOR_KMEM) {
 			v = uio->uio_offset;
 			c = min(iov->iov_len, MAXPHYS);
+
 			vm_offset_t addr, eaddr;
 			vm_offset_t wired_tlb_virtmem_end;
 
@@ -143,25 +146,37 @@ memrw(dev, uio, flags)
 			addr = trunc_page(uio->uio_offset);
 			eaddr = round_page(uio->uio_offset + c);
 
-			if (addr < (vm_offset_t) VM_MIN_KERNEL_ADDRESS)
-				return EFAULT;
-
-			wired_tlb_virtmem_end = VM_MIN_KERNEL_ADDRESS +
-			    VM_KERNEL_ALLOC_OFFSET;
-			if ((addr < wired_tlb_virtmem_end) &&
-			    (eaddr >= wired_tlb_virtmem_end))
-				addr = wired_tlb_virtmem_end;
-
-			if (addr >= wired_tlb_virtmem_end) {
-				for (; addr < eaddr; addr += PAGE_SIZE) 
-					if (pmap_extract(kernel_pmap,addr) == 0)
-						return EFAULT;
-
-				if (!kernacc((caddr_t)(int)uio->uio_offset, c,
-				    uio->uio_rw == UIO_READ ?
-				    VM_PROT_READ : VM_PROT_WRITE))
+			if (addr > (vm_offset_t) VM_MIN_KERNEL_ADDRESS) {
+				wired_tlb_virtmem_end = VM_MIN_KERNEL_ADDRESS +
+				    VM_KERNEL_ALLOC_OFFSET;
+				if ((addr < wired_tlb_virtmem_end) &&
+				    (eaddr >= wired_tlb_virtmem_end))
+					addr = wired_tlb_virtmem_end;
+
+				if (addr >= wired_tlb_virtmem_end) {
+					for (; addr < eaddr; addr += PAGE_SIZE) 
+						if (pmap_extract(kernel_pmap,
+						    addr) == 0)
+							return EFAULT;
+
+					if (!kernacc(
+					    (caddr_t)(int)uio->uio_offset, c,
+					    uio->uio_rw == UIO_READ ?
+					    VM_PROT_READ : VM_PROT_WRITE))
+						return (EFAULT);
+				}
+			}
+			else if (MIPS_IS_KSEG0_ADDR(v)) {
+				if (MIPS_KSEG0_TO_PHYS(v + c) >= ctob(physmem))
 					return (EFAULT);
 			}
+			else if (MIPS_IS_KSEG1_ADDR(v)) {
+				if (MIPS_KSEG1_TO_PHYS(v + c) >= ctob(physmem))
+					return (EFAULT);
+			}
+			else
+				return (EFAULT);
+
 
 			error = uiomove((caddr_t)v, c, uio);
 			continue;


More information about the svn-src-projects mailing list