cosmopolitan/libc/runtime/mappings.h

79 lines
2.4 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#ifndef COSMOPOLITAN_LIBC_RUNTIME_MAPPINGS_H_
#define COSMOPOLITAN_LIBC_RUNTIME_MAPPINGS_H_
#include "libc/dce.h"
#include "libc/macros.h"
#include "libc/runtime/runtime.h"
#define MMAP_MAX 300 /* TODO: crunch */
#define kStackCeiling 0x0000700000000000L
#define kStackBottom 0x0000600000000000L
#define kFixedMappingsStart 0x0000100000000000L /* cosmo won't auto-assign */
#define kFixedMappingsSize 0x0000100000000000L /* 16TB */
#define kMappingsStart 0x0000200000000000L /* cosmo auto-assigns here */
#define kMappingsSize 0x0000100000000000L /* 16TB */
#if !(__ASSEMBLER__ + __LINKER__ + 0)
COSMOPOLITAN_C_START_
#define ISOVERLAPPING(C1, C2) \
(((C1).x >= (C2).x && (C1).x <= (C2).y) || \
((C1).y >= (C2).x && (C1).y <= (C2).y))
#define ADDR_TO_COORD(ADDR) \
(int)(((intptr_t)(ADDR) & ~(FRAMESIZE - 1)) / FRAMESIZE)
#define COORD_TO_ADDR(COORD) (void *)((intptr_t)(COORD)*FRAMESIZE)
#define COORD_TO_SIZE(COORD) (void *)((intptr_t)(COORD)*FRAMESIZE)
#define ADDRSIZE_TO_COORD(ADDR, SIZE) \
((struct MemoryCoord){ \
.x = ADDR_TO_COORD(ADDR), \
.y = ADDR_TO_COORD(ADDR) + \
((unsigned)(ROUNDUP((SIZE), FRAMESIZE) / FRAMESIZE) - 1)})
#define COORD_TO_ADDRSIZE(COORD) \
((struct AddrSize){ \
.addr = COORD_TO_ADDR((COORD).x), \
.size = ((size_t)((COORD).y - (COORD).x + 1) * FRAMESIZE)})
#define GRANULATE_ADDRSIZE(ADDR, SIZE) \
do { \
struct AddrSize AdSiz; \
struct MemoryCoord MemCo; \
MemCo = ADDRSIZE_TO_COORD(*(ADDR), *(SIZE)); \
AdSiz = COORD_TO_ADDRSIZE(MemCo); \
*(ADDR) = AdSiz.addr; \
*(SIZE) = AdSiz.size; \
} while (0)
struct AddrSize {
void *addr;
size_t size;
};
/**
* Ordered inclusive 64kb-granular ranges on NexGen32e w/o PML5.
* c.𝑥 ≤ c.𝑦 so say c all.
* cₙ.𝑥 ≤ cₙ₊₁.𝑥 so say c all.
*/
struct Mappings {
size_t i;
struct MemoryCoord {
int32_t x, y;
} p[MMAP_MAX];
int64_t h[MMAP_MAX];
};
extern struct Mappings _mm;
bool isheap(void *);
size_t findmapping(int32_t);
size_t findmapping_(int32_t, const struct MemoryCoord *, size_t);
COSMOPOLITAN_C_END_
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
#endif /* COSMOPOLITAN_LIBC_RUNTIME_MAPPINGS_H_ */