1: /*
2: * Copyright (c) 1986 Regents of the University of California.
3: * All rights reserved. The Berkeley software License Agreement
4: * specifies the terms and conditions for redistribution.
5: *
6: * @(#)mem.c 1.3 (2.11BSD GTE) 1996/5/15
7: */
8:
9: #include "param.h"
10: #include "../machine/seg.h"
11: #include "user.h"
12: #include "conf.h"
13: #include "uio.h"
14:
15: /*
16: * This routine is callable only from the high
17: * kernel as it assumes normal mapping and doesn't
18: * bother to save 'seg5'.
19: */
20:
21: mmrw(dev, uio, flag)
22: dev_t dev;
23: register struct uio *uio;
24: int flag;
25: {
26: register struct iovec *iov;
27: int error = 0;
28: register u_int c;
29: u_int on;
30: char zero[1024];
31:
32: if (minor(dev) == 3)
33: bzero(zero, sizeof (zero));
34: while (uio->uio_resid && error == 0) {
35: iov = uio->uio_iov;
36: if (iov->iov_len == 0) {
37: uio->uio_iov++;
38: uio->uio_iovcnt--;
39: if (uio->uio_iovcnt < 0)
40: panic("mmrw");
41: continue;
42: }
43: switch (minor(dev)) {
44:
45: /* minor device 0 is physical memory (/dev/mem) */
46: case 0:
47: mapseg5((memaddr)(uio->uio_offset>>6),
48: ((btoc(8192)-1)<<8)|RW);
49: on = uio->uio_offset & 077L;
50: c = MIN(iov->iov_len, 8192 - on);
51: error = uiomove(SEG5+on, c, uio);
52: normalseg5();
53: break;
54: /* minor device 1 is kernel memory (/dev/kmem) */
55: case 1:
56: error = uiomove((caddr_t)uio->uio_offset, iov->iov_len, uio);
57: break;
58: /* minor device 2 is EOF/RATHOLE (/dev/null) */
59: case 2:
60: if (uio->uio_rw == UIO_READ)
61: return(0);
62: c = iov->iov_len;
63: iov->iov_base += c;
64: iov->iov_len -= c;
65: uio->uio_offset += c;
66: uio->uio_resid -= c;
67: break;
68: /* minor device 3 is ZERO (/dev/zero) */
69: case 3:
70: if (uio->uio_rw == UIO_WRITE)
71: return(EIO);
72: c = MIN(iov->iov_len, sizeof (zero));
73: error = uiomove(zero, c, uio);
74: break;
75: default:
76: return(EINVAL);
77: } /* switch */
78: } /* while */
79: return(error);
80: }
81:
82: /*
83: * Internal versions of mmread(), mmwrite()
84: * used by disk driver ecc routines.
85: */
86: getmemc(addr)
87: long addr;
88: {
89: register int a, c, d;
90:
91: /*
92: * bn = addr >> 6
93: * on = addr & 077
94: */
95: a = UISA[0];
96: d = UISD[0];
97: UISA[0] = addr >> 6;
98: UISD[0] = RO; /* one click, read only */
99: c = fuibyte((caddr_t)(addr & 077));
100: UISA[0] = a;
101: UISD[0] = d;
102: return(c);
103: }
104:
105: putmemc(addr,contents)
106: long addr;
107: int contents;
108: {
109: register int a, d;
110:
111: /*
112: * bn = addr >> 6
113: * on = addr & 077
114: */
115: a = UISA[0];
116: d = UISD[0];
117: UISA[0] = addr >> 6;
118: UISD[0] = RW; /* one click, read/write */
119: suibyte((caddr_t)(addr & 077), contents);
120: UISA[0] = a;
121: UISD[0] = d;
122: }
Defined functions
mmrw
defined in line
21; used 3 times