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

Annotation of sys/arch/hppa64/stand/libsa/dev_hppa64.c, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: dev_hppa64.c,v 1.2 2005/05/29 18:53:54 miod 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: #include "libsa.h"
                     21: #include <sys/param.h>
                     22: #include <sys/disklabel.h>
                     23: #include <sys/reboot.h>
                     24: #include <dev/cons.h>
                     25:
                     26: #include <machine/iomod.h>
                     27:
                     28: #include "dev_hppa64.h"
                     29:
                     30: extern int debug;
                     31:
                     32: const char cdevs[][4] = {
                     33:        "ite", "", "", "", "", "", "", "",
                     34:        "", "", "", "", ""
                     35: };
                     36: const int ncdevs = NENTS(cdevs);
                     37:
                     38: const struct pdc_devs {
                     39:        char    name[3];
                     40:        int     dev_type;
                     41: } pdc_devs[] = {
                     42:        { "dk",  0 },
                     43:        { "ct",  1 },
                     44:        { "lf",  2 },
                     45:        { "",   -1 },
                     46:        { "rd", -1 },
                     47:        { "sw", -1 },
                     48:        { "fl", -1 },
                     49: };
                     50:
                     51: /* pass dev_t to the open routines */
                     52: int
                     53: devopen(f, fname, file)
                     54:        struct open_file *f;
                     55:        const char *fname;
                     56:        char **file;
                     57: {
                     58:        struct hppa_dev *hpd;
                     59:        const struct pdc_devs *dp = pdc_devs;
                     60:        int rc = 1;
                     61:
                     62:        if (!(*file = strchr(fname, ':')))
                     63:                return ENODEV;
                     64:        else
                     65:                (*file)++;
                     66:
                     67: #ifdef DEBUGBUG
                     68:        if (debug)
                     69:                printf("devopen: ");
                     70: #endif
                     71:
                     72:        for (dp = pdc_devs; dp < &pdc_devs[NENTS(pdc_devs)]; dp++)
                     73:                if (!strncmp(fname, dp->name, sizeof(dp->name)-1))
                     74:                        break;
                     75:
                     76:        if (dp >= &pdc_devs[NENTS(pdc_devs)] || dp->dev_type < 0)
                     77:                return ENODEV;
                     78: #ifdef DEBUGBUG
                     79:        if (debug)
                     80:                printf("%s\n", dp->name);
                     81: #endif
                     82:
                     83:        if (!(hpd = alloc(sizeof *hpd))) {
                     84: #ifdef DEBUG
                     85:                printf ("devopen: no mem\n");
                     86: #endif
                     87:        } else {
                     88:                bzero(hpd, sizeof *hpd);
                     89:                hpd->bootdev = bootdev;
                     90:                hpd->buf = (char *)(((u_long)hpd->ua_buf + IODC_MINIOSIZ-1) &
                     91:                        ~(IODC_MINIOSIZ-1));
                     92:                f->f_devdata = hpd;
                     93:                if ((rc = (*devsw[dp->dev_type].dv_open)(f, file)) == 0) {
                     94:                        f->f_dev = &devsw[dp->dev_type];
                     95:                        return 0;
                     96:                }
                     97:                free (hpd, 0);
                     98:                f->f_devdata = NULL;
                     99:        }
                    100:
                    101:        if (!(f->f_flags & F_NODEV))
                    102:                f->f_dev = &devsw[dp->dev_type];
                    103:
                    104:        if (!f->f_devdata)
                    105:                *file = NULL;
                    106:
                    107:        return rc;
                    108: }
                    109:
                    110: void
                    111: devboot(dev, p)
                    112:        dev_t dev;
                    113:        char *p;
                    114: {
                    115:        const char *q;
                    116:        int unit;
                    117:
                    118:        if (!dev) {
                    119:                int type;
                    120:
                    121:                switch (PAGE0->mem_boot.pz_class) {
                    122:                case PCL_RANDOM:
                    123:                        type = 0;
                    124:                        unit = PAGE0->mem_boot.pz_layers[0];
                    125:                        break;
                    126:                case PCL_SEQU:
                    127:                        type = 1;
                    128:                        unit = PAGE0->mem_boot.pz_layers[0];
                    129:                        break;
                    130:                case PCL_NET_MASK|PCL_SEQU:
                    131:                        type = 2;
                    132:                        unit = 0;
                    133:                        break;
                    134:                default:
                    135:                        type = 0;
                    136:                        unit = 0;
                    137:                        break;
                    138:                }
                    139:                dev = bootdev = MAKEBOOTDEV(type, 0, 0, unit, B_PARTITION(dev));
                    140:        }
                    141: #ifdef _TEST
                    142:        *p++ = '/';
                    143:        *p++ = 'd';
                    144:        *p++ = 'e';
                    145:        *p++ = 'v';
                    146:        *p++ = '/';
                    147:        *p++ = 'r';
                    148: #endif
                    149:        /* quick copy device name */
                    150:        for (q = pdc_devs[B_TYPE(dev)].name; (*p++ = *q++););
                    151:        unit = B_UNIT(dev);
                    152:        if (unit >= 10) {
                    153:                p[-1] = '0' + unit / 10;
                    154:                *p++ = '0' + (unit % 10);
                    155:        } else
                    156:                p[-1] = '0' + unit;
                    157:        *p++ = 'a' + B_PARTITION(dev);
                    158:        *p = '\0';
                    159: }
                    160:
                    161: int pch_pos;
                    162:
                    163: void
                    164: putchar(c)
                    165:        int c;
                    166: {
                    167:        switch(c) {
                    168:        case '\177':    /* DEL erases */
                    169:                cnputc('\b');
                    170:                cnputc(' ');
                    171:        case '\b':
                    172:                cnputc('\b');
                    173:                if (pch_pos)
                    174:                        pch_pos--;
                    175:                break;
                    176:        case '\t':
                    177:                do
                    178:                        cnputc(' ');
                    179:                while(++pch_pos % 8);
                    180:                break;
                    181:        case '\n':
                    182:        case '\r':
                    183:                cnputc(c);
                    184:                pch_pos=0;
                    185:                break;
                    186:        default:
                    187:                cnputc(c);
                    188:                pch_pos++;
                    189:                break;
                    190:        }
                    191: }
                    192:
                    193: int
                    194: getchar()
                    195: {
                    196:        int c = cngetc();
                    197:
                    198:        if (c == '\r')
                    199:                c = '\n';
                    200:
                    201:        if ((c < ' ' && c != '\n') || c == '\177')
                    202:                return(c);
                    203:
                    204:        putchar(c);
                    205:
                    206:        return(c);
                    207: }
                    208:
                    209: char ttyname_buf[8];
                    210: char *
                    211: ttyname(fd)
                    212:        int fd;
                    213: {
                    214:        snprintf(ttyname_buf, sizeof ttyname_buf, "%s%d",
                    215:            cdevs[major(cn_tab->cn_dev)],
                    216:            minor(cn_tab->cn_dev));
                    217:        return (ttyname_buf);
                    218: }
                    219:
                    220: dev_t
                    221: ttydev(name)
                    222:        char *name;
                    223: {
                    224:        int i, unit = -1;
                    225:        char *no = name + strlen(name) - 1;
                    226:
                    227:        while (no >= name && *no >= '0' && *no <= '9')
                    228:                unit = (unit < 0 ? 0 : (unit * 10)) + *no-- - '0';
                    229:        if (no < name || unit < 0)
                    230:                return (NODEV);
                    231:        for (i = 0; i < ncdevs; i++)
                    232:                if (strncmp(name, cdevs[i], no - name + 1) == 0)
                    233:                        return (makedev(i, unit));
                    234:        return (NODEV);
                    235: }

CVSweb