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()