Commit fa61e981 authored by Kunshan Wang's avatar Kunshan Wang

Rebranded to "Mu".

parent b8e74486
MicroVM by Kunshan Wang, Yi Lin, Steve Blackburn, Antony Hosking, Michael Mu Reference Implementation by Kunshan Wang, Yi Lin, Steve Blackburn, Antony Hosking, Michael
Norrish is licensed under a Creative Commons Attribution-ShareAlike 4.0 Norrish is licensed under a Creative Commons Attribution-ShareAlike 4.0
International License. Based on a work at http://microvm.org. Permissions beyond International License. Based on a work at http://microvm.org. Permissions beyond
the scope of this license may be available at http://microvm.org. the scope of this license may be available at http://microvm.org.
......
MicroVM Reference Implementation 2 Mu Reference Implementation version 2
================================== =====================================
This project is the current reference implementation of MicroVM. This project This project is the current reference implementation of Mu, the micro virtual
implements the current MicroVM specification in machine designed by [The Micro Virtual Machine Project](http://microvm.org). It
[microvm-spec](https://github.com/microvm/microvm-spec/wiki) implements the [Mu Specification version
2](https://github.com/microvm/microvm-spec/wiki)
This project is based on the This project is based on the
[simplest-microvm-project](https://github.com/microvm/simplest-microvm-project). [simplest-microvm-project](https://github.com/microvm/simplest-microvm-project).
...@@ -49,7 +50,7 @@ yum, pacman, etc. for GNU/Linux distributions and Homebrew for Mac OS X). ...@@ -49,7 +50,7 @@ yum, pacman, etc. for GNU/Linux distributions and Homebrew for Mac OS X).
To download all dependencies from the Maven central repository, invoke `sbt To download all dependencies from the Maven central repository, invoke `sbt
update`. update`.
To generate the MicroVM IR parser from its Antlr grammar, invoke `sbt To generate the Mu IR parser from its Antlr grammar, invoke `sbt
antlr4:antlr4Generate`. The generated sources will be in antlr4:antlr4Generate`. The generated sources will be in
`target/scala-2.11/src_managed`. Make sure your IDE can see those generated `target/scala-2.11/src_managed`. Make sure your IDE can see those generated
sources. sources.
......
...@@ -2,7 +2,7 @@ organization := "org.microvm" ...@@ -2,7 +2,7 @@ organization := "org.microvm"
name := "microvm-refimpl2" name := "microvm-refimpl2"
description := "The second reference implementation of MicroVM" description := "The second reference implementation of Mu, the micro virtual machine"
licenses := Seq("CC BY-SA 4.0" -> url("https://creativecommons.org/licenses/by-sa/4.0/legalcode")) licenses := Seq("CC BY-SA 4.0" -> url("https://creativecommons.org/licenses/by-sa/4.0/legalcode"))
......
...@@ -28,7 +28,7 @@ class MicroVM(heapSize: Word = MicroVM.DEFAULT_HEAP_SIZE, ...@@ -28,7 +28,7 @@ class MicroVM(heapSize: Word = MicroVM.DEFAULT_HEAP_SIZE,
val irReader = new UIRTextReader(new IDFactory()) val irReader = new UIRTextReader(new IDFactory())
{ {
// The µVM allocates stacks on the heap in the large object space. It is represented as a bug chunk of byte array. // The micro VM allocates stacks on the heap in the large object space. It is represented as a bug chunk of byte array.
// So the GC must know about this type because the GC looks up the globalBundle for types. // So the GC must know about this type because the GC looks up the globalBundle for types.
globalBundle.allNs.add(InternalTypes.VOID) globalBundle.allNs.add(InternalTypes.VOID)
globalBundle.typeNs.add(InternalTypes.VOID) globalBundle.typeNs.add(InternalTypes.VOID)
......
...@@ -308,7 +308,7 @@ class ClientAgent(microVM: MicroVM) { ...@@ -308,7 +308,7 @@ class ClientAgent(microVM: MicroVM) {
private def getStackNotNull(stack: Handle): InterpreterStack = { private def getStackNotNull(stack: Handle): InterpreterStack = {
stack.vb.asInstanceOf[BoxStack].stack match { stack.vb.asInstanceOf[BoxStack].stack match {
case None => throw new UvmRuntimeException("Stack argument cannot be a NULL MicroVM stack value.") case None => throw new UvmRuntimeException("Stack argument cannot be a NULL micro VM stack value.")
case Some(v) => v case Some(v) => v
} }
} }
...@@ -465,7 +465,7 @@ class ClientAgent(microVM: MicroVM) { ...@@ -465,7 +465,7 @@ class ClientAgent(microVM: MicroVM) {
microVM.trapManager.disableWatchPoint(wpID) microVM.trapManager.disableWatchPoint(wpID)
} }
// Internal methods for µVM // Internal methods for the micro VM
def putThread(thr: Option[InterpreterThread]): Handle = { def putThread(thr: Option[InterpreterThread]): Handle = {
val t = InternalTypes.THREAD val t = InternalTypes.THREAD
......
...@@ -5,7 +5,7 @@ import uvm.UvmException ...@@ -5,7 +5,7 @@ import uvm.UvmException
/** Parent of all exceptions in the implementation part. This does not include the data structure and parser outside uvm.refimpl. */ /** Parent of all exceptions in the implementation part. This does not include the data structure and parser outside uvm.refimpl. */
class UvmRefImplException(message: String = null, cause: Throwable = null) extends UvmException(message, cause) class UvmRefImplException(message: String = null, cause: Throwable = null) extends UvmException(message, cause)
/** Thrown when the µVM cannot allocate memory. */ /** Thrown when the micro VM cannot allocate memory. */
class UvmOutOfMemoryException(message: String = null, cause: Throwable = null) extends UvmRefImplException(message, cause) class UvmOutOfMemoryException(message: String = null, cause: Throwable = null) extends UvmRefImplException(message, cause)
/** Thrown when an action not required by the specification and not implemented by this refimpl is performed. */ /** Thrown when an action not required by the specification and not implemented by this refimpl is performed. */
...@@ -13,7 +13,7 @@ class UnimplementedOprationException(message: String = null, cause: Throwable = ...@@ -13,7 +13,7 @@ class UnimplementedOprationException(message: String = null, cause: Throwable =
/** /**
* Thrown when a dynamic error (errors that cannot be found at compile time) happens. This refimpl may sometimes throw * Thrown when a dynamic error (errors that cannot be found at compile time) happens. This refimpl may sometimes throw
* exceptions on static errors rather than checking before running because the µVM has undefined behaviour on static * exceptions on static errors rather than checking before running because the micro VM has undefined behaviour on static
* errors. (It has undefined behaviour on dynamic errors, too.) * errors. (It has undefined behaviour on dynamic errors, too.)
*/ */
class UvmRuntimeException(message: String = null, cause: Throwable = null) extends UvmRefImplException(message, cause) class UvmRuntimeException(message: String = null, cause: Throwable = null) extends UvmRefImplException(message, cause)
......
...@@ -131,7 +131,7 @@ class FutexManager { ...@@ -131,7 +131,7 @@ class FutexManager {
* Adjust waiting queues affected by garbage collection. * Adjust waiting queues affected by garbage collection.
* <p> * <p>
* @param getMovement A function that maps an object address to its new address if it is moved. Return None otherwise. * @param getMovement A function that maps an object address to its new address if it is moved. Return None otherwise.
* It assumes the new address is not previously occupied. (This shows why the µVM must be tightly coupled.) * It assumes the new address is not previously occupied. (This shows why a micro virtual machine must be tightly coupled.)
*/ */
def afterGCAdjust(getMovement: Word => Option[Word]): Unit = { def afterGCAdjust(getMovement: Word => Option[Word]): Unit = {
val oldKeys = objIndex.keySet.toList val oldKeys = objIndex.keySet.toList
......
...@@ -1253,7 +1253,7 @@ class InterpreterThread(val id: Int, microVM: MicroVM, initialStack: Interpreter ...@@ -1253,7 +1253,7 @@ class InterpreterThread(val id: Int, microVM: MicroVM, initialStack: Interpreter
/** /**
* Execute f, but catch the UvmOutOfMemoryException thrown by most allocation methods in the allocator. Out-of-memory * Execute f, but catch the UvmOutOfMemoryException thrown by most allocation methods in the allocator. Out-of-memory
* errors in the µVM usually branches to an exception destination, but has undefined behaviour when ExcClause is * errors in the micro VM usually branches to an exception destination, but has undefined behaviour when ExcClause is
* absent. * absent.
* @example {{{ * @example {{{
* handleOutOfMemory(excClause) { * handleOutOfMemory(excClause) {
...@@ -1277,7 +1277,7 @@ class InterpreterThread(val id: Int, microVM: MicroVM, initialStack: Interpreter ...@@ -1277,7 +1277,7 @@ class InterpreterThread(val id: Int, microVM: MicroVM, initialStack: Interpreter
} }
/** /**
* Raise NULL reference error. NULL reference errors in the µVM usually branches to an exception destination, but has * Raise NULL reference error. NULL reference errors in the micro VM usually branches to an exception destination, but has
* undefined behaviour when ExcClause is absent. * undefined behaviour when ExcClause is absent.
*/ */
private def nullRefError(excClause: Option[ExcClause]): Unit = { private def nullRefError(excClause: Option[ExcClause]): Unit = {
......
...@@ -40,7 +40,7 @@ class ThreadStackManager(microVM: MicroVM) { ...@@ -40,7 +40,7 @@ class ThreadStackManager(microVM: MicroVM) {
* <p> * <p>
* About mutator: "Bring your own mutator!" A mutator object is needed to allocate the stack memory. This means all * About mutator: "Bring your own mutator!" A mutator object is needed to allocate the stack memory. This means all
* callers of the newStack function must have a mutator. Currently they are either ClientAgents which can create stack * callers of the newStack function must have a mutator. Currently they are either ClientAgents which can create stack
* via the "new_stack" message or µVM threads (the InterpreterThread class) which can execute the NEWSTACK * via the "new_stack" message or micro VM threads (the InterpreterThread class) which can execute the NEWSTACK
* instruction. * instruction.
*/ */
def newStack(funcVer: FuncVer, args: Seq[ValueBox], mutator: Mutator): InterpreterStack = { def newStack(funcVer: FuncVer, args: Seq[ValueBox], mutator: Mutator): InterpreterStack = {
......
...@@ -13,7 +13,7 @@ object AllScanner { ...@@ -13,7 +13,7 @@ object AllScanner {
} }
/** /**
* Traverse through all references in the µVM. * Traverse through all references in the micro VM.
*/ */
class AllScanner(val microVM: MicroVM, val handler: RefFieldHandler) extends RefFieldHandler { class AllScanner(val microVM: MicroVM, val handler: RefFieldHandler) extends RefFieldHandler {
import AllScanner._ import AllScanner._
......
...@@ -20,7 +20,7 @@ trait RefFieldHandler { ...@@ -20,7 +20,7 @@ trait RefFieldHandler {
/** Scan a memory location. */ /** Scan a memory location. */
def fromMem(objRef: Word, iRef: Word, toObj: Word, isWeak: Boolean, isTR64: Boolean): Option[Word] def fromMem(objRef: Word, iRef: Word, toObj: Word, isWeak: Boolean, isTR64: Boolean): Option[Word]
/** /**
* A reference from somewhere internal to the µVM. * A reference from somewhere internal to the micro VM.
* For example, from the StackMemory to the memory byte array; * For example, from the StackMemory to the memory byte array;
* from a finaliser table to a finalisable object (to be added). * from a finaliser table to a finalisable object (to be added).
*/ */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment