LCOV - code coverage report
Current view: top level - zephyr/arch/arc - syscall.h Coverage Total Hit
Test: new.info Lines: 11.1 % 9 1
Test Date: 2025-09-05 20:47:19

            Line data    Source code
       1            1 : /*
       2              :  * Copyright (c) 2018 Linaro Limited.
       3              :  *
       4              :  * SPDX-License-Identifier: Apache-2.0
       5              :  */
       6              : 
       7              : /**
       8              :  * @file
       9              :  * @brief ARC specific syscall header
      10              :  *
      11              :  * This header contains the ARC specific syscall interface.  It is
      12              :  * included by the syscall interface architecture-abstraction header
      13              :  * (include/arch/syscall.h)
      14              :  */
      15              : 
      16              : #ifndef ZEPHYR_INCLUDE_ARCH_ARC_SYSCALL_H_
      17              : #define ZEPHYR_INCLUDE_ARCH_ARC_SYSCALL_H_
      18              : 
      19              : #define _TRAP_S_CALL_RUNTIME_EXCEPT             2
      20              : #define _TRAP_S_CALL_SYSTEM_CALL                3
      21              : 
      22              : #ifdef CONFIG_USERSPACE
      23              : #ifndef _ASMLANGUAGE
      24              : 
      25              : #include <zephyr/types.h>
      26              : #include <stdbool.h>
      27              : 
      28              : #ifdef CONFIG_ISA_ARCV2
      29              : #include <zephyr/arch/arc/v2/aux_regs.h>
      30              : #endif
      31              : 
      32              : #ifdef __cplusplus
      33              : extern "C" {
      34              : #endif
      35              : /* Syscall invocation macros. arc-specific machine constraints used to ensure
      36              :  * args land in the proper registers. Currently, they are all stub functions
      37              :  * just for enabling CONFIG_USERSPACE on arc w/o errors.
      38              :  */
      39              : 
      40            0 : static inline uintptr_t arch_syscall_invoke6(uintptr_t arg1, uintptr_t arg2,
      41              :                                              uintptr_t arg3, uintptr_t arg4,
      42              :                                              uintptr_t arg5, uintptr_t arg6,
      43              :                                              uintptr_t call_id)
      44              : {
      45              :         register uint32_t ret __asm__("r0") = arg1;
      46              :         register uint32_t r1 __asm__("r1") = arg2;
      47              :         register uint32_t r2 __asm__("r2") = arg3;
      48              :         register uint32_t r3 __asm__("r3") = arg4;
      49              :         register uint32_t r4 __asm__("r4") = arg5;
      50              :         register uint32_t r5 __asm__("r5") = arg6;
      51              :         register uint32_t r6 __asm__("r6") = call_id;
      52              : 
      53              :         compiler_barrier();
      54              : 
      55              :         __asm__ volatile(
      56              :                          "trap_s %[trap_s_id]\n"
      57              :                          : "=r"(ret)
      58              :                          : [trap_s_id] "i" (_TRAP_S_CALL_SYSTEM_CALL),
      59              :                            "r" (ret), "r" (r1), "r" (r2), "r" (r3),
      60              :                            "r" (r4), "r" (r5), "r" (r6));
      61              : 
      62              :         return ret;
      63              : }
      64              : 
      65            0 : static inline uintptr_t arch_syscall_invoke5(uintptr_t arg1, uintptr_t arg2,
      66              :                                              uintptr_t arg3, uintptr_t arg4,
      67              :                                              uintptr_t arg5,
      68              :                                              uintptr_t call_id)
      69              : {
      70              :         register uint32_t ret __asm__("r0") = arg1;
      71              :         register uint32_t r1 __asm__("r1") = arg2;
      72              :         register uint32_t r2 __asm__("r2") = arg3;
      73              :         register uint32_t r3 __asm__("r3") = arg4;
      74              :         register uint32_t r4 __asm__("r4") = arg5;
      75              :         register uint32_t r6 __asm__("r6") = call_id;
      76              : 
      77              :         compiler_barrier();
      78              : 
      79              :         __asm__ volatile(
      80              :                          "trap_s %[trap_s_id]\n"
      81              :                          : "=r"(ret)
      82              :                          : [trap_s_id] "i" (_TRAP_S_CALL_SYSTEM_CALL),
      83              :                            "r" (ret), "r" (r1), "r" (r2), "r" (r3),
      84              :                            "r" (r4), "r" (r6));
      85              : 
      86              :         return ret;
      87              : }
      88              : 
      89            0 : static inline uintptr_t arch_syscall_invoke4(uintptr_t arg1, uintptr_t arg2,
      90              :                                              uintptr_t arg3, uintptr_t arg4,
      91              :                                              uintptr_t call_id)
      92              : {
      93              :         register uint32_t ret __asm__("r0") = arg1;
      94              :         register uint32_t r1 __asm__("r1") = arg2;
      95              :         register uint32_t r2 __asm__("r2") = arg3;
      96              :         register uint32_t r3 __asm__("r3") = arg4;
      97              :         register uint32_t r6 __asm__("r6") = call_id;
      98              : 
      99              :         compiler_barrier();
     100              : 
     101              :         __asm__ volatile(
     102              :                          "trap_s %[trap_s_id]\n"
     103              :                          : "=r"(ret)
     104              :                          : [trap_s_id] "i" (_TRAP_S_CALL_SYSTEM_CALL),
     105              :                            "r" (ret), "r" (r1), "r" (r2), "r" (r3),
     106              :                            "r" (r6));
     107              : 
     108              :         return ret;
     109              : }
     110              : 
     111            0 : static inline uintptr_t arch_syscall_invoke3(uintptr_t arg1, uintptr_t arg2,
     112              :                                              uintptr_t arg3,
     113              :                                              uintptr_t call_id)
     114              : {
     115              :         register uint32_t ret __asm__("r0") = arg1;
     116              :         register uint32_t r1 __asm__("r1") = arg2;
     117              :         register uint32_t r2 __asm__("r2") = arg3;
     118              :         register uint32_t r6 __asm__("r6") = call_id;
     119              : 
     120              :         compiler_barrier();
     121              : 
     122              :         __asm__ volatile(
     123              :                          "trap_s %[trap_s_id]\n"
     124              :                          : "=r"(ret)
     125              :                          : [trap_s_id] "i" (_TRAP_S_CALL_SYSTEM_CALL),
     126              :                            "r" (ret), "r" (r1), "r" (r2), "r" (r6));
     127              : 
     128              :         return ret;
     129              : }
     130              : 
     131            0 : static inline uintptr_t arch_syscall_invoke2(uintptr_t arg1, uintptr_t arg2,
     132              :                                              uintptr_t call_id)
     133              : {
     134              :         register uint32_t ret __asm__("r0") = arg1;
     135              :         register uint32_t r1 __asm__("r1") = arg2;
     136              :         register uint32_t r6 __asm__("r6") = call_id;
     137              : 
     138              :         compiler_barrier();
     139              : 
     140              :         __asm__ volatile(
     141              :                          "trap_s %[trap_s_id]\n"
     142              :                          : "=r"(ret)
     143              :                          : [trap_s_id] "i" (_TRAP_S_CALL_SYSTEM_CALL),
     144              :                            "r" (ret), "r" (r1), "r" (r6));
     145              : 
     146              :         return ret;
     147              : }
     148              : 
     149            0 : static inline uintptr_t arch_syscall_invoke1(uintptr_t arg1, uintptr_t call_id)
     150              : {
     151              :         register uint32_t ret __asm__("r0") = arg1;
     152              :         register uint32_t r6 __asm__("r6") = call_id;
     153              : 
     154              :         compiler_barrier();
     155              : 
     156              :         __asm__ volatile(
     157              :                          "trap_s %[trap_s_id]\n"
     158              :                          : "=r"(ret)
     159              :                          : [trap_s_id] "i" (_TRAP_S_CALL_SYSTEM_CALL),
     160              :                            "r" (ret), "r" (r6));
     161              : 
     162              :         return ret;
     163              : }
     164              : 
     165            0 : static inline uintptr_t arch_syscall_invoke0(uintptr_t call_id)
     166              : {
     167              :         register uint32_t ret __asm__("r0");
     168              :         register uint32_t r6 __asm__("r6") = call_id;
     169              : 
     170              :         compiler_barrier();
     171              : 
     172              :         __asm__ volatile(
     173              :                          "trap_s %[trap_s_id]\n"
     174              :                          : "=r"(ret)
     175              :                          : [trap_s_id] "i" (_TRAP_S_CALL_SYSTEM_CALL),
     176              :                            "r" (ret), "r" (r6));
     177              : 
     178              :         return ret;
     179              : }
     180              : 
     181            0 : static inline bool arch_is_user_context(void)
     182              : {
     183              :         uint32_t status;
     184              : 
     185              :         compiler_barrier();
     186              : 
     187              :         __asm__ volatile("lr %0, [%[status32]]\n"
     188              :                          : "=r"(status)
     189              :                          : [status32] "i" (_ARC_V2_STATUS32));
     190              : 
     191              :         return !(status & _ARC_V2_STATUS32_US) ? true : false;
     192              : }
     193              : 
     194              : #ifdef __cplusplus
     195              : }
     196              : #endif
     197              : 
     198              : #endif /* _ASMLANGUAGE */
     199              : #endif /* CONFIG_USERSPACE */
     200              : #endif /* ZEPHYR_INCLUDE_ARCH_ARC_SYSCALL_H_ */
        

Generated by: LCOV version 2.0-1