Nintendo switch support (#8069)
* Add config section for Nintendo Switch * Add compiler configuration for Nintendo Switch and it's CPU * Add specific lib code for Nintendo Switch * Add GC support for Nintendo Switch * Update changelog for Nintendo Switch * Update changelog with more info about fixed paths * Cleaned up GC memory management a bit * Relocate docs for Switch * Rename aarch64NoneElfGcc to nintendoSwitchGCC * Remove armv8a57 * Fix installer.ini * Reuse code in linux and amd64 * Add posix defs for nintendo switch * Add more defined sections for nintendo switch * Remove old comment * Add what's not supported for Nintendo Switch docs * Make nintendoswitch == posix * Remove DEVKITPRO references from nim.cfg * Make PR extccomp changes * Remove Result type alias * Add separate switch consts file * Update docs for nintendo switch * Fix travis errors with undefined consts and add correct wait.h procs
This commit is contained in:
parent
b74b16ffde
commit
559a7615ad
21 changed files with 1352 additions and 43 deletions
|
|
@ -80,6 +80,43 @@ when defined(emscripten):
|
|||
elif defined(genode):
|
||||
include genode/alloc # osAllocPages, osTryAllocPages, osDeallocPages
|
||||
|
||||
elif defined(nintendoswitch):
|
||||
import nintendoswitch/switch_memory
|
||||
|
||||
var
|
||||
stack: pointer
|
||||
|
||||
proc alignSize(size: int): int =
|
||||
(size + 0x00000FFF) and not 0x00000FFF
|
||||
|
||||
proc freeMem(p: pointer, msize: int) =
|
||||
let size = alignSize(msize)
|
||||
discard svcUnmapMemory(p, stack, size.uint64)
|
||||
virtmemFreeMap(p, size.csize)
|
||||
free(stack)
|
||||
|
||||
proc osAllocPages(msize: int): pointer {.inline.} =
|
||||
let size = alignSize(msize)
|
||||
stack = memalign(0x1000, size)
|
||||
result = virtmemReserveMap(size.csize)
|
||||
let rc = svcMapMemory(result, stack, size.uint64)
|
||||
if rc.uint32 != 0:
|
||||
freeMem(result, size)
|
||||
raiseOutOfMem()
|
||||
|
||||
proc osTryAllocPages(msize: int): pointer {.inline.} =
|
||||
let size = alignSize(msize)
|
||||
stack = memalign(0x1000, size)
|
||||
result = virtmemReserveMap(size.csize)
|
||||
let rc = svcMapMemory(result, stack, size.uint64)
|
||||
if rc.uint32 != 0:
|
||||
freeMem(result, size)
|
||||
result = nil
|
||||
|
||||
proc osDeallocPages(p: pointer, size: int) {.inline.} =
|
||||
when reallyOsDealloc:
|
||||
freeMem(p, size)
|
||||
|
||||
elif defined(posix):
|
||||
const
|
||||
PROT_READ = 1 # page can be read
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue