|
|
1.1 root 1: /*
2: * Creation Date: <2002/06/16 01:40:57 samuel>
3: * Time-stamp: <2003/12/26 17:02:09 samuel>
4: *
5: * <osi_calls.h>
6: *
7: * OSI call inlines
8: *
9: * Copyright (C) 2002, 2003 Samuel Rydh ([email protected])
10: *
11: * This program is free software; you can redistribute it and/or
12: * modify it under the terms of the GNU General Public License
13: * as published by the Free Software Foundation
14: *
15: */
16:
17: #ifndef _H_OSI_CALLS
18: #define _H_OSI_CALLS
19:
20: #include "osi.h"
21:
22: /* Old gcc versions have a limit on the number of registers used.
23: * Newer gcc versions (gcc 3.3) require that the clobber list does
24: * not overlap declared registers.
25: */
26: #if __GNUC__ == 2 || ( __GNUC__ == 3 && __GNUC_MINOR__ < 3 )
27: #define SHORT_REGLIST
28: #endif
29:
30:
31: /************************************************************************/
32: /* OSI call instantiation macros */
33: /************************************************************************/
34:
35: #define dreg(n) __oc_##n __asm__ (#n)
36: #define ir(n) "r" (__oc_##n)
37: #define rr(n) "=r" (__oc_##n)
38:
39: #define _oc_head( input_regs... ) \
40: { \
41: int _ret=0; \
42: { \
43: register unsigned long dreg(r3); \
44: register unsigned long dreg(r4); \
45: register unsigned long dreg(r5) \
46: ,##input_regs ;
47:
48: #define _oc_syscall( number, extra_ret_regs... ) \
49: __oc_r3 = OSI_SC_MAGIC_R3; \
50: __oc_r4 = OSI_SC_MAGIC_R4; \
51: __oc_r5 = number; \
52: __asm__ __volatile__ ( \
53: "sc " : rr(r3) ,## extra_ret_regs
54:
55: #define _oc_input( regs... ) \
56: : ir(r3), ir(r4), ir(r5) \
57: , ## regs \
58: : "memory" );
59:
60: /* the tail memory clobber is necessary since we violate the strict
61: * aliasing rules when we return structs through the registers.
62: */
63: #define _oc_tail \
64: asm volatile ( "" : : : "memory" ); \
65: _ret = __oc_r3; \
66: } \
67: return _ret; \
68: }
69:
70:
71: /************************************************************************/
72: /* Alternatives */
73: /************************************************************************/
74:
75: #ifdef SHORT_REGLIST
76: #define _oc_syscall_r10w6( number, inputregs... ) \
77: __oc_r3 = OSI_SC_MAGIC_R3; \
78: __oc_r4 = OSI_SC_MAGIC_R4; \
79: __oc_r5 = number; \
80: __asm__ __volatile__ ( \
81: "sc \n" \
82: "stw 4,0(10) \n" \
83: "stw 5,4(10) \n" \
84: "stw 6,8(10) \n" \
85: "stw 7,12(10) \n" \
86: "stw 8,16(10) \n" \
87: "stw 9,20(10) \n" \
88: : rr(r3) \
89: : ir(r3), ir(r4), ir(r5), ir(r10) \
90: ,## inputregs \
91: : "memory", \
92: "r4", "r5", "r6", "r7", "r8", "r9" );
93: #endif
94:
95:
96: /************************************************************************/
97: /* Common helper functions */
98: /************************************************************************/
99:
100: #define _osi_call0( type, name, number ) \
101: type name( void ) \
102: _oc_head() \
103: _oc_syscall( number ) \
104: _oc_input() \
105: _oc_tail
106:
107: #define _osi_call1( type, name, number, type1, arg1 ) \
108: type name( type1 arg1 ) \
109: _oc_head( dreg(r6) ) \
110: __oc_r6 = (unsigned long)arg1; \
111: _oc_syscall( number ) \
112: _oc_input( ir(r6) ) \
113: _oc_tail
114:
115: #define _osi_call2( type, name, number, t1, a1, t2, a2 ) \
116: type name( t1 a1, t2 a2 ) \
117: _oc_head( dreg(r6), dreg(r7) ) \
118: __oc_r6 = (unsigned long)a1; \
119: __oc_r7 = (unsigned long)a2; \
120: _oc_syscall( number ) \
121: _oc_input( ir(r6), ir(r7) ) \
122: _oc_tail
123:
124: #define _osi_call3( type, name, number, t1, a1, t2, a2, t3, a3 ) \
125: type name( t1 a1, t2 a2, t3 a3 ) \
126: _oc_head( dreg(r6), dreg(r7), dreg(r8) ) \
127: __oc_r6 = (unsigned long)a1; \
128: __oc_r7 = (unsigned long)a2; \
129: __oc_r8 = (unsigned long)a3; \
130: _oc_syscall( number ) \
131: _oc_input( ir(r6), ir(r7), ir(r8) ) \
132: _oc_tail
133:
134: #define _osi_call4( type, name, number, t1, a1, t2, a2, t3, a3, t4, a4 ) \
135: type name( t1 a1, t2 a2, t3 a3, t4 a4 ) \
136: _oc_head( dreg(r6), dreg(r7), dreg(r8), dreg(r9) ) \
137: __oc_r6 = (unsigned long)a1; \
138: __oc_r7 = (unsigned long)a2; \
139: __oc_r8 = (unsigned long)a3; \
140: __oc_r9 = (unsigned long)a4; \
141: _oc_syscall( number ) \
142: _oc_input( ir(r6), ir(r7), ir(r8), ir(r9) ) \
143: _oc_tail
144:
145: #define _osi_call5( type, name, number, t1, a1, t2, a2, t3, a3, t4, a4, t5, a5 ) \
146: type name( t1 a1, t2 a2, t3 a3, t4 a4, t5 a5 ) \
147: _oc_head( dreg(r6), dreg(r7), dreg(r8), dreg(r9), dreg(r10) ) \
148: __oc_r6 = (unsigned long)a1; \
149: __oc_r7 = (unsigned long)a2; \
150: __oc_r8 = (unsigned long)a3; \
151: __oc_r9 = (unsigned long)a4; \
152: __oc_r10 = (unsigned long)a5; \
153: _oc_syscall( number ) \
154: _oc_input( ir(r6), ir(r7), ir(r8), ir(r9), ir(r10) ) \
155: _oc_tail
156:
157: #define _osi_call6( type, name, number, t1, a1, t2, a2, t3, a3, t4, a4, t5, a5, t6, a6 ) \
158: type name( t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6 ) \
159: _oc_head( dreg(r6), dreg(r7), dreg(r8), dreg(r9), dreg(r10), dreg(r11) )\
160: __oc_r6 = (unsigned long)a1; \
161: __oc_r7 = (unsigned long)a2; \
162: __oc_r8 = (unsigned long)a3; \
163: __oc_r9 = (unsigned long)a4; \
164: __oc_r10 = (unsigned long)a5; \
165: __oc_r11 = (unsigned long)a6; \
166: _oc_syscall( number ) \
167: _oc_input( ir(r6), ir(r7), ir(r8), ir(r9), ir(r10), ir(r11) ) \
168: _oc_tail
169:
170:
171: /************************************************************************/
172: /* Special */
173: /************************************************************************/
174:
175: /* r4 returned in retarg1 pointer */
176: #define _osi_call0_w1( type, name, number, type1, retarg1 ) \
177: type name( type1 retarg1 ) \
178: _oc_head() \
179: _oc_syscall( number, rr(r4) ) \
180: _oc_input() \
181: *retarg1 = __oc_r4; \
182: _oc_tail
183:
184: #define _osi_call0_w2( type, name, number, type1, retarg1 ) \
185: type name( type1 retarg1 ) \
186: _oc_head() \
187: _oc_syscall( number, rr(r4), rr(r5) ) \
188: _oc_input() \
189: ((unsigned long*)retarg1)[0] = __oc_r4; \
190: ((unsigned long*)retarg1)[1] = __oc_r5; \
191: _oc_tail
192:
193: /* r4-r8 returned in retarg1 pointer */
194: #define _osi_call0_w5( type, name, number, type1, retarg1 ) \
195: type name( type1 retarg1 ) \
196: _oc_head( dreg(r6), dreg(r7), dreg(r8) ) \
197: _oc_syscall( number, \
198: rr(r4), rr(r5), rr(r6), rr(r7), rr(r8) ) \
199: _oc_input() \
200: ((unsigned long*)retarg1)[0] = __oc_r4; \
201: ((unsigned long*)retarg1)[1] = __oc_r5; \
202: ((unsigned long*)retarg1)[2] = __oc_r6; \
203: ((unsigned long*)retarg1)[3] = __oc_r7; \
204: ((unsigned long*)retarg1)[4] = __oc_r8; \
205: _oc_tail
206:
207: /* r4 returned in retarg pointer */
208: #define _osi_call1_w1( type, name, number, t1, a1, t2, retarg ) \
209: type name( t1 a1, t2 retarg ) \
210: _oc_head( dreg(r6) ) \
211: __oc_r6 = (unsigned long)a1; \
212: _oc_syscall( number, rr(r4) ) \
213: _oc_input( ir(r6) ) \
214: ((unsigned long*)retarg)[0] = __oc_r4; \
215: _oc_tail
216:
217: /* r4,r5 returned in retarg1, retarg2 */
218: #define _osi_call1_w1w1( type, name, number, t1, a1, t2, retarg1, t3, retarg2 ) \
219: type name( t1 a1, t2 retarg1, t3 retarg2 ) \
220: _oc_head( dreg(r6) ) \
221: __oc_r6 = (unsigned long)a1; \
222: _oc_syscall( number, rr(r4), rr(r5) ) \
223: _oc_input( ir(r6) ) \
224: ((unsigned long*)retarg1)[0] = __oc_r4; \
225: ((unsigned long*)retarg2)[0] = __oc_r5; \
226: _oc_tail
227:
228: /* r4,r5 returned in retarg1, retarg2, retarg3 */
229: #define _osi_call1_w1w1w1( type, name, number, t1, a1, t2, retarg1, t3, retarg2, t4, retarg3 ) \
230: type name( t1 a1, t2 retarg1, t3 retarg2, t4 retarg3 ) \
231: _oc_head( dreg(r6) ) \
232: __oc_r6 = (unsigned long)a1; \
233: _oc_syscall( number, rr(r4), rr(r5), rr(r6) ) \
234: _oc_input( ir(r6) ) \
235: ((unsigned long*)retarg1)[0] = __oc_r4; \
236: ((unsigned long*)retarg2)[0] = __oc_r5; \
237: ((unsigned long*)retarg3)[0] = __oc_r6; \
238: _oc_tail
239:
240: /* r4,r5 returned in retarg pointer */
241: #define _osi_call1_w2( type, name, number, t1, a1, t2, retarg ) \
242: type name( t1 a1, t2 retarg ) \
243: _oc_head( dreg(r6) ) \
244: __oc_r6 = (unsigned long)a1; \
245: _oc_syscall( number, rr(r4), rr(r5) ) \
246: _oc_input( ir(r6) ) \
247: ((unsigned long*)retarg)[0] = __oc_r4; \
248: ((unsigned long*)retarg)[1] = __oc_r5; \
249: _oc_tail
250:
251: /* r4-r7 returned in retarg pointer */
252: #define _osi_call1_w4( type, name, number, t1, a1, t2, retarg ) \
253: type name( t1 a1, t2 retarg ) \
254: _oc_head( dreg(r6), dreg(r7) ) \
255: __oc_r6 = (unsigned long)a1; \
256: _oc_syscall( number, rr(r4), rr(r5), rr(r6), rr(r7) ) \
257: _oc_input( ir(r6) ) \
258: ((unsigned long*)retarg)[0] = __oc_r4; \
259: ((unsigned long*)retarg)[1] = __oc_r5; \
260: ((unsigned long*)retarg)[2] = __oc_r6; \
261: ((unsigned long*)retarg)[3] = __oc_r7; \
262: _oc_tail
263:
264:
265: /* r4-r5 returned in retarg pointer */
266: #define _osi_call2_w2( type, name, number, t1, a1, t2, a2, t3, retarg ) \
267: type name( t1 a1, t2 a2, t3 retarg ) \
268: _oc_head( dreg(r6), dreg(r7) ) \
269: __oc_r6 = (unsigned long)a1; \
270: __oc_r7 = (unsigned long)a2; \
271: _oc_syscall( number, rr(r4), rr(r5) ) \
272: _oc_input( ir(r6), ir(r7) ) \
273: ((unsigned long*)retarg)[0] = __oc_r4; \
274: ((unsigned long*)retarg)[1] = __oc_r5; \
275: _oc_tail
276:
277: /* r4-r7 returned in retarg pointer */
278: #define _osi_call2_w4( type, name, number, t1, a1, t2, a2, t3, retarg ) \
279: type name( t1 a1, t2 a2, t3 retarg ) \
280: _oc_head( dreg(r6), dreg(r7) ) \
281: __oc_r6 = (unsigned long)a1; \
282: __oc_r7 = (unsigned long)a2; \
283: _oc_syscall( number, rr(r4), rr(r5), rr(r6), rr(r7) ) \
284: _oc_input( ir(r6), ir(r7) ) \
285: ((unsigned long*)retarg)[0] = __oc_r4; \
286: ((unsigned long*)retarg)[1] = __oc_r5; \
287: ((unsigned long*)retarg)[2] = __oc_r6; \
288: ((unsigned long*)retarg)[3] = __oc_r7; \
289: _oc_tail
290:
291: #ifdef SHORT_REGLIST
292: /* r4-r9 returned in retarg pointer */
293: #define _osi_call2_w6( type, name, number, t1, a1, t2, a2, t3, retarg ) \
294: type name( t1 a1, t2 a2, t3 retarg ) \
295: _oc_head( dreg(r6), dreg(r7), dreg(r10) ) \
296: __oc_r6 = (unsigned long)a1; \
297: __oc_r7 = (unsigned long)a2; \
298: __oc_r10 = (unsigned long)retarg; \
299: _oc_syscall_r10w6( number, ir(r6), ir(r7) ) \
300: _oc_tail
301:
302: #else /* SHORT_REGLIST */
303:
304: /* r4-r9 returned in retarg pointer */
305: #define _osi_call2_w6( type, name, number, t1, a1, t2, a2, t3, retarg ) \
306: type name( t1 a1, t2 a2, t3 retarg ) \
307: _oc_head( dreg(r6), dreg(r7), dreg(r8), dreg(r9) ) \
308: __oc_r6 = (unsigned long)a1; \
309: __oc_r7 = (unsigned long)a2; \
310: _oc_syscall( number, rr(r4), rr(r5), rr(r6), rr(r7), rr(r8), rr(r9) ) \
311: _oc_input( ir(r6), ir(r7) ) \
312: ((unsigned long*)retarg)[0] = __oc_r4; \
313: ((unsigned long*)retarg)[1] = __oc_r5; \
314: ((unsigned long*)retarg)[2] = __oc_r6; \
315: ((unsigned long*)retarg)[3] = __oc_r7; \
316: ((unsigned long*)retarg)[4] = __oc_r8; \
317: ((unsigned long*)retarg)[5] = __oc_r9; \
318: _oc_tail
319:
320: #endif /* SHORT_REGLIST */
321:
322:
323: /************************************************************************/
324: /* OSI call inlines */
325: /************************************************************************/
326:
327: static inline _osi_call1( int, OSI_CallAvailable, OSI_CALL_AVAILABLE, int, osi_num );
328:
329: static inline _osi_call1( int, OSI_PutC, OSI_LOG_PUTC, int, ch );
330:
331: static inline _osi_call1( int, OSI_Debugger, OSI_DEBUGGER, int, num );
332: static inline _osi_call0( int, OSI_Exit, OSI_EXIT );
333:
334: /* misc */
335: static inline _osi_call0( unsigned long, OSI_GetLocalTime, OSI_GET_LOCALTIME );
336: static inline _osi_call0( unsigned long, OSI_GetGMTTime, OSI_GET_GMT_TIME );
337: static inline _osi_call1( int, OSI_USleep, OSI_USLEEP, int, usecs );
338:
339: /* NVRAM */
340: static inline _osi_call0( int, OSI_NVRamSize, OSI_NVRAM_SIZE );
341: static inline _osi_call1( int, OSI_ReadNVRamByte, OSI_READ_NVRAM_BYTE, int, offs );
342: static inline _osi_call2( int, OSI_WriteNVRamByte, OSI_WRITE_NVRAM_BYTE, int, offs,
343: unsigned char, ch );
344:
345: /* keyboard stuff */
346: static inline _osi_call0_w1( int, OSI_GetAdbKey2, OSI_GET_ADB_KEY, int *, raw_key );
347: static inline _osi_call1( int, OSI_KbdCntrl, OSI_KBD_CNTRL, int, cmd );
348:
349: static inline int OSI_GetAdbKey( void )
350: { int dummy_raw_key; return OSI_GetAdbKey2( &dummy_raw_key ); }
351: static inline _osi_call2( int, OSI_MapAdbKey, OSI_MAP_ADB_KEY, int, keycode, int, adbkey )
352: static inline _osi_call1( int, OSI_KeycodeToAdb, OSI_KEYCODE_TO_ADB, int, keycode );
353: static inline _osi_call0( int, OSI_SaveKeymapping, OSI_SAVE_KEYMAPPING );
354:
355: /* mouse support */
356: struct osi_mouse;
357: static inline _osi_call0_w5( int, OSI_GetMouse, OSI_GET_MOUSE, struct osi_mouse *, ret );
358: static inline _osi_call0( int, OSI_GetMouseDPI, OSI_GET_MOUSE_DPI );
359:
360: /* video */
361: static inline _osi_call2( int, OSI_SetVMode_, OSI_SET_VMODE, int, mode, int, depth_mode );
362: struct osi_get_vmode_info;
363: static inline _osi_call2_w6( int, OSI_GetVModeInfo_, OSI_GET_VMODE_INFO, int, mode, int, depth_mode,
364: struct osi_get_vmode_info *, ret );
365: static inline _osi_call1( int, OSI_SetVPowerState, OSI_SET_VIDEO_POWER, int, power_state );
366: static inline _osi_call2( int, OSI_SetColor, OSI_SET_COLOR, int, index, int, rgb );
367: static inline _osi_call0_w1( int, OSI_VideoAckIRQ, OSI_VIDEO_ACK_IRQ, int *, events );
368:
369: static inline void OSI_RefreshPalette( void ) { OSI_SetColor(-1,0); }
370:
371: /* PIC (mac-io replacement) */
372: static inline _osi_call1( int, OSI_PICMaskIRQ, OSI_PIC_MASK_IRQ, int, irq );
373: static inline _osi_call1( int, OSI_PICUnmaskIRQ, OSI_PIC_UNMASK_IRQ, int, irq );
374: static inline _osi_call2( int, OSI_PICAckIRQ, OSI_PIC_ACK_IRQ, int, irq, int, mask_it );
375: static inline _osi_call0( int, OSI_PICGetActiveIRQ, OSI_PIC_GET_ACTIVE_IRQ );
376:
377: /* sound */
378: static inline _osi_call1( int, OSI_SoundCntl, OSI_SOUND_CNTL, int, cmd );
379: static inline _osi_call2( int, OSI_SoundCntl1, OSI_SOUND_CNTL, int, cmd, int, p1 );
380: static inline _osi_call3( int, OSI_SoundCntl2, OSI_SOUND_CNTL, int, cmd, int, p1, int, p2 );
381: static inline _osi_call0_w2( int, OSI_SoundIRQAck, OSI_SOUND_IRQ_ACK, unsigned long *, timestamp );
382: static inline _osi_call3( int, OSI_SoundWrite, OSI_SOUND_WRITE, int, physbuf, int, len, int, restart );
383: static inline _osi_call3( int, OSI_SoundSetVolume, OSI_SOUND_SET_VOLUME, int, hwvol, int, speakervol, int, mute );
384:
385: /* async block driver */
386: struct ablk_disk_info;
387: static inline _osi_call2_w4( int, OSI_ABlkDiskInfo, OSI_ABLK_DISK_INFO, int, channel, int, unit,
388: struct ablk_disk_info *, retinfo );
389: static inline _osi_call1( int, OSI_ABlkKick, OSI_ABLK_KICK, int, channel );
390: static inline _osi_call1_w1w1w1( int, OSI_ABlkIRQAck, OSI_ABLK_IRQ_ACK, int, channel, int *, req_count,
391: int *, active, int *, events );
392: static inline _osi_call3( int, OSI_ABlkRingSetup, OSI_ABLK_RING_SETUP, int, channel, int, mphys, int, n_el );
393: static inline _osi_call2( int, OSI_ABlkCntrl, OSI_ABLK_CNTRL, int, channel, int, cmd );
394: static inline _osi_call3( int, OSI_ABlkCntrl1, OSI_ABLK_CNTRL, int, channel, int, cmd, int, param );
395: static inline _osi_call5( int, OSI_ABlkSyncRead, OSI_ABLK_SYNC_READ, int, channel, int, unit,
396: int, blk, unsigned long, mphys, int, size );
397: static inline _osi_call5( int, OSI_ABlkSyncWrite, OSI_ABLK_SYNC_WRITE, int, channel, int, unit,
398: int, blk, unsigned long, mphys, int, size );
399: static inline _osi_call2( int, OSI_ABlkBlessDisk, OSI_ABLK_BLESS_DISK, int, channel, int, unit );
400:
401: static inline _osi_call0( int, OSI_CMountDrvVol, OSI_CMOUNT_DRV_VOL );
402:
403: /* enet2 */
404: static inline _osi_call0( int, OSI_Enet2Open, OSI_ENET2_OPEN );
405: static inline _osi_call0( int, OSI_Enet2Close, OSI_ENET2_CLOSE );
406: static inline _osi_call3( int, OSI_Enet2RingSetup, OSI_ENET2_RING_SETUP, int, which_ring,
407: int, ring_mphys, int, n_el );
408: static inline _osi_call2( int, OSI_Enet2Cntrl1, OSI_ENET2_CNTRL, int, cmd, int, param );
409: static inline _osi_call1( int, OSI_Enet2Cntrl, OSI_ENET2_CNTRL, int, cmd );
410: static inline _osi_call0( int, OSI_Enet2Kick, OSI_ENET2_KICK );
411:
412: static inline _osi_call0_w2( int, OSI_Enet2GetHWAddr__, OSI_ENET2_GET_HWADDR, unsigned long *, retbuf );
413: static inline int OSI_Enet2GetHWAddr( unsigned char *addr ) {
414: int ret;
415: unsigned long buf[2];
416:
417: ret = OSI_Enet2GetHWAddr__( buf );
418:
419: ((unsigned long*)addr)[0] = buf[0];
420: ((unsigned short*)addr)[2] = (buf[1] >> 16);
421: return ret;
422: }
423: static inline _osi_call2( int, OSI_Enet2IRQAck, OSI_ENET2_IRQ_ACK, int, irq_enable, int, rx_head );
424:
425: /* PROM (device-tree) */
426: static inline _osi_call2( int, OSI_PromIface, OSI_PROM_IFACE, int, what, int, ph );
427: static inline _osi_call3( int, OSI_PromIface1, OSI_PROM_IFACE, int, what, int, ph, int, p1 );
428: static inline _osi_call4( int, OSI_PromIface2, OSI_PROM_IFACE, int, what, int, ph, int, p1, int, p2 );
429: static inline _osi_call5( int, OSI_PromIface3, OSI_PROM_IFACE, int, what, int, ph, int, p1, int, p2, int, p3 );
430: static inline _osi_call2( int, OSI_PromPathIface, OSI_PROM_PATH_IFACE, int, what, const char *, p );
431:
432: /* emulation acceleration */
433: static inline _osi_call1( int, OSI_MapinMregs, OSI_MAPIN_MREGS, unsigned long, mphys );
434: static inline _osi_call3( int, OSI_EmuAccel, OSI_EMUACCEL, int, emuaccel_flags, int, param, int, inst_addr );
435:
436: /* timer frequency */
437: static inline _osi_call1( int, OSI_MticksToUsecs, OSI_MTICKS_TO_USECS, unsigned long, mticks );
438: static inline _osi_call1( int, OSI_UsecsToMticks, OSI_USECS_TO_MTICKS, unsigned long, usecs );
439:
440: /* fb info */
441: struct osi_fb_info;
442: static inline _osi_call0_w5( int, OSI_GetFBInfo, OSI_GET_FB_INFO, struct osi_fb_info *, retinfo );
443:
444: /* SCSI */
445: static inline _osi_call0( int, OSI_SCSIAck, OSI_SCSI_ACK );
446: static inline _osi_call1( int, OSI_SCSISubmit, OSI_SCSI_SUBMIT, int, req_mphys );
447: static inline _osi_call2( int, OSI_SCSIControl, OSI_SCSI_CNTRL, int, sel, int, param );
448:
449: /* TTY */
450: static inline _osi_call0( int, OSI_TTYGetc, OSI_TTY_GETC );
451: static inline _osi_call1( int, OSI_TTYPutc, OSI_TTY_PUTC, int, ch );
452: static inline _osi_call0( int, OSI_TTYIRQAck, OSI_TTY_IRQ_ACK );
453:
454: #endif /* _H_OSI_CALLS */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.