openocd: fix SPDX tag format for files .c
[fw/openocd] / src / target / aarch64.c
index 612924f5a7b76b771313ea6897bd584413af1c97..8592daa167c74cdc31778c97dc034ad151731246 100644 (file)
@@ -1,20 +1,8 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+
 /***************************************************************************
  *   Copyright (C) 2015 by David Ung                                       *
  *                                                                         *
- *   This program is free software; you can redistribute it and/or modify  *
- *   it under the terms of the GNU General Public License as published by  *
- *   the Free Software Foundation; either version 2 of the License, or     *
- *   (at your option) any later version.                                   *
- *                                                                         *
- *   This program is distributed in the hope that it will be useful,       *
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
- *   GNU General Public License for more details.                          *
- *                                                                         *
- *   You should have received a copy of the GNU General Public License     *
- *   along with this program; if not, write to the                         *
- *   Free Software Foundation, Inc.,                                       *
- *                                                                         *
  ***************************************************************************/
 
 #ifdef HAVE_CONFIG_H
@@ -29,6 +17,7 @@
 #include "target_type.h"
 #include "armv8_opcodes.h"
 #include "armv8_cache.h"
+#include "arm_coresight.h"
 #include "arm_semihosting.h"
 #include "jtag/interface.h"
 #include "smp.h"
@@ -101,6 +90,7 @@ static int aarch64_restore_system_control_reg(struct target *target)
                case ARM_MODE_FIQ:
                case ARM_MODE_IRQ:
                case ARM_MODE_HYP:
+               case ARM_MODE_UND:
                case ARM_MODE_SYS:
                        instr = ARMV4_5_MCR(15, 0, 0, 1, 0, 0);
                        break;
@@ -179,6 +169,7 @@ static int aarch64_mmu_modify(struct target *target, int enable)
        case ARM_MODE_FIQ:
        case ARM_MODE_IRQ:
        case ARM_MODE_HYP:
+       case ARM_MODE_UND:
        case ARM_MODE_SYS:
                instr = ARMV4_5_MCR(15, 0, 0, 1, 0, 0);
                break;
