mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-06-27 14:58:30 +00:00
Get cosmopolitation working on Vista again (#635)
* 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 fromb69f3d2488
and6f7d0cb1c3
in preparation for potentially using them on old windows and because it avoids duplicating addresses everywhere. * Optimise windows version checking Added GetNtMinorVersion() and IsAtleastWindows8p1() macros which get nt version info from the peb. * Planned nsync memory region for old windows Added nsync regon start and size macros that can switch to smaller values on old windows, just like previous fds and zipos change.
This commit is contained in:
parent
30140812f0
commit
4381b3d925
5 changed files with 30 additions and 12 deletions
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -9,6 +9,8 @@ bool32 GetVersionEx(struct NtOsVersionInfo *lpVersionInformation);
|
|||
|
||||
#if defined(__GCC_ASM_FLAG_OUTPUTS__) && !defined(__STRICT_ANSI__)
|
||||
#define IsAtLeastWindows10() (GetNtMajorVersion() >= 10)
|
||||
#define IsAtleastWindows8p1() \
|
||||
(GetNtMajorVersion() > 6 || (GetNtMajorVersion() == 6 && GetNtMinorVersion() == 3))
|
||||
#define GetNtMajorVersion() \
|
||||
({ \
|
||||
uintptr_t __x; \
|
||||
|
@ -17,6 +19,14 @@ bool32 GetVersionEx(struct NtOsVersionInfo *lpVersionInformation);
|
|||
: "=q"(__x)); \
|
||||
(unsigned char)__x; \
|
||||
})
|
||||
#define GetNtMinorVersion() \
|
||||
({ \
|
||||
uintptr_t __x; \
|
||||
asm("mov\t%%gs:96,%q0\r\n" \
|
||||
"mov\t284(%q0),%b0" \
|
||||
: "=q"(__x)); \
|
||||
(unsigned char)__x; \
|
||||
})
|
||||
#endif
|
||||
|
||||
COSMOPOLITAN_C_END_
|
||||
|
|
|
@ -26,17 +26,22 @@ 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 kMemtrackNsyncStart _kMemVista(0x6fc000040000, 0x5c000040000)
|
||||
#define kMemtrackNsyncSize \
|
||||
(_kMemVista(0x6fcffffc0000, 0x5cffffc0000 - kMemtrackNsyncStart)
|
||||
#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() || IsAtleastWindows8p1() ? NORMAL : WINVISTA)
|
||||
|
||||
struct MemoryInterval {
|
||||
int x;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue