xref: /haiku/headers/os/kernel/image.h (revision b247f935d133a42c427cad8a759a1bf2f65bc290)
1 /*
2  * Copyright 2007-2009, Haiku, Inc. All Rights Reserved.
3  * Distributed under the terms of the MIT license.
4  */
5 #ifndef _IMAGE_H
6 #define	_IMAGE_H
7 
8 
9 #include <OS.h>
10 #include <sys/param.h>
11 
12 
13 typedef	int32 image_id;
14 
15 typedef enum {
16 	B_APP_IMAGE			= 1,
17 	B_LIBRARY_IMAGE,
18 	B_ADD_ON_IMAGE,
19 	B_SYSTEM_IMAGE
20 } image_type;
21 
22 typedef struct {
23 	image_id	id;
24 	image_type	type;
25 	int32		sequence;
26 	int32		init_order;
27 	void		(*init_routine)();
28 	void		(*term_routine)();
29 	dev_t		device;
30 	ino_t		node;
31 	char		name[MAXPATHLEN];
32 	void		*text;
33 	void		*data;
34 	int32		text_size;
35 	int32		data_size;
36 
37 	/* Haiku R1 extensions */
38 	int32		api_version;	/* the Haiku API version used by the image */
39 	int32		abi;			/* the Haiku ABI used by the image */
40 } image_info;
41 
42 /* flags for clear_caches() */
43 #define B_FLUSH_DCACHE				0x0001	/* data cache */
44 #define B_FLUSH_ICACHE				0x0004	/* instruction cache */
45 #define B_INVALIDATE_DCACHE			0x0002
46 #define B_INVALIDATE_ICACHE			0x0008
47 
48 /* symbol types */
49 #define	B_SYMBOL_TYPE_DATA			0x1
50 #define	B_SYMBOL_TYPE_TEXT			0x2
51 #define B_SYMBOL_TYPE_ANY			0x5
52 
53 /* initialization/termination functions of shared objects */
54 #define	B_INIT_BEFORE_FUNCTION_NAME	"initialize_before"
55 #define B_INIT_AFTER_FUNCTION_NAME	"initialize_after"
56 #define	B_TERM_BEFORE_FUNCTION_NAME	"terminate_before"
57 #define B_TERM_AFTER_FUNCTION_NAME	"terminate_after"
58 
59 #define B_APP_IMAGE_SYMBOL		((void*)(addr_t)0)
60 	/* value that can be used instead of a pointer to a symbol in the program
61 	   image. */
62 #define B_CURRENT_IMAGE_SYMBOL	((void*)&__haiku_init_before)
63 	/* pointer to a symbol in the callers image */
64 
65 /* flags for _kern_load_image() (private API) */
66 enum {
67 	B_WAIT_TILL_LOADED	= 0x01,
68 		/* Wait till the loader has loaded and relocated (but not yet
69 		   initialized) the application image and all dependencies. If not
70 		   supplied, the function returns before the loader started to do
71 		   anything at all, i.e. it returns success, even if the executable
72 		   doesn't exist. */
73 };
74 
75 #ifdef __cplusplus
76 extern "C" {
77 #endif
78 
79 thread_id load_image(int32 argc, const char **argv, const char **environ);
80 image_id load_add_on(const char *path);
81 status_t unload_add_on(image_id image);
82 status_t get_image_symbol(image_id image, const char *name, int32 symbolType,
83 				void **_symbolLocation);
84 status_t get_nth_image_symbol(image_id image, int32 n, char *nameBuffer,
85 				int32 *_nameLength, int32 *_symbolType, void **_symbolLocation);
86 void clear_caches(void *address, size_t length, uint32 flags);
87 
88 #define get_image_info(image, info) \
89 				_get_image_info((image), (info), sizeof(*(info)))
90 #define get_next_image_info(team, cookie, info) \
91 				_get_next_image_info((team), (cookie), (info), sizeof(*(info)))
92 
93 /* private, use the macros above */
94 status_t _get_image_info(image_id image, image_info *info, size_t size);
95 status_t _get_next_image_info(team_id team, int32 *cookie, image_info *info,
96 				size_t size);
97 
98 /* private */
99 void __haiku_init_before(image_id id);
100 
101 #ifdef __cplusplus
102 }
103 #endif
104 
105 #endif	/* _IMAGE_H */
106