Fixes virtual memory support for Windows Vista/7/8

Fixes file desciptor and zipos virtual memory sizes given that old versions of windows limit their user virtual memory space to 8tb.
Includes some changes from b69f3d2488 and 6f7d0cb1c3 in preparation for potentially using them on old windows and because it avoids duplicating addresses everywhere.
This commit is contained in:
Joshua Wierenga 2022-10-03 01:11:48 +11:00
parent 30140812f0
commit 5d3ed30af1
4 changed files with 18 additions and 12 deletions

View file

@ -50,8 +50,8 @@ int __ensurefds_unlocked(int fd) {
bool relocate;
if (fd < g_fds.n) return fd;
g_fds.n = fd + 1;
g_fds.e =
_extend(g_fds.p, g_fds.n * sizeof(*g_fds.p), g_fds.e, 0x6ff000000000);
g_fds.e = _extend(g_fds.p, g_fds.n * sizeof(*g_fds.p), g_fds.e,
kMemtrackFdsStart + kMemtrackFdsSize);
return fd;
}

View file

@ -22,6 +22,7 @@
#include "libc/intrin/pushpop.h"
#include "libc/intrin/weaken.h"
#include "libc/nt/runtime.h"
#include "libc/runtime/memtrack.internal.h"
#include "libc/sysv/consts/o.h"
#include "libc/thread/thread.h"
@ -43,10 +44,11 @@ textstartup void InitializeFileDescriptors(void) {
struct Fds *fds;
__fds_lock_obj._type = PTHREAD_MUTEX_RECURSIVE;
fds = VEIL("r", &g_fds);
fds->p = fds->e = (void *)0x6fe000040000;
fds->p = fds->e = (void *)kMemtrackFdsStart;
fds->n = 4;
fds->f = 3;
fds->e = _extend(fds->p, fds->n * sizeof(*fds->p), fds->e, 0x6ff000000000);
fds->e = _extend(fds->p, fds->n * sizeof(*fds->p), fds->e,
kMemtrackFdsStart + kMemtrackFdsSize);;
if (IsMetal()) {
extern const char vga_console[];
pushmov(&fds->f, 3ull);

View file

@ -7,6 +7,7 @@
#include "libc/macros.internal.h"
#include "libc/thread/tls.h"
#include "libc/nt/version.h"
#include "libc/nt/enum/version.h"
#include "libc/runtime/stack.h"
#include "libc/sysv/consts/ss.h"
#if !(__ASSEMBLER__ + __LINKER__ + 0)
@ -26,17 +27,19 @@ COSMOPOLITAN_C_START_
#define kFixedmapStart _kMem(0x300000000000, 0x000040000000)
#define kFixedmapSize \
_kMem(0x400000000000 - 0x300000000000, 0x000070000000 - 0x000040000000)
#define kMemtrackFdsStart \
(ROUNDDOWN(_kMem(0x6fe000000000, 0x68000000), FRAMESIZE * 8) - 0x8000 * 8)
#define kMemtrackFdsSize _kMem(0x001000000000, 0x04000000)
#define kMemtrackZiposStart \
(ROUNDDOWN(_kMem(0x6fd000000000, 0x6c000000), FRAMESIZE * 8) - 0x8000 * 8)
#define kMemtrackZiposSize _kMem(0x001000000000, 0x10000000)
#define kMemtrackFdsStart _kMemVista(0x6fe000040000, 0x5e000040000)
#define kMemtrackFdsSize \
(_kMemVista(0x6feffffc0000, 0x5effffc0000) - kMemtrackFdsStart)
#define kMemtrackZiposStart _kMemVista(0x6fd000040000, 0x5d000040000)
#define kMemtrackZiposSize \
(_kMemVista(0x6fdffffc0000, 0x5dffffc0000) - kMemtrackZiposStart)
#define _kMmi(VSPACE) \
ROUNDUP(VSPACE / FRAMESIZE * (intptr_t)sizeof(struct MemoryInterval), \
FRAMESIZE)
#define _kMem(NORMAL, WIN7) \
(!IsWindows() || IsAtLeastWindows10() ? NORMAL : WIN7)
#define _kMemVista(NORMAL, WINVISTA) \
(!IsWindows() || NtGetVersion() >= kNtVersionWindows81 ? NORMAL : WINVISTA)
struct MemoryInterval {
int x;

View file

@ -52,9 +52,10 @@ static void *__zipos_mmap(size_t mapsize) {
assert(mapsize);
offset = maptotal;
maptotal += mapsize;
start = (char *)0x6fd000040000;
start = (char *)kMemtrackZiposStart;
if (!mapend) mapend = start;
mapend = _extend(start, maptotal, mapend, 0x6fdfffff0000);
mapend = _extend(start, maptotal, mapend,
kMemtrackZiposStart + kMemtrackZiposSize);;
return start + offset;
}