From 2ad0d05d3152c25aa97e5007f09534b3782298e6 Mon Sep 17 00:00:00 2001 From: Justine Tunney Date: Sat, 16 Jan 2021 19:18:37 -0800 Subject: [PATCH] Avoid mapping above 4gb on Windows 7 x64 (#19) Windows 7 support is now confirmed to be working. However it comes at the cost of needing to workaround this tragically oppressive behavior which is imposed for reasons unknown. Fixes #19 --- ape/ape.S | 2 +- libc/nt/memory.h | 2 +- libc/runtime/memtrack.h | 19 ++++++++++++++++--- libc/runtime/winmain.greg.c | 8 +++++++- 4 files changed, 25 insertions(+), 6 deletions(-) diff --git a/ape/ape.S b/ape/ape.S index 48095397..6dd6e08e 100644 --- a/ape/ape.S +++ b/ape/ape.S @@ -730,7 +730,7 @@ ape.macho: / ││││││││││┌5:HIGH_ENTROPY_VA / │││││││││││rrrrr .LDLLSTD = 0b0000000100100000 -.LDLLPIE = 0b0000000001000000 +.LDLLPIE = 0b0000000001100000 .LDLLEXE = .LDLLSTD / ┌31:Writeable ┌─────────────────────────┐ diff --git a/libc/nt/memory.h b/libc/nt/memory.h index b8dfe3e9..391ac328 100644 --- a/libc/nt/memory.h +++ b/libc/nt/memory.h @@ -29,7 +29,7 @@ │ cosmopolitan § new technology » memory ─╬─│┼ ╚────────────────────────────────────────────────────────────────────────────│*/ -#define kNtNumaNoPreferredNode 0xffffffff +#define kNtNumaNoPreferredNode 0xffffffffu #if !(__ASSEMBLER__ + __LINKER__ + 0) COSMOPOLITAN_C_START_ diff --git a/libc/runtime/memtrack.h b/libc/runtime/memtrack.h index 40c734f8..0d1d8cce 100644 --- a/libc/runtime/memtrack.h +++ b/libc/runtime/memtrack.h @@ -1,13 +1,26 @@ #ifndef COSMOPOLITAN_LIBC_RUNTIME_MEMTRACK_H_ #define COSMOPOLITAN_LIBC_RUNTIME_MEMTRACK_H_ +#include "libc/dce.h" #include "libc/macros.h" +#include "libc/nt/enum/version.h" +#include "libc/nt/struct/teb.h" #include "libc/runtime/runtime.h" #if !(__ASSEMBLER__ + __LINKER__ + 0) COSMOPOLITAN_C_START_ -#define kAutomapStart 0x0000100080000000 // asan can't spread its poison here -#define kAutomapSize 0x00000fff80000000 -#define kFixedmapStart 0x0000200000000000 +#define _kAutomapStart 0x0000100080000000 // asan can't spread its poison here +#define _kAutomapSize 0x00000fff80000000 +#define _kFixedmapStart 0x0000200000000000 + +/* + * TODO: Why can't we allocate addresses above 4GB on Windows 7 x64? + * https://github.com/jart/cosmopolitan/issues/19 + */ +#define MEMTRACK_ADDRESS(NORMAL, WIN7) \ + (!(IsWindows() && NtGetVersion() < kNtVersionWindows10) ? NORMAL : WIN7) +#define kAutomapStart MEMTRACK_ADDRESS(_kAutomapStart, 0x10000000) +#define kAutomapSize MEMTRACK_ADDRESS(_kAutomapSize, 0x40000000) +#define kFixedmapStart MEMTRACK_ADDRESS(_kFixedmapStart, 0x40000000) struct MemoryIntervals { int i; diff --git a/libc/runtime/winmain.greg.c b/libc/runtime/winmain.greg.c index 4554bd16..a7b16e07 100644 --- a/libc/runtime/winmain.greg.c +++ b/libc/runtime/winmain.greg.c @@ -43,6 +43,12 @@ #include "libc/sysv/consts/map.h" #include "libc/sysv/consts/prot.h" +/* + * TODO: Why can't we allocate addresses above 4GB on Windows 7 x64? + * https://github.com/jart/cosmopolitan/issues/19 + */ +#define ADDRESS 0x77700000 /*0000*/ + struct WinArgs { char *argv[512]; char *envp[512]; @@ -128,7 +134,7 @@ static textwindows wontreturn void WinMainNew(void) { NormalizeCmdExe(); *(/*unconst*/ int *)&__hostos = WINDOWS; size = ROUNDUP(STACKSIZE + sizeof(struct WinArgs), FRAMESIZE); - data = (intptr_t)AllocateMemory((char *)0x777000000000, size, &_mmi.p[0].h); + data = (intptr_t)AllocateMemory((char *)ADDRESS, size, &_mmi.p[0].h); _mmi.p[0].x = data >> 16; _mmi.p[0].y = (data >> 16) + ((size >> 16) - 1); _mmi.p[0].prot = PROT_READ | PROT_WRITE;