mem.c (113040) | mem.c (114349) |
---|---|
1/*- 2 * Copyright (c) 1988 University of Utah. 3 * Copyright (c) 1982, 1986, 1990 The Regents of the University of California. 4 * All rights reserved. 5 * 6 * This code is derived from software contributed to Berkeley by 7 * the Systems Programming Group of the University of Utah Computer 8 * Science Department, and code derived from software contributed to --- 24 unchanged lines hidden (view full) --- 33 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 34 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 35 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 36 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 37 * SUCH DAMAGE. 38 * 39 * from: Utah $Hdr: mem.c 1.13 89/10/08$ 40 * from: @(#)mem.c 7.2 (Berkeley) 5/9/91 | 1/*- 2 * Copyright (c) 1988 University of Utah. 3 * Copyright (c) 1982, 1986, 1990 The Regents of the University of California. 4 * All rights reserved. 5 * 6 * This code is derived from software contributed to Berkeley by 7 * the Systems Programming Group of the University of Utah Computer 8 * Science Department, and code derived from software contributed to --- 24 unchanged lines hidden (view full) --- 33 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 34 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 35 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 36 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 37 * SUCH DAMAGE. 38 * 39 * from: Utah $Hdr: mem.c 1.13 89/10/08$ 40 * from: @(#)mem.c 7.2 (Berkeley) 5/9/91 |
41 * $FreeBSD: head/sys/amd64/amd64/mem.c 113040 2003-04-03 23:44:35Z jake $ | 41 * $FreeBSD: head/sys/amd64/amd64/mem.c 114349 2003-05-01 01:05:25Z peter $ |
42 */ 43 44/* 45 * Memory special file 46 */ 47 48#include <sys/param.h> 49#include <sys/conf.h> --- 43 unchanged lines hidden (view full) --- 93 94struct mem_range_softc mem_range_softc; 95 96static int 97mmclose(dev_t dev, int flags, int fmt, struct thread *td) 98{ 99 switch (minor(dev)) { 100 case 14: | 42 */ 43 44/* 45 * Memory special file 46 */ 47 48#include <sys/param.h> 49#include <sys/conf.h> --- 43 unchanged lines hidden (view full) --- 93 94struct mem_range_softc mem_range_softc; 95 96static int 97mmclose(dev_t dev, int flags, int fmt, struct thread *td) 98{ 99 switch (minor(dev)) { 100 case 14: |
101 td->td_frame->tf_eflags &= ~PSL_IOPL; | 101 td->td_frame->tf_rflags &= ~PSL_IOPL; |
102 } 103 return (0); 104} 105 106static int 107mmopen(dev_t dev, int flags, int fmt, struct thread *td) 108{ 109 int error; --- 9 unchanged lines hidden (view full) --- 119 break; 120 case 14: 121 error = suser(td); 122 if (error != 0) 123 return (error); 124 error = securelevel_gt(td->td_ucred, 0); 125 if (error != 0) 126 return (error); | 102 } 103 return (0); 104} 105 106static int 107mmopen(dev_t dev, int flags, int fmt, struct thread *td) 108{ 109 int error; --- 9 unchanged lines hidden (view full) --- 119 break; 120 case 14: 121 error = suser(td); 122 if (error != 0) 123 return (error); 124 error = securelevel_gt(td->td_ucred, 0); 125 if (error != 0) 126 return (error); |
127 td->td_frame->tf_eflags |= PSL_IOPL; | 127 td->td_frame->tf_rflags |= PSL_IOPL; |
128 break; 129 } 130 return (0); 131} 132 133/*ARGSUSED*/ 134static int 135mmrw(dev_t dev, struct uio *uio, int flags) 136{ 137 int o; | 128 break; 129 } 130 return (0); 131} 132 133/*ARGSUSED*/ 134static int 135mmrw(dev_t dev, struct uio *uio, int flags) 136{ 137 int o; |
138 u_int c = 0, v; | 138 u_long c = 0, v; |
139 struct iovec *iov; 140 int error = 0; 141 vm_offset_t addr, eaddr; 142 143 GIANT_REQUIRED; 144 145 while (uio->uio_resid > 0 && error == 0) { 146 iov = uio->uio_iov; --- 7 unchanged lines hidden (view full) --- 154 switch (minor(dev)) { 155 156/* minor device 0 is physical memory */ 157 case 0: 158 v = uio->uio_offset; 159 v &= ~PAGE_MASK; 160 pmap_kenter((vm_offset_t)ptvmmap, v); 161 o = (int)uio->uio_offset & PAGE_MASK; | 139 struct iovec *iov; 140 int error = 0; 141 vm_offset_t addr, eaddr; 142 143 GIANT_REQUIRED; 144 145 while (uio->uio_resid > 0 && error == 0) { 146 iov = uio->uio_iov; --- 7 unchanged lines hidden (view full) --- 154 switch (minor(dev)) { 155 156/* minor device 0 is physical memory */ 157 case 0: 158 v = uio->uio_offset; 159 v &= ~PAGE_MASK; 160 pmap_kenter((vm_offset_t)ptvmmap, v); 161 o = (int)uio->uio_offset & PAGE_MASK; |
162 c = (u_int)(PAGE_SIZE - ((int)iov->iov_base & PAGE_MASK)); | 162 c = (u_long)(PAGE_SIZE - ((long)iov->iov_base & PAGE_MASK)); |
163 c = min(c, (u_int)(PAGE_SIZE - o)); 164 c = min(c, (u_int)iov->iov_len); 165 error = uiomove((caddr_t)&ptvmmap[o], (int)c, uio); 166 pmap_qremove((vm_offset_t)ptvmmap, 1); 167 continue; 168 169/* minor device 1 is kernel memory */ 170 case 1: 171 c = iov->iov_len; 172 173 /* 174 * Make sure that all of the pages are currently resident so 175 * that we don't create any zero-fill pages. 176 */ 177 addr = trunc_page(uio->uio_offset); 178 eaddr = round_page(uio->uio_offset + c); 179 | 163 c = min(c, (u_int)(PAGE_SIZE - o)); 164 c = min(c, (u_int)iov->iov_len); 165 error = uiomove((caddr_t)&ptvmmap[o], (int)c, uio); 166 pmap_qremove((vm_offset_t)ptvmmap, 1); 167 continue; 168 169/* minor device 1 is kernel memory */ 170 case 1: 171 c = iov->iov_len; 172 173 /* 174 * Make sure that all of the pages are currently resident so 175 * that we don't create any zero-fill pages. 176 */ 177 addr = trunc_page(uio->uio_offset); 178 eaddr = round_page(uio->uio_offset + c); 179 |
180 if (addr < (vm_offset_t)VADDR(PTDPTDI, 0)) | 180 if (addr < (vm_offset_t)VADDR(0, 0, PTDPTDI, 0)) |
181 return (EFAULT); 182 for (; addr < eaddr; addr += PAGE_SIZE) 183 if (pmap_extract(kernel_pmap, addr) == 0) 184 return (EFAULT); 185 | 181 return (EFAULT); 182 for (; addr < eaddr; addr += PAGE_SIZE) 183 if (pmap_extract(kernel_pmap, addr) == 0) 184 return (EFAULT); 185 |
186 if (!kernacc((caddr_t)(int)uio->uio_offset, c, | 186 if (!kernacc((caddr_t)(long)uio->uio_offset, c, |
187 uio->uio_rw == UIO_READ ? 188 VM_PROT_READ : VM_PROT_WRITE)) 189 return (EFAULT); | 187 uio->uio_rw == UIO_READ ? 188 VM_PROT_READ : VM_PROT_WRITE)) 189 return (EFAULT); |
190 error = uiomove((caddr_t)(int)uio->uio_offset, (int)c, uio); | 190 error = uiomove((caddr_t)(long)uio->uio_offset, (int)c, uio); |
191 continue; 192 193 default: 194 return (ENODEV); 195 } 196 197 if (error) 198 break; --- 113 unchanged lines hidden (view full) --- 312{ 313 /* can we handle this? */ 314 if (mem_range_softc.mr_op == NULL) 315 return (EOPNOTSUPP); 316 317 return (mem_range_softc.mr_op->set(&mem_range_softc, mrd, arg)); 318} 319 | 191 continue; 192 193 default: 194 return (ENODEV); 195 } 196 197 if (error) 198 break; --- 113 unchanged lines hidden (view full) --- 312{ 313 /* can we handle this? */ 314 if (mem_range_softc.mr_op == NULL) 315 return (EOPNOTSUPP); 316 317 return (mem_range_softc.mr_op->set(&mem_range_softc, mrd, arg)); 318} 319 |
320#ifdef SMP 321void 322mem_range_AP_init(void) 323{ 324 if (mem_range_softc.mr_op && mem_range_softc.mr_op->initAP) 325 (mem_range_softc.mr_op->initAP(&mem_range_softc)); 326} 327#endif 328 | |
329static int 330mem_modevent(module_t mod, int type, void *data) 331{ 332 switch(type) { 333 case MOD_LOAD: 334 if (bootverbose) 335 printf("mem: <memory & I/O>\n"); 336 /* Initialise memory range handling */ --- 26 unchanged lines hidden --- | 320static int 321mem_modevent(module_t mod, int type, void *data) 322{ 323 switch(type) { 324 case MOD_LOAD: 325 if (bootverbose) 326 printf("mem: <memory & I/O>\n"); 327 /* Initialise memory range handling */ --- 26 unchanged lines hidden --- |