@@ -252,7 +243,7 @@ static int aarch64_init_debug_access(struct target *target)
 
 /* Write to memory mapped registers directly with no cache or mmu handling */
 static int aarch64_dap_write_memap_register_u32(struct target *target,
-       uint32_t address,
+       target_addr_t address,
        uint32_t value)
 {
        int retval;
@@ -330,15 +321,14 @@ static int aarch64_wait_halt_one(struct target *target)
 static int aarch64_prepare_halt_smp(struct target *target, bool exc_target, struct target **p_first)
 {
        int retval = ERROR_OK;
-       struct target_list *head = target->head;
+       struct target_list *head;
        struct target *first = NULL;
 
        LOG_DEBUG("target %s exc %i", target_name(target), exc_target);
 
-       while (head != NULL) {
+       foreach_smp_target(head, target->smp_targets) {
                struct target *curr = head->target;
                struct armv8_common *armv8 = target_to_armv8(curr);
-               head = head->next;
 
                if (exc_target && curr == target)
                        continue;
@@ -359,7 +349,7 @@ static int aarch64_prepare_halt_smp(struct target *target, bool exc_target, stru
 
                LOG_DEBUG("target %s prepared", target_name(curr));
 
-               if (first == NULL)
+               if (!first)
                        first = curr;
        }
 
@@ -427,7 +417,7 @@ static int aarch64_halt_smp(struct target *target, bool exc_target)
                struct target_list *head;
                struct target *curr;
 
-               foreach_smp_target(head, target->head) {
+               foreach_smp_target(head, target->smp_targets) {
                        int halted;
 
                        curr = head->target;
@@ -477,7 +467,7 @@ static int update_halt_gdb(struct target *target, enum target_debug_reason debug
        }
 
        /* poll all targets in the group, but skip the target that serves GDB */
-       foreach_smp_target(head, target->head) {
+       foreach_smp_target(head, target->smp_targets) {
                curr = head->target;
                /* skip calling context */
                if (curr == target)
@@ -488,7 +478,7 @@ static int update_halt_gdb(struct target *target, enum target_debug_reason debug
                if (curr->state == TARGET_HALTED)
                        continue;
                /* remember the gdb_service->target */
-               if (curr->gdb_service != NULL)
+               if (curr->gdb_service)
                        gdb_target = curr->gdb_service->target;
                /* skip it */
                if (curr == gdb_target)
@@ -501,7 +491,7 @@ static int update_halt_gdb(struct target *target, enum target_debug_reason debug
        }
 
        /* after all targets were updated, poll the gdb serving target */
-       if (gdb_target != NULL && gdb_target != target)
+       if (gdb_target && gdb_target != target)
                aarch64_poll(gdb_target);
 
        return ERROR_OK;
@@ -742,7 +732,7 @@ static int aarch64_prep_restart_smp(struct target *target, int handle_breakpoint
        struct target *first = NULL;
        uint64_t address;
 
-       foreach_smp_target(head, target->head) {
+       foreach_smp_target(head, target->smp_targets) {
                struct target *curr = head->target;
 
                /* skip calling target */
@@ -762,7 +752,7 @@ static int aarch64_prep_restart_smp(struct target *target, int handle_breakpoint
                        break;
                }
                /* remember the first valid target in the group */
-               if (first == NULL)
+               if (!first)
                        first = curr;
        }
 
@@ -785,7 +775,7 @@ static int aarch64_step_restart_smp(struct target *target)
        if (retval != ERROR_OK)
                return retval;
 
-       if (first != NULL)
+       if (first)
                retval = aarch64_do_restart_one(first, RESTART_LAZY);
        if (retval != ERROR_OK) {
                LOG_DEBUG("error restarting target %s", target_name(first));
@@ -797,7 +787,7 @@ static int aarch64_step_restart_smp(struct target *target)
                struct target *curr = target;
                bool all_resumed = true;
 
-               foreach_smp_target(head, target->head) {
+               foreach_smp_target(head, target->smp_targets) {
                        uint32_t prsr;
                        int resumed;
 
@@ -885,7 +875,7 @@ static int aarch64_resume(struct target *target, int current,
                        struct target_list *head;
                        bool all_resumed = true;
 
-                       foreach_smp_target(head, target->head) {
+                       foreach_smp_target(head, target->smp_targets) {
                                uint32_t prsr;
                                int resumed;
 
@@ -1048,6 +1038,7 @@ static int aarch64_post_debug_entry(struct target *target)
        case ARM_MODE_FIQ:
        case ARM_MODE_IRQ:
        case ARM_MODE_HYP:
+       case ARM_MODE_UND:
        case ARM_MODE_SYS:
                instr = ARMV4_5_MRC(15, 0, 0, 1, 0, 0);
                break;
@@ -1233,7 +1224,7 @@ static int aarch64_set_breakpoint(struct target *target,
        struct armv8_common *armv8 = &aarch64->armv8_common;
        struct aarch64_brp *brp_list = aarch64->brp_list;
 
-       if (breakpoint->set) {
+       if (breakpoint->is_set) {
                LOG_WARNING("breakpoint already set");
                return ERROR_OK;
        }
@@ -1246,7 +1237,7 @@ static int aarch64_set_breakpoint(struct target *target,
                        LOG_ERROR("ERROR Can not find free Breakpoint Register Pair");
                        return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
                }
-               breakpoint->set = brp_i + 1;
+               breakpoint_hw_set(breakpoint, brp_i);
                if (breakpoint->length == 2)
                        byte_addr_select = (3 << (breakpoint->address & 0x02));
                control = ((matchmode & 0x7) << 20)
@@ -1259,18 +1250,18 @@ static int aarch64_set_breakpoint(struct target *target,
                bpt_value = brp_list[brp_i].value;
 
                retval = aarch64_dap_write_memap_register_u32(target, armv8->debug_base
-                               + CPUV8_DBG_BVR_BASE + 16 * brp_list[brp_i].BRPn,
+                               + CPUV8_DBG_BVR_BASE + 16 * brp_list[brp_i].brpn,
                                (uint32_t)(bpt_value & 0xFFFFFFFF));
                if (retval != ERROR_OK)
                        return retval;
                retval = aarch64_dap_write_memap_register_u32(target, armv8->debug_base
-                               + CPUV8_DBG_BVR_BASE + 4 + 16 * brp_list[brp_i].BRPn,
+                               + CPUV8_DBG_BVR_BASE + 4 + 16 * brp_list[brp_i].brpn,
                                (uint32_t)(bpt_value >> 32));
                if (retval != ERROR_OK)
                        return retval;
 
                retval = aarch64_dap_write_memap_register_u32(target, armv8->debug_base
-                               + CPUV8_DBG_BCR_BASE + 16 * brp_list[brp_i].BRPn,
+                               + CPUV8_DBG_BCR_BASE + 16 * brp_list[brp_i].brpn,
                                brp_list[brp_i].control);
                if (retval != ERROR_OK)
                        return retval;
@@ -1330,7 +1321,7 @@ static int aarch64_set_breakpoint(struct target *target,
                                breakpoint->address & 0xFFFFFFFFFFFFFFFE,
                                breakpoint->length);
 
-               breakpoint->set = 0x11; /* Any nice value but 0 */
+               breakpoint->is_set = true;
        }
 
        /* Ensure that halting debug mode is enable */
@@ -1354,7 +1345,7 @@ static int aarch64_set_context_breakpoint(struct target *target,
        struct armv8_common *armv8 = &aarch64->armv8_common;
        struct aarch64_brp *brp_list = aarch64->brp_list;
 
-       if (breakpoint->set) {
+       if (breakpoint->is_set) {
                LOG_WARNING("breakpoint already set");
                return retval;
        }
@@ -1368,7 +1359,7 @@ static int aarch64_set_context_breakpoint(struct target *target,
                return ERROR_FAIL;
        }
 
-       breakpoint->set = brp_i + 1;
+       breakpoint_hw_set(breakpoint, brp_i);
        control = ((matchmode & 0x7) << 20)
                | (1 << 13)
                | (byte_addr_select << 5)
@@ -1377,12 +1368,12 @@ static int aarch64_set_context_breakpoint(struct target *target,
        brp_list[brp_i].value = (breakpoint->asid);
        brp_list[brp_i].control = control;
        retval = aarch64_dap_write_memap_register_u32(target, armv8->debug_base
-                       + CPUV8_DBG_BVR_BASE + 16 * brp_list[brp_i].BRPn,
+                       + CPUV8_DBG_BVR_BASE + 16 * brp_list[brp_i].brpn,
                        brp_list[brp_i].value);
        if (retval != ERROR_OK)
                return retval;
        retval = aarch64_dap_write_memap_register_u32(target, armv8->debug_base
-                       + CPUV8_DBG_BCR_BASE + 16 * brp_list[brp_i].BRPn,
+                       + CPUV8_DBG_BCR_BASE + 16 * brp_list[brp_i].brpn,
                        brp_list[brp_i].control);
        if (retval != ERROR_OK)
                return retval;
@@ -1398,16 +1389,16 @@ static int aarch64_set_hybrid_breakpoint(struct target *target, struct breakpoin
        int retval = ERROR_FAIL;
        int brp_1 = 0;  /* holds the contextID pair */
        int brp_2 = 0;  /* holds the IVA pair */
-       uint32_t control_CTX, control_IVA;
-       uint8_t CTX_byte_addr_select = 0x0F;
-       uint8_t IVA_byte_addr_select = 0x0F;
-       uint8_t CTX_machmode = 0x03;
-       uint8_t IVA_machmode = 0x01;
+       uint32_t control_ctx, control_iva;
+       uint8_t ctx_byte_addr_select = 0x0F;
+       uint8_t iva_byte_addr_select = 0x0F;
+       uint8_t ctx_machmode = 0x03;
+       uint8_t iva_machmode = 0x01;
        struct aarch64_common *aarch64 = target_to_aarch64(target);
        struct armv8_common *armv8 = &aarch64->armv8_common;
        struct aarch64_brp *brp_list = aarch64->brp_list;
 
-       if (breakpoint->set) {
+       if (breakpoint->is_set) {
                LOG_WARNING("breakpoint already set");
                return retval;
        }
@@ -1416,7 +1407,7 @@ static int aarch64_set_hybrid_breakpoint(struct target *target, struct breakpoin
                (brp_list[brp_1].type != BRP_CONTEXT)) && (brp_1 < aarch64->brp_num))
                brp_1++;
 
-       printf("brp(CTX) found num: %d\n", brp_1);
+       LOG_DEBUG("brp(CTX) found num: %d", brp_1);
        if (brp_1 >= aarch64->brp_num) {
                LOG_ERROR("ERROR Can not find free Breakpoint Register Pair");
                return ERROR_FAIL;
@@ -1426,53 +1417,53 @@ static int aarch64_set_hybrid_breakpoint(struct target *target, struct breakpoin
                (brp_list[brp_2].type != BRP_NORMAL)) && (brp_2 < aarch64->brp_num))
                brp_2++;
 
-       printf("brp(IVA) found num: %d\n", brp_2);
+       LOG_DEBUG("brp(IVA) found num: %d", brp_2);
        if (brp_2 >= aarch64->brp_num) {
                LOG_ERROR("ERROR Can not find free Breakpoint Register Pair");
                return ERROR_FAIL;
        }
 
-       breakpoint->set = brp_1 + 1;
-       breakpoint->linked_BRP = brp_2;
-       control_CTX = ((CTX_machmode & 0x7) << 20)
+       breakpoint_hw_set(breakpoint, brp_1);
+       breakpoint->linked_brp = brp_2;
+       control_ctx = ((ctx_machmode & 0x7) << 20)
                | (brp_2 << 16)
                | (0 << 14)
-               | (CTX_byte_addr_select << 5)
+               | (ctx_byte_addr_select << 5)
                | (3 << 1) | 1;
        brp_list[brp_1].used = 1;
        brp_list[brp_1].value = (breakpoint->asid);
-       brp_list[brp_1].control = control_CTX;
+       brp_list[brp_1].control = control_ctx;
        retval = aarch64_dap_write_memap_register_u32(target, armv8->debug_base
-                       + CPUV8_DBG_BVR_BASE + 16 * brp_list[brp_1].BRPn,
+                       + CPUV8_DBG_BVR_BASE + 16 * brp_list[brp_1].brpn,
                        brp_list[brp_1].value);
        if (retval != ERROR_OK)
                return retval;
        retval = aarch64_dap_write_memap_register_u32(target, armv8->debug_base
-                       + CPUV8_DBG_BCR_BASE + 16 * brp_list[brp_1].BRPn,
+                       + CPUV8_DBG_BCR_BASE + 16 * brp_list[brp_1].brpn,
                        brp_list[brp_1].control);
        if (retval != ERROR_OK)
                return retval;
 
-       control_IVA = ((IVA_machmode & 0x7) << 20)
+       control_iva = ((iva_machmode & 0x7) << 20)
                | (brp_1 << 16)
                | (1 << 13)
-               | (IVA_byte_addr_select << 5)
+               | (iva_byte_addr_select << 5)
                | (3 << 1) | 1;
        brp_list[brp_2].used = 1;
        brp_list[brp_2].value = breakpoint->address & 0xFFFFFFFFFFFFFFFC;
-       brp_list[brp_2].control = control_IVA;
+       brp_list[brp_2].control = control_iva;
        retval = aarch64_dap_write_memap_register_u32(target, armv8->debug_base
-                       + CPUV8_DBG_BVR_BASE + 16 * brp_list[brp_2].BRPn,
+                       + CPUV8_DBG_BVR_BASE + 16 * brp_list[brp_2].brpn,
                        brp_list[brp_2].value & 0xFFFFFFFF);
        if (retval != ERROR_OK)
                return retval;
        retval = aarch64_dap_write_memap_register_u32(target, armv8->debug_base
-                       + CPUV8_DBG_BVR_BASE + 4 + 16 * brp_list[brp_2].BRPn,
+                       + CPUV8_DBG_BVR_BASE + 4 + 16 * brp_list[brp_2].brpn,
                        brp_list[brp_2].value >> 32);
        if (retval != ERROR_OK)
                return retval;
        retval = aarch64_dap_write_memap_register_u32(target, armv8->debug_base
-                       + CPUV8_DBG_BCR_BASE + 16 * brp_list[brp_2].BRPn,
+                       + CPUV8_DBG_BCR_BASE + 16 * brp_list[brp_2].brpn,
                        brp_list[brp_2].control);
        if (retval != ERROR_OK)
                return retval;
@@ -1487,16 +1478,16 @@ static int aarch64_unset_breakpoint(struct target *target, struct breakpoint *br
        struct armv8_common *armv8 = &aarch64->armv8_common;
        struct aarch64_brp *brp_list = aarch64->brp_list;
 
-       if (!breakpoint->set) {
+       if (!breakpoint->is_set) {
                LOG_WARNING("breakpoint not set");
                return ERROR_OK;
        }
 
        if (breakpoint->type == BKPT_HARD) {
                if ((breakpoint->address != 0) && (breakpoint->asid != 0)) {
-                       int brp_i = breakpoint->set - 1;
-                       int brp_j = breakpoint->linked_BRP;
-                       if ((brp_i < 0) || (brp_i >= aarch64->brp_num)) {
+                       int brp_i = breakpoint->number;
+                       int brp_j = breakpoint->linked_brp;
+                       if (brp_i >= aarch64->brp_num) {
                                LOG_DEBUG("Invalid BRP number in breakpoint");
                                return ERROR_OK;
                        }
@@ -1506,17 +1497,17 @@ static int aarch64_unset_breakpoint(struct target *target, struct breakpoint *br
                        brp_list[brp_i].value = 0;
                        brp_list[brp_i].control = 0;
                        retval = aarch64_dap_write_memap_register_u32(target, armv8->debug_base
-                                       + CPUV8_DBG_BCR_BASE + 16 * brp_list[brp_i].BRPn,
+                                       + CPUV8_DBG_BCR_BASE + 16 * brp_list[brp_i].brpn,
                                        brp_list[brp_i].control);
                        if (retval != ERROR_OK)
                                return retval;
                        retval = aarch64_dap_write_memap_register_u32(target, armv8->debug_base
-                                       + CPUV8_DBG_BVR_BASE + 16 * brp_list[brp_i].BRPn,
+                                       + CPUV8_DBG_BVR_BASE + 16 * brp_list[brp_i].brpn,
                                        (uint32_t)brp_list[brp_i].value);
                        if (retval != ERROR_OK)
                                return retval;
                        retval = aarch64_dap_write_memap_register_u32(target, armv8->debug_base
-                                       + CPUV8_DBG_BVR_BASE + 4 + 16 * brp_list[brp_i].BRPn,
+                                       + CPUV8_DBG_BVR_BASE + 4 + 16 * brp_list[brp_i].brpn,
                                        (uint32_t)brp_list[brp_i].value);
                        if (retval != ERROR_OK)
                                return retval;
@@ -1530,28 +1521,28 @@ static int aarch64_unset_breakpoint(struct target *target, struct breakpoint *br
                        brp_list[brp_j].value = 0;
                        brp_list[brp_j].control = 0;
                        retval = aarch64_dap_write_memap_register_u32(target, armv8->debug_base
-                                       + CPUV8_DBG_BCR_BASE + 16 * brp_list[brp_j].BRPn,
+                                       + CPUV8_DBG_BCR_BASE + 16 * brp_list[brp_j].brpn,
                                        brp_list[brp_j].control);
                        if (retval != ERROR_OK)
                                return retval;
                        retval = aarch64_dap_write_memap_register_u32(target, armv8->debug_base
-                                       + CPUV8_DBG_BVR_BASE + 16 * brp_list[brp_j].BRPn,
+                                       + CPUV8_DBG_BVR_BASE + 16 * brp_list[brp_j].brpn,
                                        (uint32_t)brp_list[brp_j].value);
                        if (retval != ERROR_OK)
                                return retval;
                        retval = aarch64_dap_write_memap_register_u32(target, armv8->debug_base
-                                       + CPUV8_DBG_BVR_BASE + 4 + 16 * brp_list[brp_j].BRPn,
+                                       + CPUV8_DBG_BVR_BASE + 4 + 16 * brp_list[brp_j].brpn,
                                        (uint32_t)brp_list[brp_j].value);
                        if (retval != ERROR_OK)
                                return retval;
 
-                       breakpoint->linked_BRP = 0;
-                       breakpoint->set = 0;
+                       breakpoint->linked_brp = 0;
+                       breakpoint->is_set = false;
                        return ERROR_OK;
 
                } else {
-                       int brp_i = breakpoint->set - 1;
-                       if ((brp_i < 0) || (brp_i >= aarch64->brp_num)) {
+                       int brp_i = breakpoint->number;
+                       if (brp_i >= aarch64->brp_num) {
                                LOG_DEBUG("Invalid BRP number in breakpoint");
                                return ERROR_OK;
                        }
@@ -1561,22 +1552,22 @@ static int aarch64_unset_breakpoint(struct target *target, struct breakpoint *br
                        brp_list[brp_i].value = 0;
                        brp_list[brp_i].control = 0;
                        retval = aarch64_dap_write_memap_register_u32(target, armv8->debug_base
-                                       + CPUV8_DBG_BCR_BASE + 16 * brp_list[brp_i].BRPn,
+                                       + CPUV8_DBG_BCR_BASE + 16 * brp_list[brp_i].brpn,
                                        brp_list[brp_i].control);
                        if (retval != ERROR_OK)
                                return retval;
                        retval = aarch64_dap_write_memap_register_u32(target, armv8->debug_base
-                                       + CPUV8_DBG_BVR_BASE + 16 * brp_list[brp_i].BRPn,
+                                       + CPUV8_DBG_BVR_BASE + 16 * brp_list[brp_i].brpn,
                                        brp_list[brp_i].value);
                        if (retval != ERROR_OK)
                                return retval;
 
                        retval = aarch64_dap_write_memap_register_u32(target, armv8->debug_base
-                                       + CPUV8_DBG_BVR_BASE + 4 + 16 * brp_list[brp_i].BRPn,
+                                       + CPUV8_DBG_BVR_BASE + 4 + 16 * brp_list[brp_i].brpn,
                                        (uint32_t)brp_list[brp_i].value);
                        if (retval != ERROR_OK)
                                return retval;
-                       breakpoint->set = 0;
+                       breakpoint->is_set = false;
                        return ERROR_OK;
                }
        } else {
@@ -1608,7 +1599,7 @@ static int aarch64_unset_breakpoint(struct target *target, struct breakpoint *br
                                breakpoint->address & 0xFFFFFFFFFFFFFFFE,
                                breakpoint->length);
        }
-       breakpoint->set = 0;
+       breakpoint->is_set = false;
 
        return ERROR_OK;
 }
@@ -1673,7 +1664,7 @@ static int aarch64_remove_breakpoint(struct target *target, struct breakpoint *b
        }
 #endif
 
-       if (breakpoint->set) {
+       if (breakpoint->is_set) {
                aarch64_unset_breakpoint(target, breakpoint);
                if (breakpoint->type == BKPT_HARD)
                        aarch64->brp_num_available++;
@@ -1693,7 +1684,7 @@ static int aarch64_set_watchpoint(struct target *target,
        struct armv8_common *armv8 = &aarch64->armv8_common;
        struct aarch64_brp *wp_list = aarch64->wp_list;
 
-       if (watchpoint->set) {
+       if (watchpoint->is_set) {
                LOG_WARNING("watchpoint already set");
                return ERROR_OK;
        }
@@ -1735,18 +1726,18 @@ static int aarch64_set_watchpoint(struct target *target,
        wp_list[wp_i].control = control;
 
        retval = aarch64_dap_write_memap_register_u32(target, armv8->debug_base
-                       + CPUV8_DBG_WVR_BASE + 16 * wp_list[wp_i].BRPn,
+                       + CPUV8_DBG_WVR_BASE + 16 * wp_list[wp_i].brpn,
                        (uint32_t)(wp_list[wp_i].value & 0xFFFFFFFF));
        if (retval != ERROR_OK)
                return retval;
        retval = aarch64_dap_write_memap_register_u32(target, armv8->debug_base
-                       + CPUV8_DBG_WVR_BASE + 4 + 16 * wp_list[wp_i].BRPn,
+                       + CPUV8_DBG_WVR_BASE + 4 + 16 * wp_list[wp_i].brpn,
                        (uint32_t)(wp_list[wp_i].value >> 32));
        if (retval != ERROR_OK)
                return retval;
 
        retval = aarch64_dap_write_memap_register_u32(target, armv8->debug_base
-                       + CPUV8_DBG_WCR_BASE + 16 * wp_list[wp_i].BRPn,
+                       + CPUV8_DBG_WCR_BASE + 16 * wp_list[wp_i].brpn,
                        control);
        if (retval != ERROR_OK)
                return retval;
@@ -1761,7 +1752,7 @@ static int aarch64_set_watchpoint(struct target *target,
        }
 
        wp_list[wp_i].used = 1;
-       watchpoint->set = wp_i + 1;
+       watchpoint_set(watchpoint, wp_i);
 
        return ERROR_OK;
 }
@@ -1770,18 +1761,18 @@ static int aarch64_set_watchpoint(struct target *target,
 static int aarch64_unset_watchpoint(struct target *target,
        struct watchpoint *watchpoint)
 {
-       int retval, wp_i;
+       int retval;
        struct aarch64_common *aarch64 = target_to_aarch64(target);
        struct armv8_common *armv8 = &aarch64->armv8_common;
        struct aarch64_brp *wp_list = aarch64->wp_list;
 
-       if (!watchpoint->set) {
+       if (!watchpoint->is_set) {
                LOG_WARNING("watchpoint not set");
                return ERROR_OK;
        }
 
-       wp_i = watchpoint->set - 1;
-       if ((wp_i < 0) || (wp_i >= aarch64->wp_num)) {
+       int wp_i = watchpoint->number;
+       if (wp_i >= aarch64->wp_num) {
                LOG_DEBUG("Invalid WP number in watchpoint");
                return ERROR_OK;
        }
@@ -1791,22 +1782,22 @@ static int aarch64_unset_watchpoint(struct target *target,
        wp_list[wp_i].value = 0;
        wp_list[wp_i].control = 0;
        retval = aarch64_dap_write_memap_register_u32(target, armv8->debug_base
-                       + CPUV8_DBG_WCR_BASE + 16 * wp_list[wp_i].BRPn,
+                       + CPUV8_DBG_WCR_BASE + 16 * wp_list[wp_i].brpn,
                        wp_list[wp_i].control);
        if (retval != ERROR_OK)
                return retval;
        retval = aarch64_dap_write_memap_register_u32(target, armv8->debug_base
-                       + CPUV8_DBG_WVR_BASE + 16 * wp_list[wp_i].BRPn,
+                       + CPUV8_DBG_WVR_BASE + 16 * wp_list[wp_i].brpn,
                        wp_list[wp_i].value);
        if (retval != ERROR_OK)
                return retval;
 
        retval = aarch64_dap_write_memap_register_u32(target, armv8->debug_base
-                       + CPUV8_DBG_WVR_BASE + 4 + 16 * wp_list[wp_i].BRPn,
+                       + CPUV8_DBG_WVR_BASE + 4 + 16 * wp_list[wp_i].brpn,
                        (uint32_t)wp_list[wp_i].value);
        if (retval != ERROR_OK)
                return retval;
-       watchpoint->set = 0;
+       watchpoint->is_set = false;
 
        return ERROR_OK;
 }
@@ -1834,7 +1825,7 @@ static int aarch64_remove_watchpoint(struct target *target,
 {
        struct aarch64_common *aarch64 = target_to_aarch64(target);
 
-       if (watchpoint->set) {
+       if (watchpoint->is_set) {
                aarch64_unset_watchpoint(target, watchpoint);
                aarch64->wp_num_available++;
        }
@@ -1846,7 +1837,7 @@ static int aarch64_remove_watchpoint(struct target *target,
  * find out which watchpoint hits
  * get exception address and compare the address to watchpoints
  */
-int aarch64_hit_watchpoint(struct target *target,
+static int aarch64_hit_watchpoint(struct target *target,
        struct watchpoint **hit_watchpoint)
 {
        if (target->debug_reason != DBG_REASON_WATCHPOINT)
@@ -1939,7 +1930,7 @@ static int aarch64_assert_reset(struct target *target)
        else if (reset_config & RESET_HAS_SRST) {
                bool srst_asserted = false;
 
-               if (target->reset_halt) {
+               if (target->reset_halt && !(reset_config & RESET_SRST_PULLS_TRST)) {
                        if (target_was_examined(target)) {
 
                                if (reset_config & RESET_SRST_NO_GATING) {
@@ -1949,12 +1940,12 @@ static int aarch64_assert_reset(struct target *target)
                                         */
                                        adapter_assert_reset();
                                        srst_asserted = true;
-
-                                       /* make sure to clear all sticky errors */
-                                       mem_ap_write_atomic_u32(armv8->debug_ap,
-                                                       armv8->debug_base + CPUV8_DBG_DRCR, DRCR_CSE);
                                }
 
+                               /* make sure to clear all sticky errors */
+                               mem_ap_write_atomic_u32(armv8->debug_ap,
+                                               armv8->debug_base + CPUV8_DBG_DRCR, DRCR_CSE);
+
                                /* set up Reset Catch debug event to halt the CPU after reset */
                                retval = aarch64_enable_reset_catch(target, true);
                                if (retval != ERROR_OK)
@@ -2023,9 +2014,13 @@ static int aarch64_deassert_reset(struct target *target)
                if (target->state != TARGET_HALTED) {
                        LOG_WARNING("%s: ran after reset and before halt ...",
                                target_name(target));
-                       retval = target_halt(target);
-                       if (retval != ERROR_OK)
-                               return retval;
+                       if (target_was_examined(target)) {
+                               retval = aarch64_halt_one(target, HALT_LAZY);
+                               if (retval != ERROR_OK)
+                                       return retval;
+                       } else {
+                               target->state = TARGET_UNKNOWN;
+                       }
                }
        }
 
@@ -2548,18 +2543,27 @@ static int aarch64_examine_first(struct target *target)
        uint32_t tmp0, tmp1, tmp2, tmp3;
        debug = ttypr = cpuid = 0;
 
-       if (pc == NULL)
+       if (!pc)
                return ERROR_FAIL;
 
+       if (armv8->debug_ap) {
+               dap_put_ap(armv8->debug_ap);
+               armv8->debug_ap = NULL;
+       }
+
        if (pc->adiv5_config.ap_num == DP_APSEL_INVALID) {
                /* Search for the APB-AB */
-               retval = dap_find_ap(swjdp, AP_TYPE_APB_AP, &armv8->debug_ap);
+               retval = dap_find_get_ap(swjdp, AP_TYPE_APB_AP, &armv8->debug_ap);
                if (retval != ERROR_OK) {
                        LOG_ERROR("Could not find APB-AP for debug access");
                        return retval;
                }
        } else {
-               armv8->debug_ap = dap_ap(swjdp, pc->adiv5_config.ap_num);
+               armv8->debug_ap = dap_get_ap(swjdp, pc->adiv5_config.ap_num);
+               if (!armv8->debug_ap) {
+                       LOG_ERROR("Cannot get AP");
+                       return ERROR_FAIL;
+               }
        }
 
        retval = mem_ap_init(armv8->debug_ap);
@@ -2571,20 +2575,13 @@ static int aarch64_examine_first(struct target *target)
        armv8->debug_ap->memaccess_tck = 10;
 
        if (!target->dbgbase_set) {
-               uint32_t dbgbase;
-               /* Get ROM Table base */
-               uint32_t apid;
-               int32_t coreidx = target->coreid;
-               retval = dap_get_debugbase(armv8->debug_ap, &dbgbase, &apid);
-               if (retval != ERROR_OK)
-                       return retval;
-               /* Lookup 0x15 -- Processor DAP */
-               retval = dap_lookup_cs_component(armv8->debug_ap, dbgbase, 0x15,
-                               &armv8->debug_base, &coreidx);
+               /* Lookup Processor DAP */
+               retval = dap_lookup_cs_component(armv8->debug_ap, ARM_CS_C9_DEVTYPE_CORE_DEBUG,
+                               &armv8->debug_base, target->coreid);
                if (retval != ERROR_OK)
                        return retval;
-               LOG_DEBUG("Detected core %" PRId32 " dbgbase: %08" PRIx32
-                               " apid: %08" PRIx32, coreidx, armv8->debug_base, apid);
+               LOG_DEBUG("Detected core %" PRId32 " dbgbase: " TARGET_ADDR_FMT,
+                               target->coreid, armv8->debug_base);
        } else
                armv8->debug_base = target->dbgbase;
 
@@ -2634,8 +2631,10 @@ static int aarch64_examine_first(struct target *target)
        LOG_DEBUG("ttypr = 0x%08" PRIx64, ttypr);
        LOG_DEBUG("debug = 0x%08" PRIx64, debug);
 
-       if (pc->cti == NULL)
+       if (!pc->cti) {
+               LOG_TARGET_ERROR(target, "CTI not specified");
                return ERROR_FAIL;
+       }
 
        armv8->cti = pc->cti;
 
@@ -2656,7 +2655,7 @@ static int aarch64_examine_first(struct target *target)
                        aarch64->brp_list[i].type = BRP_CONTEXT;
                aarch64->brp_list[i].value = 0;
                aarch64->brp_list[i].control = 0;
-               aarch64->brp_list[i].BRPn = i;
+               aarch64->brp_list[i].brpn = i;
        }
 
        /* Setup Watchpoint Register Pairs */
@@ -2668,7 +2667,7 @@ static int aarch64_examine_first(struct target *target)
                aarch64->wp_list[i].type = BRP_NORMAL;
                aarch64->wp_list[i].value = 0;
                aarch64->wp_list[i].control = 0;
-               aarch64->wp_list[i].BRPn = i;
+               aarch64->wp_list[i].brpn = i;
        }
 
        LOG_DEBUG("Configured %i hw breakpoints, %i watchpoints",
@@ -2739,7 +2738,7 @@ static int aarch64_target_create(struct target *target, Jim_Interp *interp)
                return ERROR_FAIL;
 
        aarch64 = calloc(1, sizeof(struct aarch64_common));
-       if (aarch64 == NULL) {
+       if (!aarch64) {
                LOG_ERROR("Out of memory");
                return ERROR_FAIL;
        }
@@ -2753,6 +2752,9 @@ static void aarch64_deinit_target(struct target *target)
        struct armv8_common *armv8 = &aarch64->armv8_common;
        struct arm_dpm *dpm = &armv8->dpm;
 
+       if (armv8->debug_ap)
+               dap_put_ap(armv8->debug_ap);
+
        armv8_free_reg_cache(target);
        free(aarch64->brp_list);
        free(dpm->dbp);
@@ -2785,19 +2787,19 @@ enum aarch64_cfg_param {
        CFG_CTI,
 };
 
-static const Jim_Nvp nvp_config_opts[] = {
+static const struct jim_nvp nvp_config_opts[] = {
        { .name = "-cti", .value = CFG_CTI },
        { .name = NULL, .value = -1 }
 };
 
-static int aarch64_jim_configure(struct target *target, Jim_GetOptInfo *goi)
+static int aarch64_jim_configure(struct target *target, struct jim_getopt_info *goi)
 {
        struct aarch64_private_config *pc;
-       Jim_Nvp *n;
+       struct jim_nvp *n;
        int e;
 
        pc = (struct aarch64_private_config *)target->private_config;
-       if (pc == NULL) {
+       if (!pc) {
                        pc = calloc(1, sizeof(struct aarch64_private_config));
                        pc->adiv5_config.ap_num = DP_APSEL_INVALID;
                        target->private_config = pc;
@@ -2824,12 +2826,12 @@ static int aarch64_jim_configure(struct target *target, Jim_GetOptInfo *goi)
                Jim_SetEmptyResult(goi->interp);
 
                /* check first if topmost item is for us */
-               e = Jim_Nvp_name2value_obj(goi->interp, nvp_config_opts,
+               e = jim_nvp_name2value_obj(goi->interp, nvp_config_opts,
                                goi->argv[0], &n);
                if (e != JIM_OK)
                        return JIM_CONTINUE;
 
-               e = Jim_GetOpt_Obj(goi, NULL);
+               e = jim_getopt_obj(goi, NULL);
                if (e != JIM_OK)
                        return e;
 
@@ -2838,11 +2840,11 @@ static int aarch64_jim_configure(struct target *target, Jim_GetOptInfo *goi)
                        if (goi->isconfigure) {
                                Jim_Obj *o_cti;
                                struct arm_cti *cti;
-                               e = Jim_GetOpt_Obj(goi, &o_cti);
+                               e = jim_getopt_obj(goi, &o_cti);
                                if (e != JIM_OK)
                                        return e;
                                cti = cti_instance_by_jim_obj(goi->interp, o_cti);
-                               if (cti == NULL) {
+                               if (!cti) {
                                        Jim_SetResultString(goi->interp, "CTI name invalid!", -1);
                                        return JIM_ERR;
                                }
@@ -2855,7 +2857,7 @@ static int aarch64_jim_configure(struct target *target, Jim_GetOptInfo *goi)
                                        return JIM_ERR;
                                }
 
-                               if (pc == NULL || pc->cti == NULL) {
+                               if (!pc || !pc->cti) {
                                        Jim_SetResultString(goi->interp, "CTI not configured", -1);
                                        return JIM_ERR;
                                }
@@ -2896,7 +2898,7 @@ COMMAND_HANDLER(aarch64_handle_disassemble_command)
 {
        struct target *target = get_current_target(CMD_CTX);
 
-       if (target == NULL) {
+       if (!target) {
                LOG_ERROR("No target selected");
                return ERROR_FAIL;
        }
@@ -2930,16 +2932,16 @@ COMMAND_HANDLER(aarch64_mask_interrupts_command)
        struct target *target = get_current_target(CMD_CTX);
        struct aarch64_common *aarch64 = target_to_aarch64(target);
 
-       static const Jim_Nvp nvp_maskisr_modes[] = {
+       static const struct jim_nvp nvp_maskisr_modes[] = {
                { .name = "off", .value = AARCH64_ISRMASK_OFF },
                { .name = "on", .value = AARCH64_ISRMASK_ON },
                { .name = NULL, .value = -1 },
        };
-       const Jim_Nvp *n;
+       const struct jim_nvp *n;
 
        if (CMD_ARGC > 0) {
-               n = Jim_Nvp_name2value_simple(nvp_maskisr_modes, CMD_ARGV[0]);
-               if (n->name == NULL) {
+               n = jim_nvp_name2value_simple(nvp_maskisr_modes, CMD_ARGV[0]);
+               if (!n->name) {
                        LOG_ERROR("Unknown parameter: %s - should be off or on", CMD_ARGV[0]);
                        return ERROR_COMMAND_SYNTAX_ERROR;
                }
@@ -2947,7 +2949,7 @@ COMMAND_HANDLER(aarch64_mask_interrupts_command)
                aarch64->isrmasking_mode = n->value;
        }
 
-       n = Jim_Nvp_value2name_simple(nvp_maskisr_modes, aarch64->isrmasking_mode);
+       n = jim_nvp_value2name_simple(nvp_maskisr_modes, aarch64->isrmasking_mode);
        command_print(CMD, "aarch64 interrupt mask %s", n->name);
 
        return ERROR_OK;
@@ -2971,10 +2973,10 @@ static int jim_mcrmrc(Jim_Interp *interp, int argc, Jim_Obj * const *argv)
        }
 
        context = current_command_context(interp);
-       assert(context != NULL);
+       assert(context);
 
        target = get_current_target(context);
-       if (target == NULL) {
+       if (!target) {
                LOG_ERROR("%s: no current target", __func__);
                return JIM_ERR;
        }
@@ -3005,8 +3007,8 @@ static int jim_mcrmrc(Jim_Interp *interp, int argc, Jim_Obj * const *argv)
        int cpnum;
        uint32_t op1;
        uint32_t op2;
-       uint32_t CRn;
-       uint32_t CRm;
+       uint32_t crn;
+       uint32_t crm;
        uint32_t value;
        long l;
 
@@ -3043,7 +3045,7 @@ static int jim_mcrmrc(Jim_Interp *interp, int argc, Jim_Obj * const *argv)
                        "CRn", (int) l);
                return JIM_ERR;
        }
-       CRn = l;
+       crn = l;
 
        retval = Jim_GetLong(interp, argv[4], &l);
        if (retval != JIM_OK)
@@ -3053,7 +3055,7 @@ static int jim_mcrmrc(Jim_Interp *interp, int argc, Jim_Obj * const *argv)
                        "CRm", (int) l);
                return JIM_ERR;
        }
-       CRm = l;
+       crm = l;
 
        retval = Jim_GetLong(interp, argv[5], &l);
        if (retval != JIM_OK)
@@ -3074,14 +3076,14 @@ static int jim_mcrmrc(Jim_Interp *interp, int argc, Jim_Obj * const *argv)
                value = l;
 
                /* NOTE: parameters reordered! */
-               /* ARMV4_5_MCR(cpnum, op1, 0, CRn, CRm, op2) */
-               retval = arm->mcr(target, cpnum, op1, op2, CRn, CRm, value);
+               /* ARMV4_5_MCR(cpnum, op1, 0, crn, crm, op2) */
+               retval = arm->mcr(target, cpnum, op1, op2, crn, crm, value);
                if (retval != ERROR_OK)
                        return JIM_ERR;
        } else {
                /* NOTE: parameters reordered! */
-               /* ARMV4_5_MRC(cpnum, op1, 0, CRn, CRm, op2) */
-               retval = arm->mrc(target, cpnum, op1, op2, CRn, CRm, &value);
+               /* ARMV4_5_MRC(cpnum, op1, 0, crn, crm, op2) */
+               retval = arm->mrc(target, cpnum, op1, op2, crn, crm, &value);
                if (retval != ERROR_OK)
                        return JIM_ERR;
 
@@ -3142,8 +3144,6 @@ static const struct command_registration aarch64_exec_command_handlers[] = {
        COMMAND_REGISTRATION_DONE
 };
 
-extern const struct command_registration semihosting_common_handlers[];
-
 static const struct command_registration aarch64_command_handlers[] = {
        {
                .name = "arm",