* @throws ClassNotFoundException
*/
protected void initVmThread(X86BinaryAssembler os) throws BuildException,
ClassNotFoundException {
final VmType<?> vmThreadClass = loadClass(VmThread.class);
final VmInstanceField threadStackField = (VmInstanceField) vmThreadClass
.getField("stack");
final VmInstanceField threadStackEndField = (VmInstanceField) vmThreadClass
.getField("stackEnd");
final VmType<?> vmProcessorClass = loadClass(VmProcessor.class);
final VmInstanceField procStackEndField = (VmInstanceField) vmProcessorClass
.getField("stackEnd");
final VmThread initialThread = processor.getCurrentThread();
final GPR abx = os.isCode32() ? (GPR) X86Register.EBX : X86Register.RBX;
final GPR adx = os.isCode32() ? (GPR) X86Register.EDX : X86Register.RDX;
final int slotSize = arch.getReferenceSize();
os.setObjectRef(new Label("$$Setup initial thread"));
os.writeMOV_Const(abx, initialThread);
/** Initialize initialStack.stack to Luser_stack */
os.writeMOV_Const(adx, initialStack);
os.writeMOV(adx.getSize(), abx, threadStackField.getOffset(), adx);
// Calculate and set stackEnd
os.writeLEA(adx, adx, VmThread.STACK_OVERFLOW_LIMIT_SLOTS * slotSize);
os.writeMOV(adx.getSize(), abx, threadStackEndField.getOffset(), adx);
// Set stackend in current processor
os.writeMOV_Const(abx, processor);
os.writeMOV(adx.getSize(), abx, procStackEndField.getOffset(), adx);
}