Usermode/libc - Fix strchr and strrchr behavior
[tpg/acess2.git] / KernelLand / Modules / Interfaces / UDI / include / udi_internal.h
1 /*
2  * Acess2 UDI Layer
3  * - By John Hodge (thePowersGang)
4  *
5  * udi_internal.h
6  * - Definitions for opaque structures
7  */
8 #ifndef _UDI_INTERNAL_H_
9 #define _UDI_INTERNAL_H_
10
11 #include <stdbool.h>
12 #include <stdarg.h>
13
14 #define NEW(type,extra) (type*)calloc(sizeof(type)extra,1)
15 #define NEW_wA(type,fld,cnt)    NEW(type,+(sizeof(((type*)NULL)->fld[0])*cnt))
16
17 typedef struct sUDI_PropMessage         tUDI_PropMessage;
18 typedef struct sUDI_PropRegion  tUDI_PropRegion;
19 typedef struct sUDI_PropDevSpec tUDI_PropDevSpec;
20
21 typedef const struct sUDI_MetaLang      tUDI_MetaLang;
22
23 typedef struct sUDI_MetaLangRef         tUDI_MetaLangRef;
24 typedef struct sUDI_BindOps     tUDI_BindOps;
25
26 typedef struct sUDI_DriverModule        tUDI_DriverModule;
27 typedef struct sUDI_DriverInstance      tUDI_DriverInstance;
28 typedef struct sUDI_DriverRegion        tUDI_DriverRegion;
29
30 typedef struct sUDI_ChildBinding        tUDI_ChildBinding;
31
32 struct sUDI_PropMessage
33 {
34          int    locale;
35         udi_ubit16_t    index;
36         const char      *string;
37 };
38
39 struct sUDI_PropRegion
40 {
41         udi_index_t     RegionIdx;
42         enum {
43                 UDI_REGIONTYPE_NORMAL,
44                 UDI_REGIONTYPE_FP,
45         }       Type;
46         enum {
47                 UDI_REGIONBINDING_STATIC,
48                 UDI_REGIONBINDING_DYNAMIC,
49         }       Binding;
50         enum {
51                 UDI_REGIONPRIO_MED,
52                 UDI_REGIONPRIO_LO,
53                 UDI_REGIONPRIO_HI,
54         }       Priority;
55         enum {
56                 UDI_REGIONLATENCY_NONOVERRRUNABLE,
57                 UDI_REGIONLATENCY_POWERFAIL,
58                 UDI_REGIONLATENCY_OVERRUNNABLE,
59                 UDI_REGIONLATENCY_RETRYABLE,
60                 // non_overrunable
61                 UDI_REGIONLATENCY_NONCTRITICAL,
62         }       Latency;
63         udi_ubit32_t    OverrunTime;
64
65         udi_index_t     BindMeta;
66         udi_index_t     PriBindOps;
67         udi_index_t     SecBindOps;
68         udi_index_t     BindCb;
69 };
70
71 struct sUDI_MetaLang
72 {
73         const char *Name;
74         const void      *MeiInfo;
75          int    nCbTypes;
76         struct {
77                 udi_size_t      Size;
78                 udi_size_t      ChainOfs;
79                 udi_layout_t    *Layout;
80         } CbTypes[];
81 };
82
83 struct sUDI_MetaLangRef
84 {
85         udi_ubit8_t     meta_idx;
86         const char      *interface_name;
87         tUDI_MetaLang   *metalang;
88         // TODO: pointer to metalanguage structure
89 };
90
91 struct sUDI_BindOps
92 {
93         udi_ubit8_t     meta_idx;
94         udi_ubit8_t     region_idx;
95         udi_ubit8_t     ops_idx;
96         udi_ubit8_t     bind_cb_idx;
97 };
98
99 struct sUDI_PropDevSpec
100 {
101          int    MessageNum;
102         udi_ubit8_t     MetaIdx;
103         tUDI_MetaLang   *Metalang;
104          int    nAttribs;
105         udi_instance_attr_list_t        Attribs[];
106 };
107
108 struct sUDI_DriverModule
109 {
110         tUDI_DriverModule       *Next;
111         void    *Base;
112
113         const udi_init_t        *InitInfo;
114
115         // Counts of arrays in InitInfo
116          int    nCBInit;
117          int    nOpsInit;
118                 
119         const char      *ModuleName;
120          int    nMessages;
121         tUDI_PropMessage        *Messages;      // Sorted list
122         
123          int    nRegionTypes;
124         tUDI_PropRegion *RegionTypes;
125
126          int    nMetaLangs;
127         tUDI_MetaLangRef        *MetaLangs;
128
129          int    nParents;
130         tUDI_BindOps    *Parents;
131         
132          int    nChildBindOps;
133         tUDI_BindOps    *ChildBindOps;
134
135          int    nDevices;
136         tUDI_PropDevSpec        **Devices;
137
138          int    nRegions;
139 };
140
141 struct sUDI_DriverInstance
142 {
143         struct sUDI_DriverInstance      *Next;
144         tUDI_DriverModule       *Module;
145         udi_channel_t   ManagementChannel;
146         tUDI_DriverInstance     *Parent;
147         tUDI_ChildBinding       *ParentChildBinding;
148
149          int    CurState;       // Current MA state
150         
151         tUDI_ChildBinding       *FirstChild;
152         tUDI_DriverRegion       *Regions[];
153 };
154
155 struct sUDI_DriverRegion
156 {
157         udi_init_context_t      *InitContext;
158 };
159
160 struct sUDI_ChildBinding
161 {
162         tUDI_ChildBinding       *Next;
163         
164         udi_ubit32_t    ChildID;
165         tUDI_MetaLang   *Metalang;
166         tUDI_BindOps    *BindOps;
167         
168         udi_ops_init_t  *Ops;
169         tUDI_DriverInstance     *BoundInstance;
170         
171          int    nAttribs;
172         udi_instance_attr_list_t        Attribs[];
173 };
174
175 // --- Metalanguages ---
176 extern tUDI_MetaLang    cMetaLang_Management;
177
178 // --- Index to pointer translation ---
179 extern udi_ops_init_t   *UDI_int_GetOps(tUDI_DriverInstance *Inst, udi_index_t index);
180 extern tUDI_MetaLang *UDI_int_GetMetaLang(tUDI_DriverModule *Inst, udi_index_t meta_idx);
181
182 // --- Channels ---
183 extern udi_channel_t    UDI_CreateChannel_Blank(tUDI_MetaLang *metalang);
184 extern udi_channel_t    UDI_CreateChannel_Linked(udi_channel_t orig, udi_ubit8_t spawn_idx);
185 extern int      UDI_BindChannel_Raw(udi_channel_t channel, bool other_side, tUDI_DriverInstance *inst, udi_index_t region_idx, udi_index_t meta_ops_num,  void *context, const void *ops);
186 extern int      UDI_BindChannel(udi_channel_t channel, bool other_side, tUDI_DriverInstance *inst, udi_index_t ops, udi_index_t region, void *context, bool is_child_bind, udi_ubit32_t child_ID);
187 extern tUDI_DriverInstance      *UDI_int_ChannelGetInstance(udi_cb_t *gcb, bool other_side, udi_index_t *region_idx);
188 extern void     UDI_int_ChannelSetContext(udi_channel_t channel, void *context);
189 extern const void       *UDI_int_ChannelPrepForCall(udi_cb_t *gcb, tUDI_MetaLang *metalang, udi_index_t meta_ops_num);
190 extern void     UDI_int_ChannelFlip(udi_cb_t *gcb);
191 extern void     UDI_int_ChannelReleaseFromCall(udi_cb_t *gcb);
192
193 // --- Async Calls ---
194 typedef struct sUDI_DeferredCall        tUDI_DeferredCall;
195 typedef void    tUDI_DeferredUnmarshal(tUDI_DeferredCall *Call);
196 struct sUDI_DeferredCall
197 {
198         struct sUDI_DeferredCall        *Next;
199         tUDI_DeferredUnmarshal  *Unmarshal;
200         udi_cb_t        *cb;
201         udi_op_t        *Handler;
202         // ...
203 };
204 extern void     UDI_int_DeferredThread(void *unused);   // Worker started by main.c
205 extern void     UDI_int_AddDeferred(tUDI_DeferredCall *Call);
206 extern void     UDI_int_MakeDeferredCb(udi_cb_t *cb, udi_op_t *handler);
207
208 extern void     UDI_int_MakeDeferredCbU8(udi_cb_t *cb, udi_op_t *handler, udi_ubit8_t arg1);
209 extern void     UDI_int_MakeDeferredCbS(udi_cb_t *cb, udi_op_t *handler, udi_status_t status);
210
211 // --- CBs ---
212 extern void *udi_cb_alloc_internal(tUDI_DriverInstance *Inst, udi_ubit8_t bind_cb_idx, udi_channel_t channel);
213 extern udi_cb_t *udi_cb_alloc_internal_v(tUDI_MetaLang *Meta, udi_index_t MetaCBNum, size_t inline_size, size_t scratch_size, udi_channel_t channel);
214 extern tUDI_MetaLang    *UDI_int_GetCbType(udi_cb_t *gcb, udi_index_t *meta_cb_num);
215
216 // --- Attribute Management ---
217 extern udi_instance_attr_type_t udi_instance_attr_get_internal(udi_cb_t *gcb, const char *attr_name, udi_ubit32_t child_ID, void *attr_value, udi_size_t attr_length, udi_size_t *actual_length);
218
219 // --- Layout ---
220 extern size_t   _udi_marshal_step(void *buf, size_t cur_ofs, udi_layout_t **layoutp, va_list *values);
221 extern size_t   _udi_marshal_values(void *buf, udi_layout_t *layout, va_list values);
222
223 // --- Buffers ---
224 extern udi_buf_t        *_udi_buf_allocate(const void *data, udi_size_t length, udi_buf_path_t path_handle);
225
226 #endif
227

UCC git Repository :: git.ucc.asn.au