1 /* $OpenBSD: devs.c,v 1.6 2006/11/16 23:12:56 deraadt Exp $ */ 2 3 /* 4 * Copyright (c) 2006 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 <sys/param.h> 21 #include <libsa.h> 22 #include <lib/libsa/loadfile.h> 23 24 int sector; 25 26 void 27 machdep(void) 28 { 29 tick_init(); 30 31 /* scif_init(9600); */ 32 } 33 34 int 35 devopen(struct open_file *f, const char *fname, char **file) 36 { 37 if (fname[0] != 'c' || fname[1] != 'f' || fname[2] != ':') 38 return EINVAL; 39 40 *file = (char *)fname + 3; 41 f->f_flags |= F_NODEV; 42 f->f_dev = &devsw[0]; 43 return (0); 44 } 45 46 void 47 devboot(dev_t bootdev, char *p) 48 { 49 sector = bootdev; /* passed from pbr */ 50 p[0] = 'c'; 51 p[1] = 'f'; 52 p[2] = '\0'; 53 } 54 55 char * 56 ttyname(int fd) 57 { 58 return "scif"; 59 } 60 61 dev_t 62 ttydev(char *name) 63 { 64 return NODEV; 65 } 66 67 int 68 cnspeed(dev_t dev, int sp) 69 { 70 scif_init(sp); 71 return sp; 72 } 73 74 void 75 run_loadfile(u_long *marks, int howto) 76 { 77 u_long entry; 78 79 entry = marks[MARK_ENTRY]; 80 cache_flush(); 81 cache_disable(); 82 83 (*(void (*)(int,int,int))entry)(howto, marks[MARK_END], 0); 84 } 85 86 int 87 blkdevopen(struct open_file *f, ...) 88 { 89 return 0; 90 } 91 92 int 93 blkdevstrategy(void *v, int flag, daddr_t dblk, size_t size, void *buf, size_t *rsize) 94 { 95 96 if (flag != F_READ) 97 return EROFS; 98 99 if (size & (DEV_BSIZE - 1)) 100 return EINVAL; 101 102 if (rsize) 103 *rsize = size; 104 105 if (size != 0 && readsects(0x40, sector + dblk, buf, 106 size / DEV_BSIZE) != 0) 107 return EIO; 108 109 return 0; 110 } 111 112 int 113 blkdevclose(struct open_file *f) 114 { 115 return 0; 116 } 117 118 int pch_pos = 0; 119 120 void 121 putchar(int c) 122 { 123 switch (c) { 124 case '\177': /* DEL erases */ 125 scif_putc('\b'); 126 scif_putc(' '); 127 case '\b': 128 scif_putc('\b'); 129 if (pch_pos) 130 pch_pos--; 131 break; 132 case '\t': 133 do 134 scif_putc(' '); 135 while (++pch_pos % 8); 136 break; 137 case '\n': 138 scif_putc(c); 139 case '\r': 140 scif_putc('\r'); 141 pch_pos=0; 142 break; 143 default: 144 scif_putc(c); 145 pch_pos++; 146 break; 147 } 148 } 149 150 int 151 getchar(void) 152 { 153 int c = scif_getc(); 154 155 if (c == '\r') 156 c = '\n'; 157 158 if ((c < ' ' && c != '\n') || c == '\177') 159 return c; 160 161 putchar(c); 162 return c; 163 } 164