From 5d3ed30af1b83ccf2321a80d548cd87fcfe48e15 Mon Sep 17 00:00:00 2001 From: Joshua Wierenga Date: Mon, 3 Oct 2022 01:11:48 +1100 Subject: [PATCH] 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 b69f3d2488dbaf9dcc541e699f5b7c09fbf046e0 and 6f7d0cb1c3962f7cb474b04de75df7cd82a3e5d3 in preparation for potentially using them on old windows and because it avoids duplicating addresses everywhere. --- libc/calls/reservefd.c | 4 ++-- libc/intrin/g_fds.c | 6 ++++-- libc/runtime/memtrack.internal.h | 15 +++++++++------ libc/zipos/open.c | 5 +++-- 4 files changed, 18 insertions(+), 12 deletions(-) diff --git a/libc/calls/reservefd.c b/libc/calls/reservefd.c index d0a4f3e34..5e74fca70 100644 --- a/libc/calls/reservefd.c +++ b/libc/calls/reservefd.c @@ -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; } diff --git a/libc/intrin/g_fds.c b/libc/intrin/g_fds.c index f3c0cfe8b..b524f141d 100644 --- a/libc/intrin/g_fds.c +++ b/libc/intrin/g_fds.c @@ -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); diff --git a/libc/runtime/memtrack.internal.h b/libc/runtime/memtrack.internal.h index ff2488f0a..c85878fdd 100644 --- a/libc/runtime/memtrack.internal.h +++ b/libc/runtime/memtrack.internal.h @@ -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; diff --git a/libc/zipos/open.c b/libc/zipos/open.c index 44979f08e..4d10357e5 100644 --- a/libc/zipos/open.c +++ b/libc/zipos/open.c @@ -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; }