TARGET: fix handling return code of MMU translation
[fw/openocd] / src / target / arm920t.c
index 152edcfeb30b9638d398c5d1602a43dafe72ad95..fe2ff015e742df4b37b5c1cc7242d833e810d35c 100644 (file)
@@ -91,35 +91,30 @@ static int arm920t_read_cp15_physical(struct target *target,
 
        jtag_info = &arm920t->arm7_9_common.jtag_info;
 
-       jtag_set_end_state(TAP_IDLE);
-       arm_jtag_scann(jtag_info, 0xf);
-       arm_jtag_set_instr(jtag_info, jtag_info->intest_instr, NULL);
+       arm_jtag_scann(jtag_info, 0xf, TAP_IDLE);
+       arm_jtag_set_instr(jtag_info, jtag_info->intest_instr, NULL, TAP_IDLE);
 
-       fields[0].tap = jtag_info->tap;
        fields[0].num_bits = 1;
        fields[0].out_value = &access_type_buf;
        fields[0].in_value = NULL;
 
-       fields[1].tap = jtag_info->tap;
        fields[1].num_bits = 32;
        fields[1].out_value = NULL;
        fields[1].in_value = NULL;
 
-       fields[2].tap = jtag_info->tap;
        fields[2].num_bits = 6;
        fields[2].out_value = &reg_addr_buf;
        fields[2].in_value = NULL;
 
-       fields[3].tap = jtag_info->tap;
        fields[3].num_bits = 1;
        fields[3].out_value = &nr_w_buf;
        fields[3].in_value = NULL;
 
-       jtag_add_dr_scan(4, fields, jtag_get_end_state());
+       jtag_add_dr_scan(jtag_info->tap, 4, fields, TAP_IDLE);
 
        fields[1].in_value = (uint8_t *)value;
 
-       jtag_add_dr_scan(4, fields, jtag_get_end_state());
+       jtag_add_dr_scan(jtag_info->tap, 4, fields, TAP_IDLE);
 
        jtag_add_callback(arm_le_to_h_u32, (jtag_callback_data_t)value);
 
@@ -146,31 +141,26 @@ static int arm920t_write_cp15_physical(struct target *target,
 
        buf_set_u32(value_buf, 0, 32, value);
 
-       jtag_set_end_state(TAP_IDLE);
-       arm_jtag_scann(jtag_info, 0xf);
-       arm_jtag_set_instr(jtag_info, jtag_info->intest_instr, NULL);
+       arm_jtag_scann(jtag_info, 0xf, TAP_IDLE);
+       arm_jtag_set_instr(jtag_info, jtag_info->intest_instr, NULL, TAP_IDLE);
 
-       fields[0].tap = jtag_info->tap;
        fields[0].num_bits = 1;
        fields[0].out_value = &access_type_buf;
        fields[0].in_value = NULL;
 
-       fields[1].tap = jtag_info->tap;
        fields[1].num_bits = 32;
        fields[1].out_value = value_buf;
        fields[1].in_value = NULL;
 
-       fields[2].tap = jtag_info->tap;
        fields[2].num_bits = 6;
        fields[2].out_value = &reg_addr_buf;
        fields[2].in_value = NULL;
 
-       fields[3].tap = jtag_info->tap;
        fields[3].num_bits = 1;
        fields[3].out_value = &nr_w_buf;
        fields[3].in_value = NULL;
 
-       jtag_add_dr_scan(4, fields, jtag_get_end_state());
+       jtag_add_dr_scan(jtag_info->tap, 4, fields, TAP_IDLE);
 
 #ifdef _DEBUG_INSTRUCTION_EXECUTION_
        LOG_DEBUG("addr: 0x%x value: %8.8x", reg_addr, value);
@@ -200,33 +190,28 @@ static int arm920t_execute_cp15(struct target *target, uint32_t cp15_opcode,
 
        jtag_info = &arm920t->arm7_9_common.jtag_info;
 
-       jtag_set_end_state(TAP_IDLE);
-       arm_jtag_scann(jtag_info, 0xf);
-       arm_jtag_set_instr(jtag_info, jtag_info->intest_instr, NULL);
+       arm_jtag_scann(jtag_info, 0xf, TAP_IDLE);
+       arm_jtag_set_instr(jtag_info, jtag_info->intest_instr, NULL, TAP_IDLE);
 
        buf_set_u32(cp15_opcode_buf, 0, 32, cp15_opcode);
 
-       fields[0].tap = jtag_info->tap;
        fields[0].num_bits = 1;
        fields[0].out_value = &access_type_buf;
        fields[0].in_value = NULL;
 
-       fields[1].tap = jtag_info->tap;
        fields[1].num_bits = 32;
        fields[1].out_value = cp15_opcode_buf;
        fields[1].in_value = NULL;
 
-       fields[2].tap = jtag_info->tap;
        fields[2].num_bits = 6;
        fields[2].out_value = &reg_addr_buf;
        fields[2].in_value = NULL;
 
-       fields[3].tap = jtag_info->tap;
        fields[3].num_bits = 1;
        fields[3].out_value = &nr_w_buf;
        fields[3].in_value = NULL;
 
-       jtag_add_dr_scan(4, fields, jtag_get_end_state());
+       jtag_add_dr_scan(jtag_info->tap, 4, fields, TAP_IDLE);
 
        arm9tdmi_clock_out(jtag_info, arm_opcode, 0, NULL, 0);
        arm9tdmi_clock_out(jtag_info, ARMV4_5_NOP, 0, NULL, 1);
@@ -529,12 +514,11 @@ static int arm920_virt2phys(struct target *target,
        uint32_t ap;
        struct arm920t_common *arm920t = target_to_arm920(target);
 
-       uint32_t ret = armv4_5_mmu_translate_va(target,
-                       &arm920t->armv4_5_mmu, virt, &type, &cb, &domain, &ap);
-       if (type == -1)
-       {
-               return ret;
-       }
+       uint32_t ret;
+       int retval = armv4_5_mmu_translate_va(target,
+                       &arm920t->armv4_5_mmu, virt, &type, &cb, &domain, &ap, &ret);
+       if (retval != ERROR_OK)
+               return retval;
        *phys = ret;
        return ERROR_OK;
 }
@@ -582,7 +566,11 @@ int arm920t_write_memory(struct target *target, uint32_t address,
 
        /* FIX!!!! this should be cleaned up and made much more general. The
         * plan is to write up and test on arm920t specifically and
-        * then generalize and clean up afterwards. */
+        * then generalize and clean up afterwards.
+        *
+        * Also it should be moved to the callbacks that handle breakpoints
+        * specifically and not the generic memory write fn's. See XScale code.
+        */
        if (arm920t->armv4_5_mmu.mmu_enabled && (count == 1) &&
                        ((size==2) || (size==4)))
        {
@@ -600,10 +588,10 @@ int arm920t_write_memory(struct target *target, uint32_t address,
                /*
                 * We need physical address and cb
                 */
-               pa = armv4_5_mmu_translate_va(target, &arm920t->armv4_5_mmu,
-                               address, &type, &cb, &domain, &ap);
-               if (type == -1)
-                       return pa;
+               retval = armv4_5_mmu_translate_va(target, &arm920t->armv4_5_mmu,
+                               address, &type, &cb, &domain, &ap, &pa);
+               if (retval != ERROR_OK)
+                       return retval;
 
                if (arm920t->armv4_5_mmu.armv4_5_cache.d_u_cache_enabled)
                {
@@ -717,7 +705,7 @@ int arm920t_write_memory(struct target *target, uint32_t address,
                }
        }
 
-       return retval;
+       return ERROR_OK;
 }
 
 // EXPORTED to FA256
@@ -799,7 +787,7 @@ static int arm920t_mcr(struct target *target, int cpnum,
                uint32_t CRn, uint32_t CRm,
                uint32_t value);
 
-int arm920t_init_arch_info(struct target *target,
+static int arm920t_init_arch_info(struct target *target,
                struct arm920t_common *arm920t, struct jtag_tap *tap)
 {
        struct arm7_9_common *arm7_9 = &arm920t->arm7_9_common;