Line data Source code
1 0 : /* 2 : * Copyright (c) 2018, Intel Corporation. 3 : * 4 : * SPDX-License-Identifier: Apache-2.0 5 : */ 6 : 7 : #ifndef ZEPHYR_INCLUDE_SYS_LIBC_HOOKS_H_ 8 : #define ZEPHYR_INCLUDE_SYS_LIBC_HOOKS_H_ 9 : 10 : #include <zephyr/toolchain.h> 11 : #include <zephyr/app_memory/app_memdomain.h> 12 : #include <stdio.h> 13 : #include <stddef.h> 14 : 15 : #ifdef __cplusplus 16 : extern "C" { 17 : #endif 18 : 19 : /* 20 : * Private header for specifying accessory functions to the C library internals 21 : * that need to call into the kernel as system calls 22 : */ 23 : 24 : #if defined(CONFIG_NEWLIB_LIBC) || defined(CONFIG_ARCMWDT_LIBC) 25 : 26 : /* syscall generation ignores preprocessor, ensure this is defined to ensure 27 : * we don't have compile errors 28 : */ 29 : __syscall int zephyr_read_stdin(char *buf, int nbytes); 30 : 31 : __syscall int zephyr_write_stdout(const void *buf, int nbytes); 32 : 33 : #else 34 : /* Minimal libc and picolibc */ 35 : 36 0 : __syscall int zephyr_fputc(int c, FILE * stream); 37 : 38 : #ifdef CONFIG_MINIMAL_LIBC 39 : /* Minimal libc only */ 40 : 41 : __syscall size_t zephyr_fwrite(const void *ZRESTRICT ptr, size_t size, 42 : size_t nitems, FILE *ZRESTRICT stream); 43 : #endif 44 : 45 : #endif /* CONFIG_NEWLIB_LIBC */ 46 : 47 : void __stdout_hook_install(int (*hook)(int)); 48 : 49 : #ifdef CONFIG_USERSPACE 50 : #ifdef CONFIG_COMMON_LIBC_MALLOC 51 : 52 : /* When using the common malloc implementation with CONFIG_USERSPACE, the 53 : * heap will be in a separate partition when there's an MPU or MMU 54 : * available. 55 : */ 56 : #if CONFIG_COMMON_LIBC_MALLOC_ARENA_SIZE != 0 && \ 57 : (defined(CONFIG_MPU) || defined(CONFIG_MMU)) 58 : #define Z_MALLOC_PARTITION_EXISTS 1 59 : #endif 60 : 61 : #elif defined(CONFIG_NEWLIB_LIBC) && !defined(CONFIG_NEWLIB_LIBC_CUSTOM_SBRK) 62 : /* If we are using newlib, the heap arena is in one of two areas: 63 : * - If we have an MPU that requires power of two alignment, the heap bounds 64 : * must be specified in Kconfig via CONFIG_NEWLIB_LIBC_ALIGNED_HEAP_SIZE. 65 : * - Otherwise, the heap arena on most arches starts at a suitably 66 : * aligned base address after the `_end` linker symbol, through to the end 67 : * of system RAM. 68 : */ 69 : #if (!defined(CONFIG_MPU_REQUIRES_POWER_OF_TWO_ALIGNMENT) || \ 70 : (defined(CONFIG_MPU_REQUIRES_POWER_OF_TWO_ALIGNMENT) && \ 71 : CONFIG_NEWLIB_LIBC_ALIGNED_HEAP_SIZE)) 72 : #define Z_MALLOC_PARTITION_EXISTS 1 73 : #endif 74 : 75 : #endif /* CONFIG_NEWLIB_LIBC */ 76 : 77 : #ifdef Z_MALLOC_PARTITION_EXISTS 78 : /* Memory partition containing the libc malloc arena. Configuration controls 79 : * whether this is available, and an arena size may need to be set. 80 : */ 81 : extern struct k_mem_partition z_malloc_partition; 82 : #endif 83 : 84 : #ifdef CONFIG_NEED_LIBC_MEM_PARTITION 85 : /* - All newlib globals will be placed into z_libc_partition. 86 : * - Minimal C library globals, if any, will be placed into 87 : * z_libc_partition. 88 : * - Stack canary globals will be placed into z_libc_partition since 89 : * it is not worth placing in its own partition. 90 : * - Some architectures may place the global pointer to the thread local 91 : * storage in z_libc_partition since it is not worth placing in its 92 : * own partition. 93 : */ 94 : #define Z_LIBC_PARTITION_EXISTS 1 95 : 96 : /* C library globals, except the malloc arena */ 97 : extern struct k_mem_partition z_libc_partition; 98 : #endif 99 : #endif /* CONFIG_USERSPACE */ 100 : 101 : #include <zephyr/syscalls/libc-hooks.h> 102 : 103 : /* C library memory partitions */ 104 : #define Z_LIBC_DATA K_APP_DMEM(z_libc_partition) 105 : 106 : #ifdef __cplusplus 107 : } 108 : #endif 109 : 110 : #endif /* ZEPHYR_INCLUDE_SYS_LIBC_HOOKS_H_ */