79 lines
2.4 KiB
C
79 lines
2.4 KiB
C
#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_ */
|