[BACK]Return to mem.c CVS log [TXT][DIR] Up to [local] / sys / arch / hppa64 / dev

Annotation of sys/arch/hppa64/dev/mem.c, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: mem.c,v 1.3 2005/11/28 20:13:08 martin Exp $  */
                      2:
                      3: /*
                      4:  * Copyright (c) 2005 Michael Shalayeff
                      5:  * All rights reserved.
                      6:  *
                      7:  * Permission to use, copy, modify, and distribute this software for any
                      8:  * purpose with or without fee is hereby granted, provided that the above
                      9:  * copyright notice and this permission notice appear in all copies.
                     10:  *
                     11:  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
                     12:  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
                     13:  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
                     14:  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
                     15:  * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER IN
                     16:  * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
                     17:  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
                     18:  */
                     19: /*
                     20:  * Copyright (c) 1991,1992,1994, The University of Utah and
                     21:  * the Computer Systems Laboratory (CSL).  All rights reserved.
                     22:  *
                     23:  * Subject to your agreements with CMU,
                     24:  * permission to use, copy, modify and distribute this software and its
                     25:  * documentation is hereby granted, provided that both the copyright
                     26:  * notice and this permission notice appear in all copies of the
                     27:  * software, derivative works or modified versions, and any portions
                     28:  * thereof, and that both notices appear in supporting documentation.
                     29:  *
                     30:  * THE UNIVERSITY OF UTAH AND CSL ALLOW FREE USE OF THIS SOFTWARE IN ITS "AS
                     31:  * IS" CONDITION.  THE UNIVERSITY OF UTAH AND CSL DISCLAIM ANY LIABILITY OF
                     32:  * ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
                     33:  *
                     34:  * CSL requests users of this software to return to csl-dist@cs.utah.edu any
                     35:  * improvements that they make and grant CSL redistribution rights.
                     36:  *
                     37:  *     Utah $Hdr: mem.c 1.9 94/12/16$
                     38:  */
                     39: /*
                     40:  * Mach Operating System
                     41:  * Copyright (c) 1992 Carnegie Mellon University
                     42:  * All Rights Reserved.
                     43:  *
                     44:  * Permission to use, copy, modify and distribute this software and its
                     45:  * documentation is hereby granted, provided that both the copyright
                     46:  * notice and this permission notice appear in all copies of the
                     47:  * software, derivative works or modified versions, and any portions
                     48:  * thereof, and that both notices appear in supporting documentation.
                     49:  *
                     50:  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
                     51:  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
                     52:  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
                     53:  *
                     54:  * Carnegie Mellon requests users of this software to return to
                     55:  *
                     56:  *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
                     57:  *  School of Computer Science
                     58:  *  Carnegie Mellon University
                     59:  *  Pittsburgh PA 15213-3890
                     60:  *
                     61:  * any improvements or extensions that they make and grant Carnegie Mellon
                     62:  * the rights to redistribute these changes.
                     63:  */
                     64:
                     65: #include <sys/param.h>
                     66: #include <sys/systm.h>
                     67: #include <sys/buf.h>
                     68: #include <sys/malloc.h>
                     69: #include <sys/proc.h>
                     70: #include <sys/uio.h>
                     71: #include <sys/types.h>
                     72: #include <sys/device.h>
                     73: #include <sys/errno.h>
                     74: #include <sys/ioctl.h>
                     75: #include <sys/file.h>
                     76:
                     77: #include <uvm/uvm.h>
                     78:
                     79: #include <machine/conf.h>
                     80: #include <machine/bus.h>
                     81: #include <machine/iomod.h>
                     82: #include <machine/autoconf.h>
                     83: #include <machine/pmap.h>
                     84:
                     85: #include <arch/hppa/dev/cpudevs.h>
                     86:
                     87: struct mem_softc {
                     88:        struct device sc_dev;
                     89: };
                     90:
                     91: int    memmatch(struct device *, void *, void *);
                     92: void   memattach(struct device *, struct device *, void *);
                     93:
                     94: struct cfattach mem_ca = {
                     95:        sizeof(struct mem_softc), memmatch, memattach
                     96: };
                     97:
                     98: struct cfdriver mem_cd = {
                     99:        NULL, "mem", DV_DULL
                    100: };
                    101:
                    102: caddr_t zeropage;
                    103:
                    104: int
                    105: memmatch(parent, cfdata, aux)
                    106:        struct device *parent;
                    107:        void *cfdata;
                    108:        void *aux;
                    109: {
                    110:        struct confargs *ca = aux;
                    111:
                    112:        if ((ca->ca_name && !strcmp(ca->ca_name, "memory")) ||
                    113:            (ca->ca_type.iodc_type == HPPA_TYPE_MEMORY &&
                    114:             ca->ca_type.iodc_sv_model == HPPA_MEMORY_PDEP))
                    115:                return 1;
                    116:
                    117:        return 0;
                    118: }
                    119:
                    120: void
                    121: memattach(parent, self, aux)
                    122:        struct device *parent;
                    123:        struct device *self;
                    124:        void *aux;
                    125: {
                    126:        struct pdc_iodc_minit pdc_minit PDC_ALIGNMENT;
                    127:        /* struct mem_softc *sc = (struct mem_softc *)self; */
                    128:        struct confargs *ca = aux;
                    129:        int err;
                    130:
                    131: /* TODO scan the memory regions list */
                    132:
                    133:        if ((err = pdc_call((iodcio_t)pdc, 0, PDC_IODC, PDC_IODC_NINIT,
                    134:            &pdc_minit, ca->ca_hpa, PAGE0->imm_spa_size)) < 0)
                    135:                pdc_minit.max_spa = PAGE0->imm_max_mem;
                    136:
                    137:        printf(": size %d", pdc_minit.max_spa / (1024*1024));
                    138:        if (pdc_minit.max_spa % (1024*1024))
                    139:                printf(".%d", pdc_minit.max_spa % (1024*1024));
                    140:        printf("MB\n");
                    141: }
                    142:
                    143: int
                    144: mmopen(dev, flag, ioflag, p)
                    145:        dev_t dev;
                    146:        int flag;
                    147:        int ioflag;
                    148:        struct proc *p;
                    149: {
                    150:        return (0);
                    151: }
                    152:
                    153: /*ARGSUSED*/
                    154: int
                    155: mmclose(dev, flag, mode, p)
                    156:        dev_t dev;
                    157:        int flag, mode;
                    158:        struct proc *p;
                    159: {
                    160:        return (0);
                    161: }
                    162:
                    163: int
                    164: mmrw(dev, uio, flags)
                    165:        dev_t dev;
                    166:        struct uio *uio;
                    167:        int flags;
                    168: {
                    169:        struct iovec    *iov;
                    170:        vaddr_t v, o;
                    171:        int error = 0;
                    172:        u_int   c;
                    173:
                    174:        while (uio->uio_resid > 0 && error == 0) {
                    175:                iov = uio->uio_iov;
                    176:                if (iov->iov_len == 0) {
                    177:                        uio->uio_iov++;
                    178:                        uio->uio_iovcnt--;
                    179:                        if (uio->uio_iovcnt < 0)
                    180:                                panic("mmrw");
                    181:                        continue;
                    182:                }
                    183:                switch (minor(dev)) {
                    184:
                    185:                case 0:                         /*  /dev/mem  */
                    186:
                    187:                        /* If the address isn't in RAM, bail. */
                    188:                        v = uio->uio_offset;
                    189:                        if (btoc(v) > physmem) {
                    190:                                error = EFAULT;
                    191:                                /* this will break us out of the loop */
                    192:                                continue;
                    193:                        }
                    194:                        c = ctob(physmem) - v;
                    195:                        c = min(c, uio->uio_resid);
                    196:                        error = uiomove((caddr_t)v, c, uio);
                    197:                        break;
                    198:
                    199:                case 1:                         /*  /dev/kmem  */
                    200:                        v = uio->uio_offset;
                    201:                        o = v & PAGE_MASK;
                    202:                        c = min(uio->uio_resid, (int)(PAGE_SIZE - o));
                    203:                        if (btoc(v) > physmem && !uvm_kernacc((caddr_t)v,
                    204:                            c, (uio->uio_rw == UIO_READ) ? B_READ : B_WRITE)) {
                    205:                                error = EFAULT;
                    206:                                /* this will break us out of the loop */
                    207:                                continue;
                    208:                        }
                    209:                        error = uiomove((caddr_t)v, c, uio);
                    210:                        break;
                    211:
                    212:                case 2:                         /*  /dev/null  */
                    213:                        if (uio->uio_rw == UIO_WRITE)
                    214:                                uio->uio_resid = 0;
                    215:                        return (0);
                    216:
                    217:                case 12:                        /*  /dev/zero  */
                    218:                        /* Write to /dev/zero is ignored. */
                    219:                        if (uio->uio_rw == UIO_WRITE) {
                    220:                                uio->uio_resid = 0;
                    221:                                return (0);
                    222:                        }
                    223:                        /*
                    224:                         * On the first call, allocate and zero a page
                    225:                         * of memory for use with /dev/zero.
                    226:                         */
                    227:                        if (zeropage == NULL) {
                    228:                                zeropage = malloc(PAGE_SIZE, M_TEMP, M_WAITOK);
                    229:                                bzero(zeropage, PAGE_SIZE);
                    230:                        }
                    231:                        c = min(iov->iov_len, PAGE_SIZE);
                    232:                        error = uiomove(zeropage, c, uio);
                    233:                        break;
                    234:
                    235:                default:
                    236:                        return (ENXIO);
                    237:                }
                    238:        }
                    239:
                    240:        return (error);
                    241: }
                    242:
                    243: paddr_t
                    244: mmmmap(dev, off, prot)
                    245:        dev_t dev;
                    246:        off_t off;
                    247:        int prot;
                    248: {
                    249:        if (minor(dev) != 0)
                    250:                return (-1);
                    251:
                    252:        /*
                    253:         * Allow access only in RAM.
                    254:         */
                    255: #if 0
                    256:        if (off < ctob(firstusablepage) ||
                    257:            off >= ctob(lastusablepage + 1))
                    258:                return (-1);
                    259: #endif
                    260:        return (atop(off));
                    261: }
                    262:
                    263: int
                    264: mmioctl(dev, cmd, data, flags, p)
                    265:        dev_t dev;
                    266:        u_long cmd;
                    267:        caddr_t data;
                    268:        int flags;
                    269:        struct proc *p;
                    270: {
                    271:        return (EOPNOTSUPP);
                    272: }

CVSweb