MOS Source Code
Loading...
Searching...
No Matches
mos_stdlib.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: GPL-3.0-or-later
2
3#pragma once
4
6#include <mos/types.h>
7#include <stddef.h>
8
9#if defined(__MOS_KERNEL__) && defined(__cplusplus)
11#include <type_traits>
12#include <utility>
13#endif
14
21
22MOSAPI unsigned char tolower(unsigned char c);
23MOSAPI s32 abs(s32 x);
24MOSAPI long labs(long x);
26MOSAPI s32 atoi(const char *nptr);
27
28MOSAPI unsigned long strtoul(const char *nptr, char **endptr, int base);
29MOSAPI s64 strtoll(const char *str, char **endptr, int base);
30MOSAPI s64 strntoll(const char *str, char **endptr, int base, size_t n);
31
32MOSAPI void format_size(char *buf, size_t buf_size, u64 size);
33MOSAPI char *string_trim(char *in);
34
35// clang-format off
36#define MIN(a, b) __extension__ ({ const auto _a = (a); __auto_type _b = (b); _a < _b ? _a : _b; })
37#define MAX(a, b) __extension__ ({ const auto _a = (a); __auto_type _b = (b); _a > _b ? _a : _b; })
38// clang-format on
39
40#ifdef __MOS_KERNEL__
41#ifdef __cplusplus
42
43template<typename T>
44concept KMallocCapable = std::is_fundamental_v<std::remove_pointer_t<T>> || std::is_pointer_v<T>;
45
46template<typename T, typename... Args>
47requires(KMallocCapable<T>) T *kmalloc(Args &&...args)
48{
49 void *ptr = do_kmalloc(sizeof(T));
50 if (ptr == nullptr)
51 return nullptr;
52
53 return new (ptr) T(std::forward<Args>(args)...);
54}
55
56template<typename T>
57requires(KMallocCapable<T>) T *kcalloc(size_t n_members)
58{
59 return (T *) do_kcalloc(n_members, sizeof(T));
60}
61
62template<typename T>
63requires(KMallocCapable<T>) T *krealloc(T *ptr, size_t size)
64{
65 return (T *) do_krealloc((void *) ptr, size);
66}
67
68template<typename T>
69requires(KMallocCapable<T>) void kfree(T *ptr)
70{
71 do_kfree((const void *) ptr);
72}
73
74#endif
75
76#ifdef __IN_MOS_LIBS__
77MOSAPI void *malloc(size_t size);
78MOSAPI void *calloc(size_t nmemb, size_t size);
79MOSAPI void *realloc(void *ptr, size_t size);
80MOSAPI void free(void *ptr);
81#endif
82#else // userspace mini stdlib
83MOSAPI void exit(int status) __attribute__((noreturn));
84MOSAPI int atexit(void (*func)(void));
85MOSAPI tid_t start_thread(const char *name, thread_entry_t entry, void *arg);
86MOSAPI void abort(void) __attribute__((noreturn));
87#endif
88
char args[3][16]
Definition avr_io.c:16
__attribute__((__noreturn__)) void impl_syscall_exit(u32 exit_code)
Definition usermode.h:90
MOSAPI void * do_kmalloc(size_t size)
MOSAPI void * do_krealloc(void *ptr, size_t size)
MOSAPI void * do_kcalloc(size_t nmemb, size_t size)
MOSAPI void do_kfree(const void *ptr)
MOSAPI s64 strtoll(const char *str, char **endptr, int base)
MOSAPI unsigned char tolower(unsigned char c)
MOSAPI void exit(int status) __attribute__((noreturn))
MOSAPI s64 llabs(s64 x)
MOSAPI unsigned long strtoul(const char *nptr, char **endptr, int base)
MOSAPI s32 abs(s32 x)
MOSAPI void format_size(char *buf, size_t buf_size, u64 size)
MOSAPI void abort(void) __attribute__((noreturn))
MOSAPI s64 strntoll(const char *str, char **endptr, int base, size_t n)
MOSAPI long labs(long x)
MOSAPI int atexit(void(*func)(void))
MOSAPI tid_t start_thread(const char *name, thread_entry_t entry, void *arg)
MOSAPI char * string_trim(char *in)
MOSAPI s32 atoi(const char *nptr)
#define MOSAPI
Definition mos_global.h:112
mos::shared_ptr< T > ptr
void(* thread_entry_t)(void *arg)
Definition signal_types.h:8
size_t size
Definition slab.cpp:34
const char * name
Definition slab.cpp:35
signed int s32
Definition types.h:11
signed long long int s64
Definition types.h:13
s32 tid_t
Definition types.h:75
unsigned long long u64
Definition types.h:19