Commit bc578970 authored by Kunshan Wang's avatar Kunshan Wang

Automagic reloc configurable by option

Now "automagic relocation" can be enabled by a VMConf option
"automagicReloc".  It is disabled by default.
parent e701e3d5
......@@ -199,6 +199,11 @@ globalSize must be a multiple of 32768 bytes (32K).*
- **sourceInfo**: Provide line/column info in Mu IR when errors occur. May be
useful for debugging small Mu IR bundles, but will significantly slow down
parsing!!! Enable only if the bundle is small. default: false
- **automagicReloc**: Allow "automagic" relocation. If true, `uptr` and
`ufuncptr` fields will also be traced during boot image building. If a `uptr`
field points to a global cell field, it will still point to the same field
after boot image loading; if a `ufuncptr` points to a native function, it will
point to the same function after boot image loading. default: false
- **extraLibs**: Extra libraries to load when starting the micro VM. This is a
colon-separated list of libraries. Each library has the same syntax of the
`path` argument of the `dlopen` system function. By default, it does not load
......
......@@ -106,6 +106,12 @@ object VMConfParser {
parser = parseBoolean,
default = VMConf.DEFAULT_CONF.sourceInfo)
val automagicReloc = opt[Boolean](
name = "automagicReloc",
desc = """'Automagic' relocation. Affects boot image building, but not loading.""",
parser = parseBoolean,
default = VMConf.DEFAULT_CONF.automagicReloc)
val extraLibs = opt[Seq[String]](
name = "extraLibs",
desc = """Extra libraries to load when starting the micro VM. This is a colon-separated list of libraries.
......@@ -163,6 +169,7 @@ object VMConf {
dumpBundle = VMConfParser.dumpBundle(kvMap),
staticCheck = VMConfParser.staticCheck(kvMap),
sourceInfo = VMConfParser.sourceInfo(kvMap),
automagicReloc = VMConfParser.automagicReloc(kvMap),
extraLibs = VMConfParser.extraLibs(kvMap),
bootImg = VMConfParser.bootImg(kvMap)
)
......@@ -187,6 +194,7 @@ class VMConf(
val dumpBundle: Boolean = false,
val staticCheck: Boolean = true,
val sourceInfo: Boolean = false,
val automagicReloc: Boolean = false,
val extraLibs: Seq[String] = Seq(),
val bootImg: Option[String] = None)
......@@ -74,6 +74,8 @@ class BootImageWriter(tcb: TransitiveClosureBuilder, syms: Seq[FieldAndSymbol],
import BootImageWriter._
import BootImageFile._
val automagicReloc = microVM.vmConf.automagicReloc
val bundleSerializer = new BundleSerializer(microVM.globalBundle, tcb.tls.set)
val tempDir = Files.createTempDirectory("mu-bootimg")
......@@ -227,6 +229,7 @@ class BootImageWriter(tcb: TransitiveClosureBuilder, syms: Seq[FieldAndSymbol],
logger.debug("External uptr relocation: %d 0x%x -> %s".format(iRef, iRef, symbol))
}
case None => {
if (automagicReloc) {
// maybe a "reasonable" pointer to a mu global cell. Relocate it too.
val fieldOffset = iRef - objRef
val maybeGlobalCell = tcb.maybeGetGlobalCellRec(toAddr)
......@@ -244,7 +247,9 @@ class BootImageWriter(tcb: TransitiveClosureBuilder, syms: Seq[FieldAndSymbol],
}
}
}
}
def visitUFPField(objRef: Word, iRef: Word, toAddr: Word): Unit = {
if (automagicReloc) {
relocsMap.get(iRef).foreach { symbol =>
// by symbol
val fieldOffset = iRef - objRef
......@@ -253,6 +258,7 @@ class BootImageWriter(tcb: TransitiveClosureBuilder, syms: Seq[FieldAndSymbol],
logger.debug("External ufuncptr relocation: %d 0x%x -> %s".format(iRef, iRef, symbol))
}
}
}
def visitRefField(objRef: Word, iRef: Word, toObj: Word, isWeak: Boolean): Unit = if (toObj != 0L) {
val fieldOffset = iRef - objRef
......
......@@ -17,6 +17,8 @@ class BootImageWriterTest extends UvmBundleTesterBase with ExtraMatchers {
preloadBundles("tests/uvm-refimpl-test/transitive-closure.uir")
preloadHails("tests/uvm-refimpl-test/transitive-closure.hail")
override def makeMicroVM = MicroVM(new VMConf(automagicReloc = true))
{
tryWithResource(microVM.newContext()) { ctx =>
val h_gs = ctx.handleFromGlobal("@gs")
......@@ -49,6 +51,7 @@ class BootImageWriterTest extends UvmBundleTesterBase with ExtraMatchers {
tryWithResource(microVM.newContext()) { ctx =>
val h_gs3 = ctx.handleFromGlobal("@gs3")
val h_gs3_1 = ctx.getFieldIRef(h_gs3, 1)
val h_gs3_2 = ctx.getFieldIRef(h_gs3, 2)
val h_gs3_3 = ctx.getFieldIRef(h_gs3, 3)
......@@ -75,10 +78,15 @@ class BootImageWriterTest extends UvmBundleTesterBase with ExtraMatchers {
microVM.globalBundle.allNs("@gd").id shouldEqual anotherMicroVM.globalBundle.allNs("@gd").id
tryWithResource(anotherMicroVM.newContext()) { ctx =>
//val h_gr1 = ctx.handleFromGlobal("@gr1")
//val h_gr1_ptr = ctx.getAddr(h_gr1)
val h_gs = ctx.handleFromGlobal("@gs")
val h_gs_2 = ctx.getFieldIRef(h_gs, 2)
val h_gs_2_ptr = ctx.getAddr(h_gs_2)
val h_gs3 = ctx.handleFromGlobal("@gs3")
val h_gs3_1 = ctx.getFieldIRef(h_gs3, 1)
val h_gs3_1_val = ctx.load(MemoryOrder.NOT_ATOMIC, h_gs3_1).asInstanceOf[MuUPtrValue]
val h_gs3_2 = ctx.getFieldIRef(h_gs3, 2)
val h_gs3_2_ptr = ctx.getAddr(h_gs3_2)
val h_gs3_2_val = ctx.load(MemoryOrder.NOT_ATOMIC, h_gs3_2).asInstanceOf[MuUPtrValue]
......@@ -87,7 +95,9 @@ class BootImageWriterTest extends UvmBundleTesterBase with ExtraMatchers {
val h_gt = ctx.handleFromGlobal("@gt")
val h_gt_val = ctx.load(MemoryOrder.NOT_ATOMIC, h_gt).asInstanceOf[MuUPtrValue]
//val gr1_ptr = ctx.handleToPtr(h_gr1_ptr)
val gs_2_ptr = ctx.handleToPtr(h_gs_2_ptr)
val gs3_1_val = ctx.handleToPtr(h_gs3_1_val)
val gs3_2_ptr = ctx.handleToPtr(h_gs3_2_ptr)
val gs3_2_val = ctx.handleToPtr(h_gs3_2_val)
val gs3_3_val = ctx.handleToFP(h_gs3_3_val)
......
......@@ -13,4 +13,3 @@
.init @gr2 = &@gr1
.init @gs3[0] = 43
.init @gs3[1] = 44
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