95edb6bfa90878c4801f0035f39844e4d946bff7
[tpg/acess2.git] / UDI / include / udi / mei.h
1 /*
2  * Acess2 UDI Layer
3  * - By John Hodge (thePowersGang)
4  *
5  * include/udi/mei.h
6  * - Metalanguage-to-Environment Interface
7  */
8 #ifndef _UDI__MEI_H_
9 #define _UDI__MEI_H_
10
11 typedef const struct udi_mei_init_s     udi_mei_init_t;
12 typedef const struct udi_mei_ops_vec_template_s udi_mei_ops_vec_template_t;
13 typedef const struct uid_mei_op_template_s      udi_mei_op_template_t;
14
15 typedef udi_ubit8_t udi_mei_enumeration_rank_func_t(udi_ubit32_t attr_device_match, void **attr_value_list);
16 typedef void udi_mei_direct_stub_t(udi_op_t *op, udi_cb_t *gcb, va_list arglist);
17 typedef void udi_mei_backend_stub_t(udi_op_t *op, udi_cb_t *gcb, void *marshal_space);
18
19 struct udi_mei_init_s
20 {
21         udi_mei_ops_vec_template_t      *ops_vec_template_list;
22         udi_mei_enumeration_rank_func_t *mei_enumeration_rank;
23 };
24
25 struct udi_mei_ops_vec_template_s
26 {
27         udi_index_t     meta_ops_num;
28         udi_ubit8_t     relationship;
29         const udi_mei_op_template_t     *op_template_list;
30 };
31 // Flags for `relationship`
32 #define UDI_MEI_REL_INITIATOR   (1U<<0)
33 #define UDI_MEI_REL_BIND        (1U<<1)
34 #define UDI_MEI_REL_EXTERNAL    (1U<<2)
35 #define UDI_MEI_REL_INTERNAL    (1U<<3)
36 #define UDI_MEI_REL_SINGLE      (1U<<4)
37
38 struct uid_mei_op_template_s
39 {
40         const char      *op_name;
41         udi_ubit8_t     op_category;
42         udi_ubit8_t     op_flags;
43         udi_index_t     meta_cb_num;
44         udi_index_t     completion_ops_num;
45         udi_index_t     completion_vec_idx;
46         udi_index_t     exception_ops_num;
47         udi_index_t     exception_vec_idx;
48         udi_mei_direct_stub_t   *direct_stub;
49         udi_mei_backend_stub_t  *backend_stub;
50         udi_layout_t    *visible_layout;
51         udi_layout_t    *marshal_layout;
52 };
53 /* Values for op_category */
54 #define UDI_MEI_OPCAT_REQ       1
55 #define UDI_MEI_OPCAT_ACK       2
56 #define UDI_MEI_OPCAT_NAK       3
57 #define UDI_MEI_OPCAT_IND       4
58 #define UDI_MEI_OPCAT_RES       5
59 #define UDI_MEI_OPCAT_RDY       6
60 /* Values for op_flags */
61 #define UDI_MEI_OP_ABORTABLE    (1U<<0)
62 #define UDI_MEI_OP_RECOVERABLE  (1U<<1)
63 #define UDI_MEI_OP_STATE_CHANGE (1U<<2)
64 /* Maximum Sizes For Control Block Layouts */
65 #define UDI_MEI_MAX_VISIBLE_SIZE        2000
66 #define UDI_MEI_MAX_MARSHAL_SIZE        4000
67
68
69 extern void     udi_mei_call(udi_cb_t *gcb, udi_mei_init_t *meta_info, udi_index_t meta_ops_num, udi_index_t vec_idx, ...);
70
71 #define _UDI_MEI_FIRST(lst, ...)        lst
72 #define _UDI_MEI_OTHER(lst, ...)        (__VA_ARGS__)
73 #define _UDI_MEI_VARG(type,name,vatype) \
74         type name = UDI_VA_ARG(arglist, type, vatype);
75 #define _UDI_MEI_VARGS0(argt,args,argva)
76 #define _UDI_MEI_VARGS1(argt,args,argva) \
77         _UDI_MEI_VARG(_UDI_MEI_FIRST argt, _UDI_MEI_FIRST args, _UDI_MEI_FIRST argva)
78 #define _UDI_MEI_VARGS2(argt,args,argva) \
79         _UDI_MEI_VARG(_UDI_MEI_FIRST argt, _UDI_MEI_FIRST args,_UDI_MEI_FIRST argva ) \
80         _UDI_MEI_VARGS1( _UDI_MEI_OTHER argt, _UDI_MEI_OTHER args, _UDI_MEI_OTHER argva )
81 #define _UDI_MEI_VARGS3(argt,args,argva) \
82         _UDI_MEI_VARG(_UDI_MEI_FIRST argt, _UDI_MEI_FIRST args, _UDI_MEI_FIRST argva) \
83         _UDI_MEI_VARGS2( _UDI_MEI_OTHER argt, _UDI_MEI_OTHER args,  _UDI_MEI_OTHER argva )
84
85 #define _UDI_MEI_ARG_LIST0(t,a)
86 #define _UDI_MEI_ARG_LIST1(t,a) , _UDI_MEI_FIRST t _UDI_MEI_FIRST a
87 #define _UDI_MEI_ARG_LIST2(t,a) , _UDI_MEI_FIRST t _UDI_MEI_FIRST a \
88          _UDI_MEI_ARG_LIST1(_UDI_MEI_OTHER t, _UDI_MEI_OTHER a)
89 #define _UDI_MEI_ARG_LIST3(t,a) , _UDI_MEI_FIRST t _UDI_MEI_FIRST a \
90          _UDI_MEI_ARG_LIST2(_UDI_MEI_OTHER t, _UDI_MEI_OTHER a)
91
92 #define _UDI_ARG_LIST_0()       
93 #define _UDI_ARG_LIST_1(a)      ,a
94 #define _UDI_ARG_LIST_2(a,b)    ,a,b
95 #define _UDI_ARG_LIST_3(a,b,c)  ,a,b,c
96         
97 #define UDI_MEI_STUBS(op_name, cb_type, argc, args, arg_types, arg_va_list, meta_ops_num, vec_idx) \
98         void op_name(cb_type *cb  _UDI_MEI_ARG_LIST##argc(arg_types, args) ) {\
99                 udi_mei_call(UDI_GCB(cb), &udi_mei_info, meta_ops_num, vec_idx _UDI_ARG_LIST_##argc args);\
100         }\
101         void op_name##_direct(udi_op_t *op, udi_cb_t *gcb, va_list arglist) {\
102                 _UDI_MEI_VARGS##argc(arg_types, args, arg_va_list)\
103                 (*(op_name##_op_t*)op)(UDI_MCB(gcb, cb_type) _UDI_ARG_LIST_##argc args);\
104         }\
105         void op_name##_backend(udi_op_t *op, udi_cb_t *gcb, void *marshal_space) {\
106         }
107
108 #endif
109

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