1/******************************************************************************
2/
3/	File:			image.h
4/
5/	Description:	Kernel interface for managing executable images.
6/
7/	Copyright 1993-98, Be Incorporated
8/
9******************************************************************************/
10
11#ifndef _IMAGE_H
12#define	_IMAGE_H
13
14#include <BeBuild.h>
15#include <OS.h>
16#include <sys/param.h>
17
18#ifdef __cplusplus
19extern "C" {
20#endif
21
22
23/*---------------------------------------------------------*/
24/*----- Image types, info, and functions ------------------*/
25
26#define	B_INIT_BEFORE_FUNCTION_NAME		"initialize_before"
27#define B_INIT_AFTER_FUNCTION_NAME		"initialize_after"
28#define	B_TERM_BEFORE_FUNCTION_NAME		"terminate_before"
29#define B_TERM_AFTER_FUNCTION_NAME		"terminate_after"
30
31typedef	int32 image_id;
32
33typedef enum {
34	B_APP_IMAGE = 1,
35	B_LIBRARY_IMAGE,
36	B_ADD_ON_IMAGE,
37	B_SYSTEM_IMAGE
38} image_type;
39
40typedef struct {
41	image_id	id;
42	image_type	type;
43	int32		sequence;
44	int32		init_order;
45	void		(*init_routine)();
46	void		(*term_routine)();
47	dev_t		device;
48	ino_t		node;
49	char		name[MAXPATHLEN];
50	void		*text;
51	void		*data;
52	int32		text_size;
53	int32		data_size;
54} image_info;
55
56// flags for _kern_load_image()
57enum {
58	B_WAIT_TILL_LOADED	= 0x01,	// Wait till the loader has loaded and relocated
59								// (but not yet initialized) the application
60								// image and all dependencies. If not supplied,
61								// the function returns before the loader
62								// started to do anything at all, i.e. it
63								// returns success, even if the executable
64								// doesn't exist.
65};
66
67extern _IMPEXP_ROOT thread_id	load_image(int32 argc, const char **argv,
68									const char **envp);
69extern _IMPEXP_ROOT image_id	load_add_on(const char *path);
70extern _IMPEXP_ROOT status_t	unload_add_on(image_id imageID);
71
72/* private; use the macros, below */
73extern _IMPEXP_ROOT status_t	_get_image_info (image_id imageID,
74									image_info *info, size_t size);
75extern _IMPEXP_ROOT status_t	_get_next_image_info (team_id team, int32 *cookie,
76									image_info *info, size_t size);
77/* use these */
78#define get_image_info(image, info)                        \
79              _get_image_info((image), (info), sizeof(*(info)))
80#define get_next_image_info(team, cookie, info)   \
81	          _get_next_image_info((team), (cookie), (info), sizeof(*(info)))
82
83
84/*---------------------------------------------------------*/
85/*----- symbol types and functions ------------------------*/
86
87#define	B_SYMBOL_TYPE_DATA		0x1
88#define	B_SYMBOL_TYPE_TEXT		0x2
89#define B_SYMBOL_TYPE_ANY		0x5
90
91extern _IMPEXP_ROOT status_t	get_image_symbol(image_id imid,
92									const char *name, int32 sclass,	void **ptr);
93extern _IMPEXP_ROOT status_t	get_nth_image_symbol(image_id imid, int32 index,
94									char *buf, int32 *bufsize, int32 *sclass,
95									void **ptr);
96
97
98/*---------------------------------------------------------*/
99/*----- cache manipulation --------------------------------*/
100
101#define B_FLUSH_DCACHE         0x0001	/* dcache = data cache */
102#define B_FLUSH_ICACHE         0x0004	/* icache = instruction cache */
103#define B_INVALIDATE_DCACHE    0x0002
104#define B_INVALIDATE_ICACHE    0x0008
105
106extern _IMPEXP_ROOT void	clear_caches(void *addr, size_t len, uint32 flags);
107
108/*---------------------------------------------------------*/
109
110#ifdef __cplusplus
111}
112#endif
113
114#endif	/* _IMAGE_H */
115