add obj handlers output in xseg reportall
[archipelago] / xseg / sys / util.h
1 #ifndef _XSEG_SYS_UTIL_H
2 #define _XSEG_SYS_UTIL_H
3
4 #include <_sysutil.h>
5 #include <sys/domain.h>
6
7 /* log stuff */
8
9
10
11 #define FMTARG(fmt, arg, format, ...) fmt format "%s", arg, ## __VA_ARGS__
12 #define XSEGLOG(...) (xseg_snprintf(__xseg_errbuf, 4096, FMTARG("%s: ", __func__, ## __VA_ARGS__, "")), \
13                     __xseg_errbuf[4095] = 0, __xseg_log(__xseg_errbuf))
14
15 #define XSEGLOG2(__ctx, __level, ...)           \
16                 do {                            \
17                         if (__level <= ((__ctx)->log_level)) { \
18                                 __xseg_log2(__ctx, __level, FMTARG("%s: ", __func__, ## __VA_ARGS__ ,"")); \
19                         }       \
20                 } while(0)
21
22 /*
23 void log_request(struct log_context *lc, struct xseg *xseg,  struct xseg_request *req)
24 {
25         __xseg_log2(lc, I, "\n\t"
26         "Request %lx: target[%u](xptr: %llu): %s, data[%llu](xptr: %llu): %s \n\t"
27         "offset: %llu, size: %llu, serviced; %llu, op: %u, state: %u, flags: %u \n\t"
28         "src: %u, src_transit: %u, dst: %u, dst_transit: %u",
29         (unsigned long) req, req->targetlen, (unsigned long long)req->target,
30         xseg_get_target(xseg, req),
31         (unsigned long long) req->datalen, (unsigned long long) req->data,
32         xseg_get_data(xseg, req),
33         (unsigned long long) req->offset, (unsigned long long) req->size,
34         (unsigned long long) req->serviced, req->op, req->state, req->flags,
35         (unsigned int) req->src_portno, (unsigned int) req->src_transit_portno,
36         (unsigned int) req->dst_portno, (unsigned int) req->dst_transit_portno);
37 }
38 */
39
40 /* general purpose xflags */
41 #define X_ALLOC    ((uint32_t) (1 << 0))
42 #define X_LOCAL    ((uint32_t) (1 << 1))
43 #define X_NONBLOCK ((uint32_t) (1 << 2))
44
45
46 typedef uint64_t xpointer;
47
48 /* type to be used as absolute pointer
49  * this should be the same as xqindex
50  * and must fit into a pointer type
51  */
52 typedef uint64_t xptr; 
53
54 #define Noneidx ((xqindex)-1)
55 #define Null ((xpointer)-1)
56
57 #define __align(x, shift) (((((x) -1) >> (shift)) +1) << (shift))
58
59 #define XPTR_TYPE(ptrtype)      \
60         union {                 \
61                 ptrtype *t;     \
62                 xpointer x;     \
63         }
64
65 #define XPTRI(xptraddr)         \
66         (       (xpointer)(unsigned long)(xptraddr) +   \
67                 (xptraddr)->x                           )
68
69 #define XPTRISET(xptraddr, ptrval)      \
70         ((xptraddr)->x  =       (xpointer)(ptrval) -                    \
71                                 (xpointer)(unsigned long)(xptraddr)     )
72
73 #define XPTR(xptraddr)          \
74         (       (typeof((xptraddr)->t))                         \
75                 (unsigned long)                                 \
76                 (       (xpointer)(unsigned long)(xptraddr) +   \
77                         (xptraddr)->x           )               )
78
79 #define XPTRSET(xptraddr, ptrval)       \
80         ((xptraddr)->x  =       (xpointer)(unsigned long)(ptrval) -     \
81                                 (xpointer)(unsigned long)(xptraddr)     )
82
83
84
85 #define XPTR_OFFSET(base, ptr) ((unsigned long)(ptr) - (unsigned long)(base))
86
87 #define XPTR_MAKE(ptrval, base) ((xptr) XPTR_OFFSET(base, ptrval))
88
89 #define XPTR_TAKE(xptrval, base)        \
90         ( (void *) ( (unsigned long) base + (unsigned long) xptrval))
91
92 #endif