forked from teawater/libhermit
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstdlib.h
More file actions
168 lines (147 loc) · 5.05 KB
/
stdlib.h
File metadata and controls
168 lines (147 loc) · 5.05 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
/*
* Copyright (c) 2010, Stefan Lankes, RWTH Aachen University
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/**
* @author Stefan Lankes
* @file include/hermit/stdlib.h
* @brief Kernel space malloc and free functions and conversion functions
*
* This file contains some memory alloc and free calls for the kernel
* and conversion functions.
*/
#ifndef __STDLIB_H__
#define __STDLIB_H__
#include <hermit/config.h>
#include <hermit/stddef.h>
#ifdef __cplusplus
extern "C" {
#endif
void NORETURN do_abort(void);
/** @brief General page allocator function
*
* This function allocates and maps whole pages.
* Mapped memory will be tracked by the VMA subsystem.
* The sz argument is rounded down to multiples of the page size.
*
* For allocations which are smaller than a page you should use
* the buddy system allocator (kmalloc and kfree) to avoid fragmentation.
*
* @param sz Desired size of the new memory
* @param flags Flags to for map_region(), vma_add()
*
* @return Pointer to the new memory range (page-aligned).
*/
void* palloc(size_t sz, uint32_t flags);
/** @brief The memory allocator function
*
* This allocator uses a buddy system to allocate memory.
* Attention: memory is not aligned!
*
* @return Pointer to the new memory range
*/
void* kmalloc(size_t sz);
/** @brief Create a stack with guard pages
*/
void* create_stack(size_t sz);
/** @brief Destroy stack with its guard pages
*/
int destroy_stack(void* addr, size_t sz);
/** @brief Release memory back to the buddy system
*
* Every block of memory allocated by kmalloc() is prefixed with a buddy_t
* which includes the the size of the allocated block.
* This prefix is also used to re-insert the block into the linked list
* of free buddies.
*
* Released memory will still be managed by the buddy system.
* Pages are not unmapped.
*
* Note: adjacent buddies are currently not merged!
*
* @see buddy_t
* @param addr The address to the memory block allocated by kmalloc()
*/
void kfree(void* addr);
/** @brief Kernel's more general memory allocator function.
*
* This function lets you choose flags for the newly allocated memory.
* The new region is always page aligned.
*
* @param sz Desired size of the new memory
* @param flags Flags to specify
*
* @return Pointer to the new memory range
*/
void* page_alloc(size_t sz, uint32_t flags);
/** @brief Kernel's more general release function.
*
* This function is the complement of page_allocation.
*
* @param addr Pointer to the memory range
* @param sz Desired size of the new memory
*/
void page_free(void* addr, size_t sz);
/** @brief String to long
*
* @return Long value of the parsed numerical string
*/
long _strtol(const char* str, char** endptr, int base);
#define strtol(str, endptr, base) _strtol((str), (endptr), (base))
/** @brief String to unsigned long
*
* @return Unsigned long value of the parsed numerical string
*/
unsigned long _strtoul(const char* nptr, char** endptr, int base);
#define strtoul(nptr, endptr, base) _strtoul((nptr), (endptr), (base))
/** @brief ASCII to integer
*
* Convenience function using strtol().
*
* @return Integer value of the parsed numerical string
*/
static inline int atoi(const char *str)
{
return (int)_strtol(str, (char **)NULL, 10);
}
/** @brief Checks whether c is a hexdecimal digit character.
*
* @return A value different from zero if indeed c is a hexadecimal digit.
* Zero otherwise.
*/
static inline int isxdigit(int c)
{
if ((c >= '0') && (c <= '9'))
return 1;
else if ((c >= 'A') && (c <= 'F'))
return 1;
else if ((c >= 'a') && (c <= 'f'))
return 1;
return 0;
}
#ifdef __cplusplus
}
#endif
#endif