[BACK]Return to nvram.c CVS log [TXT][DIR] Up to [local] / sys / arch / i386 / i386

Annotation of sys/arch/i386/i386/nvram.c, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: nvram.c,v 1.3 2004/11/11 08:28:28 jcs Exp $ */
        !             2:
        !             3: /*
        !             4:  * Copyright (c) 2004 Joshua Stein <jcs@openbsd.org>
        !             5:  * All rights reserved.
        !             6:  *
        !             7:  * Redistribution and use in source and binary forms, with or without
        !             8:  * modification, are permitted provided that the following conditions
        !             9:  * are met:
        !            10:  * 1. Redistributions of source code must retain the above copyright
        !            11:  *    notice, this list of conditions and the following disclaimer.
        !            12:  * 2. Redistributions in binary form must reproduce the above copyright
        !            13:  *    notice, this list of conditions and the following disclaimer in the
        !            14:  *    documentation and/or other materials provided with the distribution.
        !            15:  *
        !            16:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
        !            17:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
        !            18:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
        !            19:  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
        !            20:  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
        !            21:  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
        !            22:  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
        !            23:  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
        !            24:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
        !            25:  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
        !            26:  */
        !            27:
        !            28: #include <sys/param.h>
        !            29: #include <sys/systm.h>
        !            30: #include <sys/uio.h>
        !            31: #include <sys/fcntl.h>
        !            32: #include <sys/conf.h>
        !            33:
        !            34: #include <dev/ic/mc146818reg.h>
        !            35: #include <i386/isa/nvram.h>
        !            36:
        !            37: /* checksum is calculated over bytes 2 to 31 and stored in byte 32 */
        !            38: #define NVRAM_CSUM_START       (MC_NVRAM_START + 2)
        !            39: #define NVRAM_CSUM_END         (MC_NVRAM_START + 31)
        !            40: #define NVRAM_CSUM_LOC         (MC_NVRAM_START + 32)
        !            41:
        !            42: #define NVRAM_SIZE             (128 - MC_NVRAM_START)
        !            43:
        !            44: /* #define NVRAM_DEBUG 1 */
        !            45:
        !            46: void nvramattach(int);
        !            47:
        !            48: int nvramopen(dev_t dev, int flag, int mode, struct proc *p);
        !            49: int nvramclose(dev_t dev, int flag, int mode, struct proc *p);
        !            50: int nvramread(dev_t dev, struct uio *uio, int flags);
        !            51:
        !            52: int nvram_csum_valid(void);
        !            53: int nvram_get_byte(int byteno);
        !            54:
        !            55: static int nvram_initialized;
        !            56:
        !            57: void
        !            58: nvramattach(int num)
        !            59: {
        !            60:        if (num > 1)
        !            61:                return;
        !            62:
        !            63:        if (nvram_initialized || nvram_csum_valid()) {
        !            64: #ifdef NVRAM_DEBUG
        !            65:                printf("nvram: initialized\n");
        !            66: #endif
        !            67:                nvram_initialized = 1;
        !            68:        } else
        !            69:                printf("nvram: invalid checksum\n");
        !            70: }
        !            71:
        !            72: int
        !            73: nvramopen(dev_t dev, int flag, int mode, struct proc *p)
        !            74: {
        !            75:        /* TODO: re-calc checksum on every open? */
        !            76:
        !            77:        if ((minor(dev) != 0) || (!nvram_initialized))
        !            78:                return (ENXIO);
        !            79:
        !            80:        if ((flag & FWRITE))
        !            81:                return (EPERM);
        !            82:
        !            83:        return (0);
        !            84: }
        !            85:
        !            86: int
        !            87: nvramclose(dev_t dev, int flag, int mode, struct proc *p)
        !            88: {
        !            89:        return (0);
        !            90: }
        !            91:
        !            92: int
        !            93: nvramread(dev_t dev, struct uio *uio, int flags)
        !            94: {
        !            95:        u_char buf[NVRAM_SIZE];
        !            96:        u_int pos = uio->uio_offset;
        !            97:        u_char *tmp;
        !            98:        int count = min(sizeof(buf), uio->uio_resid);
        !            99:        int ret;
        !           100:
        !           101:        if (!nvram_initialized)
        !           102:                return (ENXIO);
        !           103:
        !           104:        if (uio->uio_resid == 0)
        !           105:                return (0);
        !           106:
        !           107: #ifdef NVRAM_DEBUG
        !           108:        printf("attempting to read %d bytes at offset %d\n", count, pos);
        !           109: #endif
        !           110:
        !           111:        for (tmp = buf; count-- > 0 && pos < NVRAM_SIZE; ++pos, ++tmp)
        !           112:                *tmp = nvram_get_byte(pos);
        !           113:
        !           114: #ifdef NVRAM_DEBUG
        !           115:        printf("nvramread read %d bytes (%s)\n", (tmp - buf), tmp);
        !           116: #endif
        !           117:
        !           118:        ret = uiomove((caddr_t)buf, (tmp - buf), uio);
        !           119:
        !           120:        uio->uio_offset += uio->uio_resid;
        !           121:
        !           122:        return (ret);
        !           123: }
        !           124:
        !           125: int
        !           126: nvram_get_byte(int byteno)
        !           127: {
        !           128:        if (!nvram_initialized)
        !           129:                return (ENXIO);
        !           130:
        !           131:        return (mc146818_read(NULL, byteno + MC_NVRAM_START) & 0xff);
        !           132: }
        !           133:
        !           134: int
        !           135: nvram_csum_valid()
        !           136: {
        !           137:        u_short csum = 0;
        !           138:        u_short csumexpect;
        !           139:        int nreg;
        !           140:
        !           141:        for (nreg = NVRAM_CSUM_START; nreg <= NVRAM_CSUM_END; nreg++)
        !           142:                csum += mc146818_read(NULL, nreg);
        !           143:
        !           144:        csumexpect = mc146818_read(NULL, NVRAM_CSUM_LOC) << 8 |
        !           145:            mc146818_read(NULL, NVRAM_CSUM_LOC + 1);
        !           146:
        !           147: #ifdef NVRAM_DEBUG
        !           148:        printf("nvram: checksum is %x, expecting %x\n", (csum & 0xffff),
        !           149:                csumexpect);
        !           150: #endif
        !           151:
        !           152:        return ((csum & 0xffff) == csumexpect);
        !           153: }

CVSweb