Example #1
0
/* read register by GDB */
void ARMV5::regRead(uint32_t* data, uint16_t index)
{
    if (index <= FPS) {
        rfRead(data, index, CPSR_MODE(rf.cpsr));

        if (index == PC) {
            *data -= 4;
        }
    }

    else {
        switch (index) {
            case PID:
                *data = cp15.c13_context;
                break;
            case SYS:
                *data = cp15.c1_sys;
                break;
            case TTBR:
                *data = cp15.c2_ttbr;
                break;
                //          case DFSR:  *data = cp15.c5_dfsr; break;
                //          case IFSR:  *data = cp15.c5_ifsr; break;
                //          case FAR:   *data = cp15.c6_far; break;
            case DOM:
                *data = 0;

                for (int i = 0; i < 16; i++) {
                    *data |= (cp15.c3_domain[i] << (i * 2));
                }

                break;
                //case INST:    *data = inst_arm; break;
                //case CYCLE:   *data = cycle_total; break;
            case INST:
                *data = 0;
                printm(core_id, d_armv5, "gdb INST not implemented yet");
                break;
            case CYCLE:
                *data = 0;
                printm(core_id, d_armv5, "gdb CYCLE not implemented yet");
                break;
            default:
                *data = 0;
                printm(core_id, d_armv5, "no such register");
                break;
        }
    }
}
Example #2
0
void computeRC() {
	uint8_t chan;

	//Data comes from the ATMEGA128RF internal transceiver
	if(rfAvailable()>=RC_CHANS*sizeof(int16_t)) {
		memcpy(rcData, rfRead(), RC_CHANS*sizeof(int16_t));
		#if defined(FAILSAFE)
			failsafeCnt = 0;
		#endif
	}

	// rcData comes from MSP and overrides RX Data until rcSerialCount reaches 0
	if (rcSerialCount > 0){
		for (chan = 0; chan < RC_CHANS; chan++) {
			if (chan<8) {
				rcSerialCount --;
				if (rcSerial[chan] >900) {rcData[chan] = rcSerial[chan];} // only relevant channels are overridden
			}
		}
	}
}
Example #3
0
void ARMV5::addr_mode3_imm()
{
    bool p = inst & M(24);
    bool u = inst & M(23);
    bool w = inst & M(21);
    bool l = inst & M(20);
    uint8_t rn = SMM(inst, 19, 16);
    uint8_t immedH = SMM(inst, 11, 8);
    bool s = inst & M(6);
    bool h = inst & M(5);
    uint8_t immedL = SMM(inst, 3, 0);

    uint8_t offset_8 = 0;
    uint32_t rn_val = 0;
    uint32_t rn_val_old = 0;
    uint32_t addr = 0;

    rfRead(&rn_val, rn, CPSR_MODE(rf.cpsr));
    rn_val_old = rn_val;

    if (rn == 15) {
        printb(core_id, d_armv5_decode, "addr_mode3_reg rn = 15");
    }

    if (p && !w) {
        offset_8 = (immedH << 4) | immedL;

        if (u) {
            addr = rn_val + offset_8;
        }

        else {
            addr = rn_val - offset_8;
        }
    }

    else if (p && w) {
        offset_8 = (immedH << 4) | immedL;

        if (u) {
            addr = rn_val + offset_8;
        }

        else {
            addr = rn_val - offset_8;
        }

        rfWrite(addr, rn, CPSR_MODE(rf.cpsr));
    }

    else if (!p && !w) {
        addr = rn_val;
        offset_8 = (immedH << 4) | immedL;

        if (u) {
            rn_val += offset_8;
        }

        else {
            rn_val -= offset_8;
        }

        rfWrite(rn_val, rn, CPSR_MODE(rf.cpsr));
    }

    else {
        printb(core_id, d_armv5_decode, "addr_mode3_imm decode error");
    }

    uint8_t tmp = 0;

    if (l) {
        tmp |= M(2);
    }

    if (s) {
        tmp |= M(1);
    }

    if (h) {
        tmp |= M(0);
    }

    switch (tmp) {
        case B8(001):
            arm_strh(addr, rn_val_old);
            break;
        case B8(010):
            arm_ldrd(addr, rn_val_old);
            break;
        case B8(011):
            arm_strd(addr, rn_val_old);
            break;
        case B8(101):
            arm_ldrh(addr, rn_val_old);
            break;
        case B8(110):
            arm_ldrsb(addr, rn_val_old);
            break;
        case B8(111):
            arm_ldrsh(addr, rn_val_old);
            break;
        default:
            printb(core_id, d_armv5_decode, "addr_mode3_imm decode error");
    }
}
Example #4
0
void ARMV5::addr_mode3_reg()
{
    uint8_t SBZ = SMM(inst, 11, 8);

    if (SBZ != 0) {
        printb(core_id, d_armv5_decode, "addr_mode3_reg check error");
    }

    bool p = inst & M(24);
    bool u = inst & M(23);
    bool w = inst & M(21);
    bool l = inst & M(20);
    uint8_t rn = SMM(inst, 19, 16);
    bool s = inst & M(6);
    bool h = inst & M(5);
    uint8_t rm = SMM(inst, 3, 0);

    uint32_t rn_val = 0;
    uint32_t rm_val = 0;
    uint32_t rn_val_old = 0;
    uint32_t addr = 0;

    rfRead(&rn_val, rn, CPSR_MODE(rf.cpsr));
    rfRead(&rm_val, rm, CPSR_MODE(rf.cpsr));
    rn_val_old = rn_val;

    if (rn == 15) {
        printb(core_id, d_armv5_decode, "addr_mode3_reg rn = 15");
    }

    if (rm == 15) {
        printb(core_id, d_armv5_decode, "addr_mode3_reg rm = 15");
    }

    if (p && !w) {
        if (u) {
            addr = rn_val + rm_val;
        }

        else {
            addr = rn_val - rm_val;
        }
    }

    else if (p && w) {
        if (u) {
            addr = rn_val + rm_val;
        }

        else {
            addr = rn_val - rm_val;
        }

        rfWrite(addr, rn, CPSR_MODE(rf.cpsr));
    }

    else if (!p && !w) {
        addr = rn_val;

        if (u) {
            rn_val += rm_val;
        }

        else {
            rn_val -= rm_val;
        }

        rfWrite(rn_val, rn, CPSR_MODE(rf.cpsr));
    }

    else {
        printb(core_id, d_armv5_decode, "addr_mode3_reg p-bit w-bit decode error");
    }

    uint8_t tmp = 0;

    if (l) {
        tmp |= M(2);
    }

    if (s) {
        tmp |= M(1);
    }

    if (h) {
        tmp |= M(0);
    }

    switch (tmp) {
        case B8(001):
            arm_strh(addr, rn_val_old);
            break;
        case B8(010):
            arm_ldrd(addr, rn_val_old);
            break;
        case B8(011):
            arm_strd(addr, rn_val_old);
            break;
        case B8(101):
            arm_ldrh(addr, rn_val_old);
            break;
        case B8(110):
            arm_ldrsb(addr, rn_val_old);
            break;
        case B8(111):
            arm_ldrsh(addr, rn_val_old);
            break;
        default:
            printb(core_id, d_armv5_decode, "addr_mode3_reg l-bit s-bit h-bit decode error");
    }
}