mirror of https://github.com/golang/go.git
runtime: enable more address bits on macOS/ARM64
Apparently macOS/ARM64 has 47-bit addresses, instead of 33-bit as on ios/ARM64. Enable more address bits. Updates #38485. Change-Id: I8aa64ba22a3933e3d9c4fffd17d902b5f31c30e3 Reviewed-on: https://go-review.googlesource.com/c/go/+/256918 Trust: Cherry Zhang <cherryyz@google.com> Reviewed-by: Ian Lance Taylor <iant@golang.org> Reviewed-by: Michael Knyszek <mknyszek@google.com>
This commit is contained in:
parent
28e549dec3
commit
a739306ca7
|
|
@ -198,7 +198,7 @@ const (
|
||||||
// mips32 only has access to the low 2GB of virtual memory, so
|
// mips32 only has access to the low 2GB of virtual memory, so
|
||||||
// we further limit it to 31 bits.
|
// we further limit it to 31 bits.
|
||||||
//
|
//
|
||||||
// On darwin/arm64, although 64-bit pointers are presumably
|
// On ios/arm64, although 64-bit pointers are presumably
|
||||||
// available, pointers are truncated to 33 bits. Furthermore,
|
// available, pointers are truncated to 33 bits. Furthermore,
|
||||||
// only the top 4 GiB of the address space are actually available
|
// only the top 4 GiB of the address space are actually available
|
||||||
// to the application, but we allow the whole 33 bits anyway for
|
// to the application, but we allow the whole 33 bits anyway for
|
||||||
|
|
@ -207,7 +207,7 @@ const (
|
||||||
// arenaBaseOffset to offset into the top 4 GiB.
|
// arenaBaseOffset to offset into the top 4 GiB.
|
||||||
//
|
//
|
||||||
// WebAssembly currently has a limit of 4GB linear memory.
|
// WebAssembly currently has a limit of 4GB linear memory.
|
||||||
heapAddrBits = (_64bit*(1-sys.GoarchWasm)*(1-(sys.GoosDarwin+sys.GoosIos)*sys.GoarchArm64))*48 + (1-_64bit+sys.GoarchWasm)*(32-(sys.GoarchMips+sys.GoarchMipsle)) + 33*(sys.GoosDarwin+sys.GoosIos)*sys.GoarchArm64
|
heapAddrBits = (_64bit*(1-sys.GoarchWasm)*(1-sys.GoosIos*sys.GoarchArm64))*48 + (1-_64bit+sys.GoarchWasm)*(32-(sys.GoarchMips+sys.GoarchMipsle)) + 33*sys.GoosIos*sys.GoarchArm64
|
||||||
|
|
||||||
// maxAlloc is the maximum size of an allocation. On 64-bit,
|
// maxAlloc is the maximum size of an allocation. On 64-bit,
|
||||||
// it's theoretically possible to allocate 1<<heapAddrBits bytes. On
|
// it's theoretically possible to allocate 1<<heapAddrBits bytes. On
|
||||||
|
|
@ -514,14 +514,14 @@ func mallocinit() {
|
||||||
// However, on arm64, we ignore all this advice above and slam the
|
// However, on arm64, we ignore all this advice above and slam the
|
||||||
// allocation at 0x40 << 32 because when using 4k pages with 3-level
|
// allocation at 0x40 << 32 because when using 4k pages with 3-level
|
||||||
// translation buffers, the user address space is limited to 39 bits
|
// translation buffers, the user address space is limited to 39 bits
|
||||||
// On darwin/arm64, the address space is even smaller.
|
// On ios/arm64, the address space is even smaller.
|
||||||
//
|
//
|
||||||
// On AIX, mmaps starts at 0x0A00000000000000 for 64-bit.
|
// On AIX, mmaps starts at 0x0A00000000000000 for 64-bit.
|
||||||
// processes.
|
// processes.
|
||||||
for i := 0x7f; i >= 0; i-- {
|
for i := 0x7f; i >= 0; i-- {
|
||||||
var p uintptr
|
var p uintptr
|
||||||
switch {
|
switch {
|
||||||
case GOARCH == "arm64" && (GOOS == "darwin" || GOOS == "ios"):
|
case GOARCH == "arm64" && GOOS == "ios":
|
||||||
p = uintptr(i)<<40 | uintptrMask&(0x0013<<28)
|
p = uintptr(i)<<40 | uintptrMask&(0x0013<<28)
|
||||||
case GOARCH == "arm64":
|
case GOARCH == "arm64":
|
||||||
p = uintptr(i)<<40 | uintptrMask&(0x0040<<32)
|
p = uintptr(i)<<40 | uintptrMask&(0x0040<<32)
|
||||||
|
|
|
||||||
|
|
@ -2,14 +2,14 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
// +build 386 arm mips mipsle wasm darwin,arm64
|
// +build 386 arm mips mipsle wasm ios,arm64
|
||||||
|
|
||||||
// wasm is a treated as a 32-bit architecture for the purposes of the page
|
// wasm is a treated as a 32-bit architecture for the purposes of the page
|
||||||
// allocator, even though it has 64-bit pointers. This is because any wasm
|
// allocator, even though it has 64-bit pointers. This is because any wasm
|
||||||
// pointer always has its top 32 bits as zero, so the effective heap address
|
// pointer always has its top 32 bits as zero, so the effective heap address
|
||||||
// space is only 2^32 bytes in size (see heapAddrBits).
|
// space is only 2^32 bytes in size (see heapAddrBits).
|
||||||
|
|
||||||
// darwin/arm64 is treated as a 32-bit architecture for the purposes of the
|
// ios/arm64 is treated as a 32-bit architecture for the purposes of the
|
||||||
// page allocator, even though it has 64-bit pointers and a 33-bit address
|
// page allocator, even though it has 64-bit pointers and a 33-bit address
|
||||||
// space (see heapAddrBits). The 33 bit address space cannot be rounded up
|
// space (see heapAddrBits). The 33 bit address space cannot be rounded up
|
||||||
// to 64 bits because there are too many summary levels to fit in just 33
|
// to 64 bits because there are too many summary levels to fit in just 33
|
||||||
|
|
|
||||||
|
|
@ -2,9 +2,9 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
// +build amd64 !darwin,arm64 mips64 mips64le ppc64 ppc64le riscv64 s390x
|
// +build amd64 !ios,arm64 mips64 mips64le ppc64 ppc64le riscv64 s390x
|
||||||
|
|
||||||
// See mpagealloc_32bit.go for why darwin/arm64 is excluded here.
|
// See mpagealloc_32bit.go for why ios/arm64 is excluded here.
|
||||||
|
|
||||||
package runtime
|
package runtime
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue