xref: /openbsd/sys/arch/landisk/stand/boot/devs.c (revision 404b540a)
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