1 /* $OpenBSD: dev_i386.c,v 1.6 2010/12/06 22:51:45 jasper 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 = nitems(bdevs); 42 43 const char cdevs[][4] = { 44 "cn", "", "", "", "", "", "", "", 45 "com", "", "", "", "pc" 46 }; 47 const int ncdevs = nitems(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 } 198