Package org.jnode.assembler.x86

Examples of org.jnode.assembler.x86.X86BinaryAssembler


        /* Set statics index of VmSystem_currentTimeMillis */
        final VmType<?> vmSystemClass = loadClass(VmSystem.class);
        final int staticsIdx = ((VmStaticField) vmSystemClass
            .getField("currentTimeMillis")).getSharedStaticsIndex();
        final X86BinaryAssembler os86 = (X86BinaryAssembler) os;
        os86.set32(os.getObjectRef(new Label("currentTimeMillisStaticsIdx"))
            .getOffset(), staticsIdx);

        /* Link vm_findThrowableHandler */
        refJava = os
            .getObjectRef(vmSystemClass
View Full Code Here


    protected void emitStaticInitializerCalls(NativeStream nativeOs,
                                              VmType<?>[] bootClasses, Object clInitCaller)
        throws ClassNotFoundException {

        final X86BinaryAssembler os = (X86BinaryAssembler) nativeOs;
        X86BinaryAssembler.ObjectInfo initCallerObject = os
            .startObject(loadClass(VmMethodCode.class));

        os.setObjectRef(clInitCaller);

        // Call VmClass.loadFromBootClassArray
        final VmType<?> vmClassClass = loadClass(VmType.class);
        final VmMethod lfbcaMethod = vmClassClass.getMethod(
            "loadFromBootClassArray", "([Lorg/jnode/vm/classmgr/VmType;)V");
        final VmType<?> vmMethodClass = loadClass(VmMethod.class);
        final VmInstanceField nativeCodeField = (VmInstanceField) vmMethodClass
            .getField("nativeCode");

        final GPR aax = os.isCode32() ? (GPR) X86Register.EAX : X86Register.RAX;
        final GPR abx = os.isCode32() ? (GPR) X86Register.EBX : X86Register.RBX;

        os.writeMOV_Const(aax, bootClasses);
        os.writePUSH(aax);
        os.writeMOV_Const(aax, lfbcaMethod);
        os.writeMOV(abx.getSize(), abx, aax, nativeCodeField.getOffset());
        os.writeCALL(abx);

        // Now call all static initializers
        for (int i = 0; (i < bootClasses.length); i++) {
            VmType<?> vmClass = bootClasses[i];
            if ((vmClass instanceof VmClassType)
                && (((VmClassType<?>) vmClass).getInstanceCount() > 0)) {
                VmMethod clInit = vmClass.getMethod("<clinit>", "()V");
                if (clInit != null) {
                    // os.setObjectRef(clInitCaller + "$$" + vmClass.getName());
                    log("Missing static initializer in class "
                        + vmClass.getName(), Project.MSG_WARN);
                }
            }
        }
        os.writeRET(); // RET
        os.align(4096);

        initCallerObject.markEnd();
    }
View Full Code Here

     *
     * @param nativeOs
     * @throws BuildException
     */
    protected void patchHeader(NativeStream nativeOs) throws BuildException {
        final X86BinaryAssembler os = (X86BinaryAssembler) nativeOs;
        int mb_hdr = -1;
        for (int i = 0; i < 1024; i += 4) {
            if (os.get32(i) == MB_MAGIC) {
                mb_hdr = i;
                break;
            }
        }
        if (mb_hdr < 0) {
            throw new BuildException("Cannot find Multiboot header");
        }

        int loadAddr = os.get32(mb_hdr + MB_LOAD_ADDR);
        if (loadAddr != os.getBaseAddr()) {
            throw new BuildException("Non-matching load address, found 0x"
                + Integer.toHexString(loadAddr) + ", expected 0x"
                + Long.toHexString(os.getBaseAddr()));
        }

        os.set32(mb_hdr + MB_LOAD_END_ADDR, (int) os.getBaseAddr()
            + os.getLength());
        os.set32(mb_hdr + MB_BSS_END_ADDR, (int) os.getBaseAddr()
            + os.getLength());
    }
View Full Code Here

    protected X86CpuID getCPUID() {
        return X86CpuID.createID(processorId);
    }

    protected void logStatistics(NativeStream os) {
        final X86BinaryAssembler os86 = (X86BinaryAssembler) os;
        final int count = os86.getObjectRefsCount();
        if (count > INITIAL_OBJREFS_CAPACITY) {
            log("Increase BootImageBuilder.INITIAL_OBJREFS_CAPACITY to "
                + count + " for faster build.", Project.MSG_WARN);
        }
        final int size = os86.getLength();
        if (size > INITIAL_SIZE) {
            log("Increase BootImageBuilder.INITIAL_SIZE to " + size
                + " for faster build.", Project.MSG_WARN);
        }
    }
View Full Code Here

        modules.add(assembler.getPseudo());
    }

    public void assemble(int baseAddress) {
        X86CpuID cpuId = X86CpuID.createID("pentium");
        nativeStream = new X86BinaryAssembler(cpuId, X86Constants.Mode.CODE32, baseAddress);
        ((X86BinaryAssembler) nativeStream).setByteValueEnabled(true);
        ((X86BinaryAssembler) nativeStream).setRelJumpEnabled(false);
        doAssembly();
    }
