|
10 | 10 | #include <stdint.h> |
11 | 11 | #include <ulmk/microkernel.h> |
12 | 12 | #include <ulmk/config.h> |
| 13 | +#include <ulmk/syscall_wcet.h> |
13 | 14 | #include <ulmk_arch.h> |
14 | 15 | #include <kernel/include/ulmk_sched.h> |
15 | 16 | #include <kernel/include/ulmk_thread_internal.h> |
@@ -44,7 +45,25 @@ void ulmk_kern_trap_mpu_restore(void) |
44 | 45 |
|
45 | 46 | uint32_t ulmk_kern_trap_syscall(uint8_t tin, uint32_t args[4]) |
46 | 47 | { |
| 48 | +#if ULMK_CONFIG_SYSCALL_WCET |
| 49 | + uint32_t begin; |
| 50 | + uint32_t end; |
| 51 | + uint32_t ret; |
| 52 | + |
| 53 | + begin = ulmk_arch_cycle_read(); |
| 54 | + ret = ulmk_syscall_router(tin, args[0], args[1], args[2], args[3]); |
| 55 | + end = ulmk_arch_cycle_read(); |
| 56 | + |
| 57 | + g_ulmk_syscall_wcet.magic = ULMK_SYSCALL_WCET_MAGIC; |
| 58 | + g_ulmk_syscall_wcet.nr = tin; |
| 59 | + g_ulmk_syscall_wcet.begin = begin; |
| 60 | + g_ulmk_syscall_wcet.end = end; |
| 61 | + g_ulmk_syscall_wcet.delta = end - begin; |
| 62 | + g_ulmk_syscall_wcet.seq++; |
| 63 | + return ret; |
| 64 | +#else |
47 | 65 | return ulmk_syscall_router(tin, args[0], args[1], args[2], args[3]); |
| 66 | +#endif |
48 | 67 | } |
49 | 68 |
|
50 | 69 | void ulmk_kern_trap_recoverable(void) |
@@ -124,6 +143,12 @@ void ulmk_kern_main(const ulmk_boot_info_t *info) |
124 | 143 | ulmk_irq_table_init(); |
125 | 144 | UL_LOG_DBG("irq table init done"); |
126 | 145 |
|
| 146 | +#if ULMK_CONFIG_SYSCALL_WCET |
| 147 | + ulmk_arch_cycle_enable(); |
| 148 | + g_ulmk_syscall_wcet.magic = ULMK_SYSCALL_WCET_MAGIC; |
| 149 | + g_ulmk_syscall_wcet.seq = 0u; |
| 150 | +#endif |
| 151 | + |
127 | 152 | ulmk_arch_mpu_init(); |
128 | 153 | ulmk_arch_cpu_irq_enable(); |
129 | 154 |
|
|
0 commit comments