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

Annotation of sys/arch/i386/stand/libsa/dev_i386.c, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: dev_i386.c,v 1.30 2007/06/27 20:29:37 mk Exp $        */
        !             2:
        !             3: /*
        !             4:  * Copyright (c) 1996-1999 Michael Shalayeff
        !             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 OR HIS RELATIVES BE LIABLE FOR ANY DIRECT,
        !            20:  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
        !            21:  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
        !            22:  * SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
        !            23:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
        !            24:  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
        !            25:  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
        !            26:  * THE POSSIBILITY OF SUCH DAMAGE.
        !            27:  */
        !            28:
        !            29: #include "libsa.h"
        !            30: #include "biosdev.h"
        !            31: #include <sys/param.h>
        !            32: #include <dev/cons.h>
        !            33:
        !            34: extern int debug;
        !            35:
        !            36: /* XXX use slot for 'rd' for 'hd' pseudo-device */
        !            37: const char bdevs[][4] = {
        !            38:        "wd", "", "fd", "", "sd", "st", "cd", "mcd",
        !            39:        "", "", "", "", "", "", "", "scd", "", "hd", ""
        !            40: };
        !            41: const int nbdevs = NENTS(bdevs);
        !            42:
        !            43: const char cdevs[][4] = {
        !            44:        "cn", "", "", "", "", "", "", "",
        !            45:        "com", "", "", "", "pc"
        !            46: };
        !            47: const int ncdevs = NENTS(cdevs);
        !            48:
        !            49: /* pass dev_t to the open routines */
        !            50: int
        !            51: devopen(struct open_file *f, const char *fname, char **file)
        !            52: {
        !            53:        struct devsw *dp = devsw;
        !            54:        register int i, rc = 1;
        !            55:
        !            56:        *file = (char *)fname;
        !            57:
        !            58: #ifdef DEBUG
        !            59:        if (debug)
        !            60:                printf("devopen:");
        !            61: #endif
        !            62:
        !            63:        for (i = 0; i < ndevs && rc != 0; dp++, i++) {
        !            64: #ifdef DEBUG
        !            65:                if (debug)
        !            66:                        printf(" %s: ", dp->dv_name);
        !            67: #endif
        !            68:                if ((rc = (*dp->dv_open)(f, file)) == 0) {
        !            69:                        f->f_dev = dp;
        !            70:                        return 0;
        !            71:                }
        !            72: #ifdef DEBUG
        !            73:                else if (debug)
        !            74:                        printf("%d", rc);
        !            75: #endif
        !            76:
        !            77:        }
        !            78: #ifdef DEBUG
        !            79:        if (debug)
        !            80:                putchar('\n');
        !            81: #endif
        !            82:
        !            83:        if ((f->f_flags & F_NODEV) == 0)
        !            84:                f->f_dev = dp;
        !            85:
        !            86:        return rc;
        !            87: }
        !            88:
        !            89: void
        !            90: devboot(dev_t bootdev, char *p)
        !            91: {
        !            92: #ifdef _TEST
        !            93:        *p++ = '/';
        !            94:        *p++ = 'd';
        !            95:        *p++ = 'e';
        !            96:        *p++ = 'v';
        !            97:        *p++ = '/';
        !            98:        *p++ = 'r';
        !            99: #endif
        !           100:        if (bootdev & 0x100) {
        !           101:                *p++ = 'c';
        !           102:                *p++ = 'd';
        !           103:                *p++ = '0';
        !           104:        } else {
        !           105:                if (bootdev & 0x80)
        !           106:                        *p++ = 'h';
        !           107:                else
        !           108:                        *p++ = 'f';
        !           109:                *p++ = 'd';
        !           110:                *p++ = '0' + (bootdev & 0x7f);
        !           111:        }
        !           112:        *p++ = 'a';
        !           113:        *p = '\0';
        !           114: }
        !           115:
        !           116: int pch_pos = 0;
        !           117:
        !           118: void
        !           119: putchar(int c)
        !           120: {
        !           121:        switch (c) {
        !           122:        case '\177':    /* DEL erases */
        !           123:                cnputc('\b');
        !           124:                cnputc(' ');
        !           125:        case '\b':
        !           126:                cnputc('\b');
        !           127:                if (pch_pos)
        !           128:                        pch_pos--;
        !           129:                break;
        !           130:        case '\t':
        !           131:                do
        !           132:                        cnputc(' ');
        !           133:                while (++pch_pos % 8);
        !           134:                break;
        !           135:        case '\n':
        !           136:        case '\r':
        !           137:                cnputc(c);
        !           138:                pch_pos=0;
        !           139:                break;
        !           140:        default:
        !           141:                cnputc(c);
        !           142:                pch_pos++;
        !           143:                break;
        !           144:        }
        !           145: }
        !           146:
        !           147: int
        !           148: getchar(void)
        !           149: {
        !           150:        register int c = cngetc();
        !           151:
        !           152:        if (c == '\r')
        !           153:                c = '\n';
        !           154:
        !           155:        if ((c < ' ' && c != '\n') || c == '\177')
        !           156:                return c;
        !           157:
        !           158:        putchar(c);
        !           159:
        !           160:        return c;
        !           161: }
        !           162:
        !           163: char ttyname_buf[8];
        !           164:
        !           165: char *
        !           166: ttyname(int fd)
        !           167: {
        !           168:        snprintf(ttyname_buf, sizeof ttyname_buf, "%s%d",
        !           169:            cdevs[major(cn_tab->cn_dev)], minor(cn_tab->cn_dev));
        !           170:
        !           171:        return ttyname_buf;
        !           172: }
        !           173:
        !           174: dev_t
        !           175: ttydev(char *name)
        !           176: {
        !           177:        int i, unit = -1;
        !           178:        char *no = name + strlen(name) - 1;
        !           179:
        !           180:        while (no >= name && *no >= '0' && *no <= '9')
        !           181:                unit = (unit < 0 ? 0 : (unit * 10)) + *no-- - '0';
        !           182:        if (no < name || unit < 0)
        !           183:                return NODEV;
        !           184:        for (i = 0; i < ncdevs; i++)
        !           185:                if (strncmp(name, cdevs[i], no - name + 1) == 0)
        !           186:                        return (makedev(i, unit));
        !           187:        return NODEV;
        !           188: }
        !           189:
        !           190: int
        !           191: cnspeed(dev_t dev, int sp)
        !           192: {
        !           193:        if (major(dev) == 8)    /* comN */
        !           194:                return (comspeed(dev, sp));
        !           195:
        !           196:        /* pc0 and anything else */
        !           197:        return 9600;
        !           198: }

CVSweb