Deleted Added
full compact
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 ---