Annotation of sys/arch/aviion/aviion/prom.c, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: prom.c,v 1.2 2006/05/20 11:57:02 miod Exp $ */
2:
3: /*
4: * Copyright (c) 2006, Miodrag Vallat.
5: *
6: * Redistribution and use in source and binary forms, with or without
7: * modification, are permitted provided that the following conditions
8: * are met:
9: * 1. Redistributions of source code must retain the above copyright
10: * notice, this list of conditions and the following disclaimer.
11: * 2. Redistributions in binary form must reproduce the above copyright
12: * notice, this list of conditions and the following disclaimer in the
13: * documentation and/or other materials provided with the distribution.
14: *
15: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18: * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
19: * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20: * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
21: * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
23: * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
24: * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25: * POSSIBILITY OF SUCH DAMAGE.
26: */
27:
28: #include <sys/param.h>
29: #include <sys/systm.h>
30:
31: #include <machine/asm_macro.h>
32: #include <machine/prom.h>
33:
34: register_t prom_vbr; /* set in locore.S */
35:
36: /*
37: * No locking is necessary, since we will only use the SCM routines
38: * during startup, before any secondary CPU is started.
39: */
40:
41: #define SCM_DECL \
42: register_t psr; \
43: register_t ossr0, ossr1, ossr2, ossr3
44:
45: #define SCM_CALL(x) \
46: __asm__ __volatile__ ("or r9, r0, " __STRING(x)); \
47: __asm__ __volatile__ ("tb0 0, r0, 496" ::: \
48: "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", \
49: "r9", "r10", "r11", "r12", "r13")
50:
51: #define SCM_VBR() \
52: __asm__ __volatile__ ("stcr %0, cr7" : : "r" (prom_vbr))
53:
54: #define SCM_CONTEXT() \
55: __asm__ __volatile__ ("ldcr %0, cr17" : "=r" (ossr0)); \
56: __asm__ __volatile__ ("ldcr %0, cr18" : "=r" (ossr1)); \
57: __asm__ __volatile__ ("ldcr %0, cr19" : "=r" (ossr2)); \
58: __asm__ __volatile__ ("ldcr %0, cr20" : "=r" (ossr3))
59:
60: #define OS_VBR() \
61: __asm__ __volatile__ ("stcr r0, cr7")
62:
63: #define OS_CONTEXT() \
64: __asm__ __volatile__ ("stcr %0, cr17" : : "r" (ossr0)); \
65: __asm__ __volatile__ ("stcr %0, cr18" : : "r" (ossr1)); \
66: __asm__ __volatile__ ("stcr %0, cr19" : : "r" (ossr2)); \
67: __asm__ __volatile__ ("stcr %0, cr20" : : "r" (ossr3))
68:
69: /* ==== */
70:
71: int
72: scm_cpuconfig(struct scm_cpuconfig *scc)
73: {
74: SCM_DECL;
75: int ret;
76:
77: disable_interrupt(psr);
78: SCM_CONTEXT();
79: SCM_VBR();
80: __asm__ __volatile__ ("or r2, r0, %0" : : "r" (scc));
81: SCM_CALL(SCM_CPUCONFIG);
82: __asm__ __volatile__ ("or %0, r0, r2" : "=r" (ret));
83: OS_CONTEXT();
84: OS_VBR();
85: set_psr(psr);
86:
87: return (ret);
88: }
89:
90: u_int
91: scm_cpuid()
92: {
93: SCM_DECL;
94: u_int ret;
95:
96: disable_interrupt(psr);
97: SCM_CONTEXT();
98: SCM_VBR();
99: SCM_CALL(SCM_CPUID);
100: __asm__ __volatile__ ("or %0, r0, r2" : "=r" (ret));
101: OS_CONTEXT();
102: OS_VBR();
103: set_psr(psr);
104:
105: return (ret);
106: }
107:
108: int
109: scm_getc(void)
110: {
111: SCM_DECL;
112: u_int ret;
113:
114: disable_interrupt(psr);
115: SCM_CONTEXT();
116: SCM_VBR();
117: SCM_CALL(SCM_CHAR);
118: __asm__ __volatile__ ("or %0, r0, r2" : "=r" (ret));
119: OS_CONTEXT();
120: OS_VBR();
121: set_psr(psr);
122:
123: return (ret & 0xff);
124: }
125:
126: void
127: scm_getenaddr(u_char *ea)
128: {
129: SCM_DECL;
130: char *addr;
131:
132: disable_interrupt(psr);
133: SCM_CONTEXT();
134: SCM_VBR();
135: SCM_CALL(SCM_COMMID);
136: __asm__ __volatile__ ("or %0, r0, r2" : "=r" (addr));
137: OS_CONTEXT();
138: OS_VBR();
139: set_psr(psr);
140:
141: bcopy(addr, ea, 6);
142: }
143:
144: __dead void
145: scm_halt()
146: {
147: SCM_DECL;
148:
149: disable_interrupt(psr);
150: SCM_CONTEXT();
151: SCM_VBR();
152: SCM_CALL(SCM_HALT);
153: OS_CONTEXT();
154: OS_VBR();
155: set_psr(psr);
156: for (;;) ;
157: }
158:
159: u_int
160: scm_memsize(int which)
161: {
162: SCM_DECL;
163: u_int msize;
164:
165: disable_interrupt(psr);
166: SCM_CONTEXT();
167: SCM_VBR();
168: __asm__ __volatile__ ("or r2, r0, %0" : : "r" (which));
169: SCM_CALL(SCM_MSIZE);
170: __asm__ __volatile__ ("or %0, r0, r2" : "=r" (msize));
171: OS_CONTEXT();
172: OS_VBR();
173: set_psr(psr);
174:
175: return (msize);
176: }
177:
178: /*
179: * Does not accept parameters beyond a string because this would need extra
180: * register constraints.
181: */
182: void
183: scm_printf(const char *msg)
184: {
185: SCM_DECL;
186:
187: disable_interrupt(psr);
188: SCM_CONTEXT();
189: SCM_VBR();
190: __asm__ __volatile__ ("or r2, r0, %0" : : "r" (msg));
191: SCM_CALL(SCM_PTLINE);
192: OS_CONTEXT();
193: OS_VBR();
194: set_psr(psr);
195: }
196:
197: u_int
198: scm_promver()
199: {
200: SCM_DECL;
201: u_int ret;
202:
203: disable_interrupt(psr);
204: SCM_CONTEXT();
205: SCM_VBR();
206: SCM_CALL(SCM_REVNUM);
207: __asm__ __volatile__ ("or %0, r0, r2" : "=r" (ret));
208: OS_CONTEXT();
209: OS_VBR();
210: set_psr(psr);
211:
212: return (ret);
213: }
214:
215: void
216: scm_putc(int c)
217: {
218: SCM_DECL;
219:
220: disable_interrupt(psr);
221: SCM_CONTEXT();
222: SCM_VBR();
223: __asm__ __volatile__ ("or r2, r0, %0" : : "r" (c));
224: SCM_CALL(SCM_OCHAR);
225: OS_CONTEXT();
226: OS_VBR();
227: set_psr(psr);
228: }
229:
230: void
231: scm_putcrlf()
232: {
233: SCM_DECL;
234:
235: disable_interrupt(psr);
236: SCM_CONTEXT();
237: SCM_VBR();
238: SCM_CALL(SCM_OCRLF);
239: OS_CONTEXT();
240: OS_VBR();
241: set_psr(psr);
242: }
243:
244: __dead void
245: scm_reboot(const char *cmdline)
246: {
247: SCM_DECL;
248:
249: disable_interrupt(psr);
250: SCM_CONTEXT();
251: SCM_VBR();
252: __asm__ __volatile__ ("or r2, r0, %0" : : "r" (cmdline));
253: SCM_CALL(SCM_REBOOT);
254: OS_CONTEXT();
255: OS_VBR();
256: set_psr(psr);
257: for (;;) ;
258: }
259:
260: u_int
261: scm_sysid()
262: {
263: SCM_DECL;
264: u_int ret;
265:
266: disable_interrupt(psr);
267: SCM_CONTEXT();
268: SCM_VBR();
269: SCM_CALL(SCM_SYSID);
270: __asm__ __volatile__ ("or %0, r0, r2" : "=r" (ret));
271: OS_CONTEXT();
272: OS_VBR();
273: set_psr(psr);
274:
275: return (ret);
276: }
CVSweb