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

Annotation of sys/arch/amd64/stand/libsa/dev_i386.c, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: dev_i386.c,v 1.3 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)],
                    170:            minor(cn_tab->cn_dev));
                    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:        /* pc0 and anything else */
                    196:        return 9600;
                    197: }

CVSweb