~ubuntu-branches/ubuntu/jaunty/libspe2/jaunty

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
/*
 * libspe2 - A wrapper to allow direct execution of SPE binaries
 * Copyright (C) 2005 IBM Corp.
 *
 * This library is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation; either version 2.1 of the License,
 * or (at your option) any later version.
 *
 *  This library is distributed in the hope that it will be useful, but
 *  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 *  or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
 *  License for more details.
 *
 *   You should have received a copy of the GNU Lesser General Public License
 *   along with this library; if not, write to the Free Software Foundation,
 *   Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 */

#ifndef libspe2_types_h
#define libspe2_types_h

#ifdef __cplusplus
extern "C"
{
#endif

#include <limits.h>
#include "cbea_map.h"

/*
 * Data structure declarations for
 * SPE problem state areas
 * (part of public API)
 */

/** SPE program handle
 * Structure spe_program_handle per CESOF specification
 * libspe2 applications usually only keep a pointer
 * to the program handle and do not use the structure
 * directly.
 */
typedef struct spe_program_handle {
	/*
	 * handle_size allows for future extensions of the spe_program_handle 
	 * struct by new fields, without breaking compatibility with existing users. 
	 * Users of the new field would check whether the size is large enough. 
	 */
	unsigned int	handle_size;
	void		*elf_image;
	void		*toe_shadow;
} spe_program_handle_t;


/** SPE context
 * The SPE context is one of the base data structures for
 * the libspe2 implementation. It holds all persistent information
 * about a "logical SPE" used by the application. This data
 * structure should not be accessed directly, but the application
 * uses a pointer to an SPE context as an identifier for the
 * "logical SPE" it is dealing with through libspe2 API calls.
 */

struct spe_context 
 {
	/*
	 * Note: The debugger accesses this data structure, and assumes 
	 * it starts out with an spe_program_handle_t identifying the SPE
	 * executable running within this SPE thread.  Everything below
	 * is private to libspe.  
	 */
	spe_program_handle_t handle;
	/*  
	 * PRIVATE TO IMPLEMENTATION - DO NOT USE DIRECTLY
	 */
	struct spe_context_base_priv * base_private;
	struct spe_context_event_priv * event_private;
};
/** spe_context_ptr_t
 * 	This pointer serves as the identifier for a specific
 *	SPE context throughout the API (where needed)
 */
typedef struct spe_context * spe_context_ptr_t;

/** SPE gang context
 * The SPE gang context is one of the base data structures for
 * the libspe2 implementation. It holds all persistent information
 * about a group of SPE contexts that should be treated as a gang,
 * i.e., be execute together with certain properties. This data
 * structure should not be accessed directly, but the application
 * uses a pointer to an SPE gang context as an identifier for the
 * SPE gang it is dealing with through libspe2 API calls. 
 */
struct spe_gang_context
{
	/*  
	 * PRIVATE TO IMPLEMENTATION - DO NOT USE DIRECTLY
	 */
	struct spe_gang_context_base_priv * base_private;
	struct spe_gang_context_event_priv * event_private;
};
/** spe_gang_context_ptr_t
 * 	This pointer serves as the identifier for a specific
 *	SPE gang context throughout the API (where needed)
 */
typedef struct spe_gang_context * spe_gang_context_ptr_t;

/*
 * SPE stop information
 * This structure is used to return all information available 
 * on the reason why an SPE program stopped execution. 
 * This information is important for some advanced programming 
 * patterns and/or detailed error reporting.
 */
 
/** spe_stop_info_t
 */
typedef struct spe_stop_info {
	unsigned int stop_reason;
	union {
		int spe_exit_code;
		int spe_signal_code;
		int spe_runtime_error;
		int spe_runtime_exception; 
		int spe_runtime_fatal;
		int spe_callback_error;
		int spe_isolation_error;
		/* Reserved fields */
		void *__reserved_ptr;
		unsigned long long __reserved_u64;
	} result;
	int spu_status;
} spe_stop_info_t;

/*
 * SPE event structure
 * This structure is used for SPE event handling
 */
 
/** spe_event_data_t
 * User data to be associated with an event
 */
typedef union spe_event_data
{
  void *ptr;
  unsigned int u32;
  unsigned long long u64;
} spe_event_data_t;

/** spe_event_t
 */
typedef struct spe_event_unit
{
  unsigned int events;
  spe_context_ptr_t spe;
  spe_event_data_t data;
} spe_event_unit_t;

typedef void* spe_event_handler_ptr_t;
typedef int spe_event_handler_t;


/*
 *---------------------------------------------------------
 * 
 * API symbolic constants
 * 
 *---------------------------------------------------------
 */

enum ps_area { SPE_MSSYNC_AREA, SPE_MFC_COMMAND_AREA, SPE_CONTROL_AREA, SPE_SIG_NOTIFY_1_AREA, SPE_SIG_NOTIFY_2_AREA };

/** 
 * Flags for spe_context_create
 */
#define SPE_CFG_SIGNOTIFY1_OR   0x00000010
#define SPE_CFG_SIGNOTIFY2_OR   0x00000020
#define SPE_MAP_PS				0x00000040
#define SPE_ISOLATE				0x00000080
#define SPE_ISOLATE_EMULATE			0x00000100
#define SPE_EVENTS_ENABLE			0x00001000
#define SPE_AFFINITY_MEMORY			0x00002000


/**
 * Symbolic constants for stop reasons
 * as returned in spe_stop_info_t
 */
#define SPE_EXIT				1
#define SPE_STOP_AND_SIGNAL		2
#define SPE_RUNTIME_ERROR		3
#define SPE_RUNTIME_EXCEPTION	4
#define SPE_RUNTIME_FATAL		5
#define SPE_CALLBACK_ERROR		6
#define SPE_ISOLATION_ERROR		7

/**
 * Runtime errors
 */
#define SPE_SPU_STOPPED_BY_STOP     0x02 /* INTERNAL USE ONLY */
#define SPE_SPU_HALT                0x04
#define SPE_SPU_WAITING_ON_CHANNEL  0x08 /* INTERNAL USE ONLY */
#define SPE_SPU_SINGLE_STEP         0x10
#define SPE_SPU_INVALID_INSTR       0x20
#define SPE_SPU_INVALID_CHANNEL     0x40

/**
 * Runtime exceptions
 */
#define SPE_DMA_ALIGNMENT               0x0008
/* #define SPE_SPE_ERROR                   0x0010 */
#define SPE_DMA_SEGMENTATION            0x0020
#define SPE_DMA_STORAGE                 0x0040
#define SPE_INVALID_DMA                 0x0800

/**
 * SIGSPE maps to SIGURG 
 */
#define SIGSPE SIGURG

/**
 * Supported SPE events
 */
#define SPE_EVENT_OUT_INTR_MBOX		0x00000001
#define SPE_EVENT_IN_MBOX		0x00000002
#define SPE_EVENT_TAG_GROUP		0x00000004
#define SPE_EVENT_SPE_STOPPED		0x00000008

#define SPE_EVENT_ALL_EVENTS		SPE_EVENT_OUT_INTR_MBOX | \
					SPE_EVENT_IN_MBOX | \
					SPE_EVENT_TAG_GROUP | \
					SPE_EVENT_SPE_STOPPED

/**
 * Behavior flags for mailbox read/write functions
 */
#define SPE_MBOX_ALL_BLOCKING		1
#define SPE_MBOX_ANY_BLOCKING		2
#define SPE_MBOX_ANY_NONBLOCKING	3


/**
 * Behavior flags tag status functions
 */
#define SPE_TAG_ALL			1
#define SPE_TAG_ANY			2
#define SPE_TAG_IMMEDIATE		3


/**
 * Flags for _base_spe_context_run
 */
#define SPE_DEFAULT_ENTRY   UINT_MAX
#define SPE_RUN_USER_REGS	0x00000001	/* 128b user data for r3-5.   */
#define SPE_NO_CALLBACKS	0x00000002

/*
 *
 */
#define SPE_CALLBACK_NEW             1 
#define SPE_CALLBACK_UPDATE          2



#define SPE_COUNT_PHYSICAL_CPU_NODES 1
#define SPE_COUNT_PHYSICAL_SPES      2
#define SPE_COUNT_USABLE_SPES        3

/**
 * Signal Targets 
 */
#define SPE_SIG_NOTIFY_REG_1		0x0001
#define SPE_SIG_NOTIFY_REG_2		0x0002

#ifdef __cplusplus
}
#endif

#endif /*libspe2_types_h*/