mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-07-02 17:28:30 +00:00
Simplify memory manager
This commit is contained in:
parent
5a9a08d1cf
commit
01587de761
40 changed files with 451 additions and 311 deletions
|
@ -34,8 +34,6 @@ struct Maps __maps;
|
|||
void __maps_add(struct Map *map) {
|
||||
dll_init(&map->elem);
|
||||
dll_make_first(&__maps.used, &map->elem);
|
||||
map->next = __maps.maps;
|
||||
__maps.maps = map;
|
||||
++__maps.count;
|
||||
}
|
||||
|
||||
|
@ -44,23 +42,31 @@ static void __maps_adder(struct Map *map, int pagesz) {
|
|||
__maps_add(map);
|
||||
}
|
||||
|
||||
void __maps_stack(void *stackaddr, int pagesz, size_t stacksize, int stackprot,
|
||||
intptr_t stackhand) {
|
||||
__maps.stack.addr = stackaddr;
|
||||
__maps.stack.size = stacksize;
|
||||
void __maps_stack(char *stackaddr, int pagesz, int guardsize, size_t stacksize,
|
||||
int stackprot, intptr_t stackhand) {
|
||||
__maps.stack.addr = stackaddr + guardsize;
|
||||
__maps.stack.size = stacksize - guardsize;
|
||||
__maps.stack.prot = stackprot;
|
||||
__maps.stack.h = stackhand;
|
||||
__maps.stack.hand = -1;
|
||||
__maps_adder(&__maps.stack, pagesz);
|
||||
if (guardsize) {
|
||||
__maps.guard.addr = stackaddr;
|
||||
__maps.guard.size = guardsize;
|
||||
__maps.guard.prot = PROT_NONE;
|
||||
__maps.guard.hand = stackhand;
|
||||
__maps_adder(&__maps.guard, pagesz);
|
||||
}
|
||||
}
|
||||
|
||||
void __maps_init(void) {
|
||||
int pagesz = getauxval(AT_PAGESZ);
|
||||
int pagesz = getpagesize();
|
||||
|
||||
// record _start() stack mapping
|
||||
if (!IsWindows()) {
|
||||
struct AddrSize stack;
|
||||
stack = __get_main_stack();
|
||||
__maps_stack(stack.addr, pagesz, stack.size, (uintptr_t)ape_stack_prot, 0);
|
||||
__maps_stack(stack.addr, pagesz, 0, stack.size, (uintptr_t)ape_stack_prot,
|
||||
0);
|
||||
}
|
||||
|
||||
// record .text and .data mappings
|
||||
|
@ -78,15 +84,15 @@ void __maps_init(void) {
|
|||
__maps_adder(&text, pagesz);
|
||||
}
|
||||
|
||||
privileged void __maps_lock(void) {
|
||||
privileged bool __maps_lock(void) {
|
||||
struct CosmoTib *tib;
|
||||
if (!__threaded)
|
||||
return;
|
||||
return false;
|
||||
if (!__tls_enabled)
|
||||
return;
|
||||
return false;
|
||||
tib = __get_tls_privileged();
|
||||
if (tib->tib_relock_maps++)
|
||||
return;
|
||||
return true;
|
||||
while (atomic_exchange_explicit(&__maps.lock, 1, memory_order_acquire)) {
|
||||
#if defined(__GNUC__) && defined(__aarch64__)
|
||||
__asm__ volatile("yield");
|
||||
|
@ -94,6 +100,7 @@ privileged void __maps_lock(void) {
|
|||
__asm__ volatile("pause");
|
||||
#endif
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
privileged void __maps_unlock(void) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue