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
13typedef	int32 image_id;
14
15typedef enum {
16	B_APP_IMAGE			= 1,
17	B_LIBRARY_IMAGE,
18	B_ADD_ON_IMAGE,
19	B_SYSTEM_IMAGE
20} image_type;
21
22typedef 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// flags for _kern_load_image() (private API)
60enum {
61	B_WAIT_TILL_LOADED	= 0x01,
62		// Wait till the loader has loaded and relocated
63		// (but not yet initialized) the application
64		// image and all dependencies. If not supplied,
65		// the function returns before the loader
66		// started to do anything at all, i.e. it
67		// returns success, even if the executable
68		// doesn't exist.
69};
70
71#ifdef __cplusplus
72extern "C" {
73#endif
74
75thread_id load_image(int32 argc, const char **argv, const char **environ);
76image_id load_add_on(const char *path);
77status_t unload_add_on(image_id image);
78status_t get_image_symbol(image_id image, const char *name, int32 symbolType,
79				void **_symbolLocation);
80status_t get_nth_image_symbol(image_id image, int32 n, char *nameBuffer,
81				int32 *_nameLength, int32 *_symbolType, void **_symbolLocation);
82void clear_caches(void *address, size_t length, uint32 flags);
83
84#define get_image_info(image, info) \
85				_get_image_info((image), (info), sizeof(*(info)))
86#define get_next_image_info(team, cookie, info) \
87				_get_next_image_info((team), (cookie), (info), sizeof(*(info)))
88
89/* private, use the macros above */
90status_t _get_image_info(image_id image, image_info *info, size_t size);
91status_t _get_next_image_info(team_id team, int32 *cookie, image_info *info,
92				size_t size);
93
94#ifdef __cplusplus
95}
96#endif
97
98#endif	/* _IMAGE_H */
99