1/*	$NetBSD: riscoscalls.h,v 1.10 2007/03/04 05:59:07 christos Exp $	*/
2
3/*-
4 * Copyright (c) 2001 Ben Harris
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 * 3. The name of the author may not be used to endorse or promote products
16 *    derived from this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
30/*
31 * This file defines the interface for the veneers over RISC OS SWIs used
32 * by libsa.  Only those SWIs actually needed by libsa are included.  In
33 * general, the interface is based on the one provided by OsLib, though
34 * this implementation is independent.
35 */
36
37#define OS_WriteC		0x000000
38#define XOS_WriteC		0x020000
39#define OS_NewLine		0x000003
40#define XOS_NewLine		0x020003
41#define OS_ReadC		0x000004
42#define XOS_ReadC		0x020004
43#define OS_CLI			0x000005
44#define XOS_CLI			0x020005
45#define OS_Byte			0x000006
46#define XOS_Byte		0x020006
47#define OS_Word			0x000007
48#define XOS_Word		0x020007
49#define OS_Args			0x000009
50#define XOS_Args		0x020009
51#define OS_GBPB			0x00000c
52#define XOS_GBPB		0x02000c
53#define OS_Find			0x00000d
54#define XOS_Find		0x02000d
55#define OS_GetEnv		0x000010
56#define XOS_GetEnv		0x020010
57#define OS_Exit			0x000011
58#define XOS_Exit		0x020011
59#define OS_IntOff		0x000014
60#define XOS_IntOff		0x020014
61#define OS_EnterOS		0x000016
62#define XOS_EnterOS		0x020016
63#define OS_Module		0x00001e
64#define XOS_Module		0x02001e
65#define OS_FSControl		0x000029
66#define XOS_FSControl		0x020029
67#define OS_ServiceCall		0x000030
68#define XOS_ServiceCall		0x020030
69#define OS_ReadVduVariables	0x000031
70#define XOS_ReadVduVariables	0x020031
71#define OS_SWINumberFromString	0x000039
72#define XOS_SWINumberFromString	0x020039
73#define OS_ReadMonotonicTime	0x000042
74#define XOS_ReadMonotonicTime	0x020042
75#define OS_ReadMemMapInfo	0x000051
76#define XOS_ReadMemMapInfo	0x020051
77#define OS_ReadMemMapEntries	0x000052
78#define XOS_ReadMemMapEntries	0x020052
79#define OS_ReadSysInfo		0x000058
80#define XOS_ReadSysInfo		0x020058
81#define OS_Memory		0x000068
82#define XOS_Memory		0x020068
83
84#define Cache_Control		0x000280
85#define XCache_Control		0x020280
86
87#define Wimp_SlotSize		0x0400ec
88#define XWimp_SlotSize		0x0600ec
89
90#define FileCore_DiscOp		0x040540
91#define XFileCore_DiscOp	0x060540
92#define FileCore_Drives		0x040542
93#define XFileCore_Drives	0x060542
94#define FileCore_SectorOp	0x04054A
95#define XFileCore_SectorOp	0x06054A
96#define FileCore_DiscOp64	0x04054E
97#define XFileCore_DiscOp64	0x06054E
98
99
100#ifndef __ASSEMBLER__
101typedef struct os_error {
102	u_int32_t errnum;
103	char errmess[252];
104} os_error;
105
106/* Errors talking to the console may as well be fatal. */
107
108extern void os_writec(int);
109extern void os_new_line(void);
110extern int os_readc(void);
111#endif
112
113/* OS_CLI */
114
115#ifndef __ASSEMBLER__
116extern void os_cli(char *);
117extern os_error *xos_cli(char *);
118#endif
119
120/* OS_Byte */
121
122#define osbyte_OUTPUT_CURSOR_POSITION	165
123#define osbyte_VAR_VSYNC_TIMER		176
124
125#ifndef __ASSEMBLER__
126extern void os_byte(int, int, int, int *, int *);
127extern int osbyte_read(int);
128#endif
129
130/* OS_Word */
131
132#define osword_WRITE_SCREEN_ADDRESS	 22
133
134#ifndef __ASSEMBLER__
135extern void os_word(int, char *);
136#endif
137
138/* OS_Args */
139
140#define OSArgs_ReadPtr		0
141#define OSArgs_SetPtr		1
142#define OSArgs_ReadExt		2
143#define OSArgs_SetExt		3
144#define OSArgs_ReadAllocation	4
145#define OSArgs_ReadEOFStatus	5
146
147#ifndef __ASSEMBLER__
148extern os_error *xosargs_read(int, int, int *);
149extern os_error *xosargs_set(int, int, int);
150
151#define xosargs_read_ptr(f, vp)	xosargs_read(OSArgs_ReadPtr, (f), (vp))
152#define xosargs_set_ptr(f, v)	xosargs_set(OSArgs_SetPtr, (f), (v))
153#define xosargs_read_ext(f, vp)	xosargs_read(OSArgs_ReadExt, (f), (vp))
154#define xosargs_set_ext(f, v)	xosargs_set(OSArgs_SetExt, (f), (v))
155#define xosargs_read_allocation(f, vp) \
156				xosargs_read(OSArgs_ReadAllocation, (f), (vp))
157#define xosargs_read_eof_status(f, vp) \
158				xosargs_read(OSArgs_ReadEOFStatus, (f), (vp))
159#endif
160
161/* OS_GBPB */
162
163#define OSGBPB_WriteAt		1
164#define OSGBPB_Write		2
165#define OSGBPB_ReadAt		3
166#define OSGBPB_Read		4
167
168#ifndef __ASSEMBLER__
169extern os_error *xosgbpb_write(int, char const *, int, int *);
170extern os_error *xosgbpb_read(int, char *, int, int *);
171#endif
172
173/* OS_Find */
174
175#define OSFind_Close	0x00
176#define OSFind_Openin	0x40
177#define OSFind_Openout	0x80
178#define OSFind_Openup	0xc0
179
180#define osfind_PATH		0x01
181#define osfind_PATH_VAR		0x02
182#define osfind_NO_PATH		0x03
183#define osfind_ERROR_IF_DIR	0x04
184#define osfind_ERROR_IF_ABSENT	0x08
185
186#ifndef __ASSEMBLER__
187extern os_error *xosfind_close(int);
188extern os_error *xosfind_open(int, char const *, char const *, int *);
189#endif
190
191/* OS_ReadSysInfo */
192
193#define	OSReadSysInfo_ReadConfiguredScreenSize	0x00
194#define OSReadSysInfo_ReadMonitorInfo		0x01
195#define OSReadSysInfo_ReadChipPresenceAndId	0x02
196#define OSReadSysInfo_ReadSuperIOFeatures	0x03
197#define OSReadSysInfo_ReadPlatformClass		0x08
198
199#define osreadsysinfo_IOEB_ASIC_PRESENT		0x01
200#define osreadsysinfo_SUPERIO_PRESENT		0x02
201#define osreadsysinfo_LCD_ASIC_PRESENT		0x04
202
203#define osreadsysinfo_Platform_Unknown		0x00
204#define osreadsysinfo_Platform_RiscPC		0x01
205#define osreadsysinfo_Platform_A7000		0x02
206#define osreadsysinfo_Platform_A7000Plus	0x03
207#define osreadsysinfo_Platform_Phoebe		0x04
208#define osreadsysinfo_Platform_Pace		0x05
209#define osreadsysinfo_Platform_VirtualRPC	0x06
210#define osreadsysinfo_Platform_A9		0x07
211
212#ifndef __ASSEMBLER__
213extern void os_readsysinfo(int what, int *r0, int *r1, int *r2, int *r3, int *r4);
214#define os_readsysinfo_configured_screensize(s) \
215	os_readsysinfo(OSReadSysInfo_ReadConfiguredScreenSize, (s), 0, 0, 0, 0)
216
217#define os_readsysinfo_monitor_info(mode, type, sync) \
218	os_readsysinfo(OSReadSysInfo_ReadMonitorInfo, (mode), (type), (sync), 0, 0)
219
220#define os_readsysinfo_chip_presence(ioeb, superio, lcd) \
221	os_readsysinfo(OSReadSysInfo_ReadChipPresenceAndId, (ioeb), (superio), (lcd), 0, 0)
222
223#define os_readsysinfo_unique_id(low, high) \
224	os_readsysinfo(OSReadSysInfo_ReadChipPresenceAndId, 0, 0, 0, (low), (high))
225
226#define os_readsysinfo_superio_features(basic, extra) \
227	os_readsysinfo(OSReadSysInfo_ReadSuperIOFeatures, (basic), (extra), 0, 0, 0)
228
229#define os_readsysinfo_platform_class(class, flags, feature) \
230	os_readsysinfo(OSReadSysInfo_ReadPlatformClass, (class), (flags), (feature), 0, 0)
231
232#endif
233
234/* OS_Memory */
235
236#define OSMemory_PageOp				0x00
237#define OSMemory_ReadArrangementTableSize	0x06
238#define OSMemory_ReadArrangementTable		0x07
239#define OSMemory_ReadSize			0x08
240#define OSMemory_ReadController			0x09
241
242#define osmemory_GIVEN_PAGE_NO		0x0100
243#define osmemory_GIVEN_LOG_ADDR		0x0200
244#define osmemory_GIVEN_PHYS_ADDR	0x0400
245#define osmemory_RETURN_PAGE_NO		0x0800
246#define osmemory_RETURN_LOG_ADDR	0x1000
247#define osmemory_RETURN_PHYS_ADDR	0x2000
248
249#define osmemory_TYPE			0xf00
250#define osmemory_TYPE_SHIFT		8
251#define osmemory_TYPE_ABSENT		0x0
252#define osmemory_TYPE_DRAM		0x1
253#define osmemory_TYPE_VRAM		0x2
254#define osmemory_TYPE_ROM		0x3
255#define osmemory_TYPE_IO		0x4
256/* 5, 6, 7 are undefined */
257#define osmemory_TYPE_ALLOCATABLE_MASK	0x8	/* bit signaling allocatable */
258
259
260#ifndef __ASSEMBLER__
261struct page_info {
262	int	pagenumber;
263	int	logical;
264	int	physical;
265};
266
267extern void osmemory_read_arrangement_table_size(int *size, int *nbpp);
268extern os_error *xosmemory_read_arrangement_table_size(int *size, int *nbpp);
269extern void osmemory_read_arrangement_table(unsigned char *block);
270extern os_error *xosmemory_read_arrangement_table(unsigned char *block);
271extern void osmemory_page_op(int fromto, struct page_info *block, int num_pages);
272#endif
273
274/* Misc */
275#ifndef __ASSEMBLER__
276extern char *os_get_env(void **, void **);
277
278extern void os_exit(os_error const *, int) __attribute__((noreturn));
279
280extern void os_int_off(void);
281
282extern void os_enter_os(void);
283#endif
284
285#define OSModule_Alloc		6
286#define OSModule_Free		7
287#define OSModule_Lookup		18
288
289#ifndef __ASSEMBLER__
290extern os_error *xosmodule_alloc(int, void **);
291extern os_error *xosmodule_free(void *);
292extern os_error *xosmodule_lookup(char const *, int *, int *, void **, void **,
293    char **);
294#endif
295
296#define OSFSControl_AddFS		12
297#define OSFSControl_SelectFS		14
298#define OSFSControl_RemoveFS		16
299#define OSFSControl_Shutdown		23
300
301#define fileswitch_SUPPORTS_SPECIAL		(1 << 31)
302#define fileswitch_INTERACTIVE			(1 << 30)
303#define fileswitch_SUPPORTS_EMPTY_NAMES		(1 << 29)
304#define fileswitch_NEEDS_CREATE			(1 << 28)
305#define fileswitch_NEEDS_FLUSH			(1 << 27)
306#define fileswitch_SUPPORTS_STAMP_NAMED		(1 << 26)
307#define fileswitch_SUPPORTS_FILE_INFO		(1 << 25)
308#define fileswitch_SUPPORTS_SET_CONTEXTS	(1 << 24) /* MBZ in RO3 */
309#define fileswitch_SUPPORTS_IMAGE		(1 << 23)
310#define fileswitch_NEEDS_URD_AND_LIB		(1 << 22)
311#define fileswitch_IMPLICIT_DIRECTORIES		(1 << 21)
312#define fileswitch_NO_LOAD_ENTRY		(1 << 20)
313#define fileswitch_NO_SAVE_ENTRY		(1 << 19)
314#define fileswitch_NO_FILE_ENTRIES		(1 << 18)
315#define fileswitch_HAS_EXTRA_FLAGS		(1 << 17)
316#define fileswitch_READ_ONLY			(1 << 16)
317
318#define fileswitch_SUPPORTS_DIR_CHANGE		(1 << 0)
319#define fileswitch_NEEDS_CAT			(1 << 1)
320#define fileswitch_NEEDS_EX			(1 << 2)
321
322#define fileswitch_NOT_FOUND	0
323#define fileswitch_IS_FILE	1
324#define fileswitch_IS_DIR	2
325#define fileswitch_IS_IMAGE	3
326
327#define fileswitch_ATTR_OWNER_READ	(1 << 0)
328#define fileswitch_ATTR_OWNER_WRITE	(1 << 1)
329#define fileswitch_ATTR_OWNER_LOCKED	(1 << 3)
330#define fileswitch_ATTR_WORLD_READ	(1 << 4)
331#define fileswitch_ATTR_WORLD_WRITE	(1 << 5)
332#define fileswitch_ATTR_WORLD_LOCKED	(1 << 7)
333
334#ifndef __ASSEMBLER__
335struct fileswitch_dirent {
336	uint32_t	loadaddr;
337	uint32_t	execaddr;
338	uint32_t	length;
339	uint32_t	attr;
340	uint32_t	objtype;
341	char		name[1];	/* Actually variable length */
342};
343
344extern os_error *xosfscontrol_shutdown(void);
345#endif
346
347#define Service_FSRedeclare	0x40
348#define Service_PreReset	0x45
349
350#ifndef __ASSEMBLER__
351extern void service_pre_reset(void);
352#endif
353
354#define os_MODEVAR_LOG2_BPP		9
355#define os_MODEVAR_XWIND_LIMIT		11
356#define os_MODEVAR_YWIND_LIMIT		12
357#define os_VDUVAR_DISPLAY_START		149
358#define os_VDUVAR_TOTAL_SCREEN_SIZE	150
359#define os_VDUVAR_TCHAR_SPACEY		170
360
361#ifndef __ASSEMBLER__
362extern void os_read_vdu_variables(const int *, int *);
363
364extern os_error *xos_swi_number_from_string(char const *, int *);
365
366extern unsigned int os_read_monotonic_time(void);
367
368extern void os_read_mem_map_info(int *, int *);
369
370struct os_mem_map_request {
371	int page_no;
372	void *map;
373	int access;
374#define os_AREA_ACCESS_READ_WRITE	0
375#define os_AREA_ACCESS_READ_ONLY	1
376#define os_AREA_ACCESS_NONE		3
377};
378
379extern void os_read_mem_map_entries(struct os_mem_map_request *);
380
381extern os_error xcache_control(u_int, u_int, u_int *);
382
383#endif
384
385#define FileCoreDiscOp_ReadSectors		1
386
387#ifndef __ASSEMBLER__
388
389struct filecore_disc {
390	u_int8_t	log2secsize;
391	u_int8_t	secspertrack;
392	u_int8_t	heads;
393	u_int8_t	density;
394	u_int8_t	idlen;
395	u_int8_t	log2bpmp;
396	u_int8_t	skew;
397	u_int8_t	bootoption;
398	u_int8_t	lowsector;
399	u_int8_t	nzones;
400	u_int16_t	zone_spare;
401	u_int32_t	root;
402	u_int32_t	disc_size;
403	u_int16_t	disc_id;
404	char		disc_name[10];
405	u_int32_t	disc_type;
406	u_int32_t	disc_size_hi;
407	u_int8_t	share_size;
408	u_int8_t	big_flag;
409	u_int8_t	reserved[22];
410};
411
412struct filecore_daddr64 {
413	uint32_t	drive;
414	uint64_t	daddr;
415};
416
417extern os_error *xfilecorediscop_read_sectors(uint32_t, uint32_t, void *,
418    size_t, void *, uint32_t *, void **, size_t *);
419extern os_error *xfilecoresectorop_read_sectors(uint32_t, uint32_t, void *,
420    size_t, void *, uint32_t *, void **, size_t *);
421extern os_error *xfilecorediscop64_read_sectors(uint32_t,
422    struct filecore_daddr64 *, void *, size_t, struct filecore_disc const *,
423    void *, uint32_t *, void **, size_t *);
424extern os_error *xfilecore_drives(void *, int *, int *, int *);
425
426#endif
427
428/* RISC OS Error numbers */
429
430#define error_IS_ADIR			0xa8
431#define error_TOO_MANY_OPEN_FILES	0xc0
432#define error_FILE_NOT_FOUND		0xd6
433
434#ifndef __ASSEMBLER__
435extern int riscos_errno(os_error *);
436#endif
437