Date: Mon, 14 Oct 1996 06:19:09 +0800 (WST) From: Peter Wemm <peter@spinner.DIALix.COM> To: FreeBSD-gnats-submit@freebsd.org Subject: kern/1790: access to /dev/kmem panics system Message-ID: <199610132219.GAA02432@spinner.DIALix.COM> Resent-Message-ID: <199610132220.PAA08753@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 1790 >Category: kern >Synopsis: access to /dev/kmem panics system >Confidential: no >Severity: critical >Priority: high >Responsible: freebsd-bugs >State: open >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Sun Oct 13 15:20:01 PDT 1996 >Last-Modified: >Originator: Peter Wemm >Organization: Not.. >Release: FreeBSD 2.2-CURRENT i386 >Environment: FreeBSD curie.dialix.com.au 2.2-CURRENT FreeBSD 2.2-CURRENT #5: Mon Oct 14 04:28:03 EST 1996 peter@curie.dialix.com.au:/home/src/sys/compile/CURIE i386 Built from sources only a few hours old. >Description: identd appears to have found an address in /dev/kmem that causes a kernel panic, although it may just be a pmap bug. I do not know the address that identd was trying to access when it died. At a guess, I think it was trying to look up 0xffff0000, this address causes the same panic in the test program. Fatal trap 12: page fault while in kernel mode fault virtual address = 0xefffffc0 fault code = supervisor read, page not present instruction pointer = 0x8:0xf01a25fc stack pointer = 0x10:0xefbffe28 frame pointer = 0x10:0xefbffe30 code segment = base 0x0, limit 0xfffff, type 0x1b = DPL 0, pres 1, def32 1, gran 1 processor eflags = interrupt enabled, resume, IOPL = 0 current process = 1834 (identd) Addresses around %eip f01a2548 t _pmap_pte_quick f01a25d4 T _pmap_extract f01a261c T _pmap_qenter Dump of assembler code from 0xf01a25d4 to 0xf01a2600: 0xf01a25d4 <pmap_extract>: pushl %ebp 0xf01a25d5 <pmap_extract+1>: movl %esp,%ebp 0xf01a25d7 <pmap_extract+3>: pushl %ebx 0xf01a25d8 <pmap_extract+4>: movl 0x8(%ebp),%ecx 0xf01a25db <pmap_extract+7>: movl 0xc(%ebp),%ebx 0xf01a25de <pmap_extract+10>: testl %ecx,%ecx 0xf01a25e0 <pmap_extract+12>: je 0xf01a2614 <pmap_extract+64> 0xf01a25e2 <pmap_extract+14>: movl %ebx,%edx 0xf01a25e4 <pmap_extract+16>: shrl $0x16,%edx 0xf01a25e7 <pmap_extract+19>: movl (%ecx),%eax 0xf01a25e9 <pmap_extract+21>: cmpl $0x0,(%eax,%edx,4) 0xf01a25ed <pmap_extract+25>: je 0xf01a2614 <pmap_extract+64> 0xf01a25ef <pmap_extract+27>: pushl %ecx 0xf01a25f0 <pmap_extract+28>: call 0xf01a24b8 <get_ptbase> 0xf01a25f5 <pmap_extract+33>: movl %eax,%edx 0xf01a25f7 <pmap_extract+35>: movl %ebx,%eax 0xf01a25f9 <pmap_extract+37>: shrl $0xc,%eax 0xf01a25fc <pmap_extract+40>: movl (%edx,%eax,4),%edx ^^^^^^^^^^^^^^^^^^^^^^^ Here 0xf01a25ff <pmap_extract+43>: andl $0xfffff000,%edx vm_offset_t pmap_extract(pmap, va) register pmap_t pmap; vm_offset_t va; { vm_offset_t rtval; if (pmap && *pmap_pde(pmap, va)) { unsigned *pte; pte = get_ptbase(pmap) + i386_btop(va); rtval = ((*pte & PG_FRAME) | (va & PAGE_MASK)); ^^^^^^^^^^^^^^^^^^ return rtval; } return 0; } The code in mem.c that triggered it: addr = trunc_page(uio->uio_offset); eaddr = round_page(uio->uio_offset + c); for (; addr < eaddr; addr += PAGE_SIZE) if (pmap_extract(kernel_pmap, addr) == 0) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ return EFAULT; >How-To-Repeat: save your work, sync a few times, then run this program: #include <sys/types.h> #include <unistd.h> char buf[4096]; main() { int fd = open("/dev/kmem", 0); unsigned long offset = 0xffff0000; lseek(fd, offset, 0); read(fd, buf, 4096); } 0xffff0000 appears to be one of the common power-up patterns in DRAM that I've seen on uncleared pages. >Fix: Not sure, but is that code in mem.c right? It doesn't appear to do any bounds checking on what is passed to pmap_extract(). Perhaps it needs to trap addresses beyond the top of the kernel address space? Perhaps it's pmap_pde at fault since it's returning "success" for an address that would be on the 64th kernel pde, when only 63 (NKPDE) exist. Checking at that level would probably be a slowdown though. >Audit-Trail: >Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199610132219.GAA02432>