NetBurner 3.5.0
PDF Version
 
stackFns.h
1#ifndef __STACKFNS_H
2#define __STACKFNS_H
3/*NB_REVISION*/
4
5/*NB_COPYRIGHT*/
6#include <basictypes.h>
7
8template<typename rT, typename... Ts>
9using ArbFn_t = rT (*)(Ts...);
10
11template<typename rT, typename... Ts>
12rT RunFnOnStack(ArbFn_t<rT, Ts...> fn, uint32_t *src, uint32_t *end, Ts... args)
13{
14 uint32_t StackFunc[(((uint32_t)end) - ((uint32_t)src)) / 4 + 1];
15 ArbFn_t<rT, Ts...> pFn = (ArbFn_t<rT, Ts...>)(((uint32_t)StackFunc) | 1);
16 uint32_t *dst = StackFunc;
17 while (src < end)
18 {
19 *dst++ = *src++;
20 }
21 asm volatile("dsb");
22 return pFn(args...);
23}
24#endif /* ----- #ifndef __STACKFNS_H ----- */