View Full Code Here

                className = arg0;
            }
        }

        if (binary) {
            X86BinaryAssembler os = new X86BinaryAssembler(cpuId, X86Constants.Mode.CODE32, 0);
            generateCode(os, className);

            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            os.writeTo(baos);
            baos.close();
            byte[] b = baos.toByteArray();

            FileOutputStream fos = new FileOutputStream("test.bin");
            fos.write(b);
View Full Code Here

            }
            final X86RegisterPool pool = eContext.getGPRPool();
            final IntItem result;
            v.load(eContext);
            if (os.isCode32()) {
                final X86Register lsb = v.getLsbRegister(eContext);
                v.release(eContext);
                pool.request(lsb);
                result = (IntItem) ifac.createReg(eContext, JvmType.INT, lsb);
                pool.transferOwnerTo(lsb, result);
            } else {
                final X86Register reg = v.getRegister(eContext);
                final X86Register intReg = pool.getRegisterInSameGroup(reg,
                    JvmType.INT);
                v.release(eContext);
                pool.request(intReg);
                result = (IntItem) ifac.createReg(eContext, JvmType.INT, intReg);
                pool.transferOwnerTo(intReg, result);
View Full Code Here

     * @param index
     * @param scale
     */
    private void loadArrayEntryOffset(GPR dst, RefItem ref, IntItem index, int scale) {
        assertCondition(ref.isGPR(), "ref must be in a register");
        final GPR refr = ref.getRegister();
        if (index.isConstant()) {
            final int offset = index.getValue() * scale;
            os.writeLEA(dst, refr, arrayDataOffset + offset);
        } else {
            final GPR32 idxr = (GPR32) index.getRegister();
View Full Code Here

            v2 = v1;
            v1 = tmp;
        }

        if (os.isCode32()) {
            final GPR r1_lsb = v1.getLsbRegister(eContext);
            final GPR r1_msb = v1.getMsbRegister(eContext);
            switch (v2.getKind()) {
                case Item.Kind.GPR:
                    os.writeArithOp(operationLsb, r1_lsb, v2
                        .getLsbRegister(eContext));
                    os.writeArithOp(operationMsb, r1_msb, v2
View Full Code Here

        vstack.push(eContext);

        // Claim EAX/RAX, we're going to use it later
        L1AHelper.requestRegister(eContext, helper.AAX);
        // Request tmp register
        final GPR classr = (GPR) L1AHelper.requestRegister(eContext,
            JvmType.REFERENCE, false);

        // Pop
        final IntItem cnt = vstack.popInt();

        // Load the count value
        cnt.load(eContext);
        final GPR cntr = cnt.getRegister();

        // Resolve the class
        writeResolveAndLoadClassToReg(classRef, classr);

        // Release EAX so it can be used by invokeJavaMethod
View Full Code Here

TOP

Related Classes of org.jnode.assembler.x86.X86BinaryAssembler

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.