From 9ce7e3dfd27895f5a15f03ecd417b4c0d66067be Mon Sep 17 00:00:00 2001 From: minjaesong Date: Mon, 7 Apr 2025 21:10:19 +0900 Subject: [PATCH] forceAlloc impl --- assets/disk0/home/hdk/load.js | 2 +- tsvm_core/src/net/torvald/tsvm/VM.kt | 16 +++++++++++++++- .../src/net/torvald/tsvm/VMJSR223Delegate.kt | 1 + 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/assets/disk0/home/hdk/load.js b/assets/disk0/home/hdk/load.js index 6545c52..f83c738 100644 --- a/assets/disk0/home/hdk/load.js +++ b/assets/disk0/home/hdk/load.js @@ -16,7 +16,7 @@ sys.free(metaArea) if (addrToLoad == 0) addrToLoad = sys.malloc(imageSize + 4) else - forceAlloc(addrToLoad, imageSize + 4) + sys.forceAlloc(addrToLoad, imageSize + 4) // writes IMAGE_SIZE and the BINARY_IMAGE directly to the memory infile.pread(addrToLoad, imageSize + 4, 8) diff --git a/tsvm_core/src/net/torvald/tsvm/VM.kt b/tsvm_core/src/net/torvald/tsvm/VM.kt index 7280b92..ca9bbf8 100644 --- a/tsvm_core/src/net/torvald/tsvm/VM.kt +++ b/tsvm_core/src/net/torvald/tsvm/VM.kt @@ -45,6 +45,7 @@ class VM( val memsize = minOf(USER_SPACE_SIZE, _memsize.toLong()) val MALLOC_UNIT = 64 + val MALLOC_RESERVED_BLOCKS = 4 // 4*64=256 bytes are always reserved and won't be allocated to a pointer private val mallocBlockSize = (memsize / MALLOC_UNIT).toInt() internal val usermem = UnsafeHelper.allocate(memsize, this) @@ -218,7 +219,7 @@ class VM( } private fun findEmptySpace(blockSize: Int): Int? { - var cursorHead = 0 + var cursorHead = MALLOC_RESERVED_BLOCKS var cursorTail: Int val cursorHeadMaxInclusive = mallocBlockSize - blockSize while (cursorHead <= cursorHeadMaxInclusive) { @@ -261,6 +262,19 @@ class VM( allocatedBlockCount -= count } + internal fun forceAlloc(ptr: Int, size: Int) { + val allocBlocks = ceil(size.toDouble() / MALLOC_UNIT).toInt() + val blockStart = ptr / MALLOC_UNIT + + var previouslyUnallocated = 0 + for (i in blockStart until blockStart + allocBlocks) { + if (mallocMap.get(i) == false) previouslyUnallocated++ + mallocMap.set(i, true) + } + allocatedBlockCount += previouslyUnallocated + mallocSizes[blockStart] = allocBlocks + } + internal data class VMNativePtr(val address: Int, val size: Int) } diff --git a/tsvm_core/src/net/torvald/tsvm/VMJSR223Delegate.kt b/tsvm_core/src/net/torvald/tsvm/VMJSR223Delegate.kt index 293f427..1b24275 100644 --- a/tsvm_core/src/net/torvald/tsvm/VMJSR223Delegate.kt +++ b/tsvm_core/src/net/torvald/tsvm/VMJSR223Delegate.kt @@ -82,6 +82,7 @@ class VMJSR223Delegate(private val vm: VM) { fun nanoTime() = System.nanoTime() fun malloc(size: Int) = vm.malloc(size) fun free(ptr: Int) = vm.free(ptr) + fun forceAlloc(ptr: Int, size: Int) = vm.forceAlloc(ptr, size) fun memcpy(from: Int, to: Int, len: Int) { val from = from.toLong() val to = to.toLong()