make macros better

This commit is contained in:
Yanyan Jiang 2018-08-10 16:15:06 +00:00
parent 1033cbd159
commit 87ea80951b
2 changed files with 25 additions and 48 deletions

View File

@ -86,18 +86,14 @@ void irqall();
} \
} while (0)
#define get_0(_0, _1, _2, _3, ...) ((uintptr_t)_0)
#define get_1(_0, _1, _2, _3, ...) ((uintptr_t)_1)
#define get_2(_0, _1, _2, _3, ...) ((uintptr_t)_2)
#define get_3(_0, _1, _2, _3, ...) ((uintptr_t)_3)
#define CALL_ARGS(_0, _1, _2, _3, ...) \
(_CallArgs) { .a0 = ((uintptr_t)_0), \
.a1 = ((uintptr_t)_1), \
.a2 = ((uintptr_t)_2), \
.a3 = ((uintptr_t)_3), } \
#define trace_wrapper_noret(rettype, stub, func, arglist, n, ...) \
_CallArgs call_args = (_CallArgs) { .a0 = get_0(__VA_ARGS__, 0, 0, 0, 0), \
.a1 = get_1(__VA_ARGS__, 0, 0, 0, 0), \
.a2 = get_2(__VA_ARGS__, 0, 0, 0, 0), \
.a3 = get_3(__VA_ARGS__, 0, 0, 0, 0), \
}; \
trace_call(stub, call_args); \
trace_call(stub, CALL_ARGS(__VA_ARGS__, 0, 0, 0, 0)); \
rettype ret = func arglist; \
trace_ret(stub, ret);
@ -105,4 +101,9 @@ void irqall();
trace_wrapper_noret(rettype, stub, func, arglist, n, __VA_ARGS__); \
return ret;
#endif
#define TRACE_NORET(stub, func, decl, arglist, n, ...) \
void stub decl { trace_wrapper_noret(int, stub, func, arglist, n, __VA_ARGS__); }
#define TRACE(rettype, stub, func, decl, arglist, n, ...) \
rettype stub decl { trace_wrapper(rettype, stub, func, arglist, n, __VA_ARGS__); }
#endif

View File

@ -33,43 +33,19 @@ int unprotect(_Protect *p);
// ==================== wrapper implementations ====================
#define TRACE_THIS _TRACE_ASYE
int _asye_init(_Context *(*handler)(_Event, _Context *)) {
trace_wrapper(int, _asye_init, asye_init, (handler), 1, handler);
}
_Context *_kcontext(_Area stack, void (*entry)(void *), void *arg) {
trace_wrapper(_Context *, _kcontext, kcontext, (stack, entry, arg), 2, entry, arg);
}
void _yield() {
trace_wrapper_noret(int, _yield, yield, (), 1, 0);
}
int _intr_read() {
trace_wrapper(int, _intr_read, intr_read, (), 1, 0);
}
void _intr_write(int enable) {
trace_wrapper_noret(int, _intr_write, intr_write, (enable), 1, enable);
}
_Context *_irq_callback(_Event ev, _Context *ctx) {
trace_wrapper(_Context *, _irq_callback, irq_callback, (ev, ctx), 4, ev.event, ev.cause, ev.ref, ctx);
}
TRACE(int, _asye_init, asye_init, (_Context *(*handler)(_Event, _Context *)), (handler), 1, handler);
TRACE(_Context *, _kcontext, kcontext, (_Area stack, void (*entry)(void *), void *arg), (stack, entry, arg), 2, entry, arg);
TRACE_NORET(_yield, yield, (), (), 1, 0);
TRACE(int, _intr_read, intr_read, (), (), 1, 0);
TRACE_NORET(_intr_write, intr_write, (int enable), (enable), 1, enable)
TRACE(_Context *, _irq_callback, irq_callback, (_Event ev, _Context *ctx), (ev, ctx), 4, ev.event, ev.cause, ev.ref, ctx);
#undef TRACE_THIS
#define TRACE_THIS _TRACE_PTE
int _pte_init(void * (*pgalloc_f)(size_t), void (*pgfree_f)(void *)) {
trace_wrapper(int, _pte_init, pte_init, (pgalloc_f, pgfree_f), 2, pgalloc_f, pgfree_f) ;
}
int _map(_Protect *p, void *va, void *pa, int prot) {
trace_wrapper(int, _map, map, (p, va, pa, prot), 4, p, va, pa, prot);
}
_Context *_ucontext(_Protect *p, _Area ustack, _Area kstack, void *entry, void *args) {
trace_wrapper(_Context *, _ucontext, ucontext, (p, ustack, kstack, entry, args), 3, p, entry, args);
}
void _switch(_Protect *p) {
trace_wrapper_noret(int, _switch, vm_switch, (p), 1, p);
}
int _protect(_Protect *p) {
trace_wrapper(int, _protect, protect, (p), 1, p);
}
void _unprotect(_Protect *p) {
trace_wrapper_noret(int, _unprotect, unprotect, (p), 1, p);
}
#undef TRACE_THIS
TRACE(int, _pte_init, pte_init, (void * (*pgalloc_f)(size_t), void (*pgfree_f)(void *)), (pgalloc_f, pgfree_f), 2, pgalloc_f, pgfree_f) ;
TRACE(int, _map, map, (_Protect *p, void *va, void *pa, int prot), (p, va, pa, prot), 4, p, va, pa, prot);
TRACE(_Context *, _ucontext, ucontext, (_Protect *p, _Area ustack, _Area kstack, void *entry, void *args), (p, ustack, kstack, entry, args), 3, p, entry, args);
TRACE_NORET(_switch, vm_switch, (_Protect *p), (p), 1, p)
TRACE(int, _protect, protect, (_Protect *p), (p), 1, p);
TRACE_NORET(_unprotect, unprotect, (_Protect *p), (p), 1, p);
#undef TRACE_THIS