+// SPDX-License-Identifier: GPL-2.0-or-later
+
/***************************************************************************
* Copyright (C) 2011 by Julius Baxter *
* julius@opencores.org *
* Copyright (C) 2013 by Franck Jullien *
* elec4fun@gmail.com *
* *
- * *
- * 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., *
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#ifdef HAVE_CONFIG_H
#include <target/target.h>
#include <target/breakpoints.h>
#include <target/target_type.h>
+#include <helper/time_support.h>
#include <helper/fileio.h>
#include "or1k_tap.h"
#include "or1k.h"
static struct or1k_core_reg *or1k_core_reg_list_arch_info;
-struct or1k_core_reg_init or1k_init_reg_list[] = {
- {"r0" , GROUP0 + 1024, "org.gnu.gdb.or1k.group0", NULL},
- {"r1" , GROUP0 + 1025, "org.gnu.gdb.or1k.group0", NULL},
- {"r2" , GROUP0 + 1026, "org.gnu.gdb.or1k.group0", NULL},
- {"r3" , GROUP0 + 1027, "org.gnu.gdb.or1k.group0", NULL},
- {"r4" , GROUP0 + 1028, "org.gnu.gdb.or1k.group0", NULL},
- {"r5" , GROUP0 + 1029, "org.gnu.gdb.or1k.group0", NULL},
- {"r6" , GROUP0 + 1030, "org.gnu.gdb.or1k.group0", NULL},
- {"r7" , GROUP0 + 1031, "org.gnu.gdb.or1k.group0", NULL},
- {"r8" , GROUP0 + 1032, "org.gnu.gdb.or1k.group0", NULL},
- {"r9" , GROUP0 + 1033, "org.gnu.gdb.or1k.group0", NULL},
- {"r10" , GROUP0 + 1034, "org.gnu.gdb.or1k.group0", NULL},
- {"r11" , GROUP0 + 1035, "org.gnu.gdb.or1k.group0", NULL},
- {"r12" , GROUP0 + 1036, "org.gnu.gdb.or1k.group0", NULL},
- {"r13" , GROUP0 + 1037, "org.gnu.gdb.or1k.group0", NULL},
- {"r14" , GROUP0 + 1038, "org.gnu.gdb.or1k.group0", NULL},
- {"r15" , GROUP0 + 1039, "org.gnu.gdb.or1k.group0", NULL},
- {"r16" , GROUP0 + 1040, "org.gnu.gdb.or1k.group0", NULL},
- {"r17" , GROUP0 + 1041, "org.gnu.gdb.or1k.group0", NULL},
- {"r18" , GROUP0 + 1042, "org.gnu.gdb.or1k.group0", NULL},
- {"r19" , GROUP0 + 1043, "org.gnu.gdb.or1k.group0", NULL},
- {"r20" , GROUP0 + 1044, "org.gnu.gdb.or1k.group0", NULL},
- {"r21" , GROUP0 + 1045, "org.gnu.gdb.or1k.group0", NULL},
- {"r22" , GROUP0 + 1046, "org.gnu.gdb.or1k.group0", NULL},
- {"r23" , GROUP0 + 1047, "org.gnu.gdb.or1k.group0", NULL},
- {"r24" , GROUP0 + 1048, "org.gnu.gdb.or1k.group0", NULL},
- {"r25" , GROUP0 + 1049, "org.gnu.gdb.or1k.group0", NULL},
- {"r26" , GROUP0 + 1050, "org.gnu.gdb.or1k.group0", NULL},
- {"r27" , GROUP0 + 1051, "org.gnu.gdb.or1k.group0", NULL},
- {"r28" , GROUP0 + 1052, "org.gnu.gdb.or1k.group0", NULL},
- {"r29" , GROUP0 + 1053, "org.gnu.gdb.or1k.group0", NULL},
- {"r30" , GROUP0 + 1054, "org.gnu.gdb.or1k.group0", NULL},
- {"r31" , GROUP0 + 1055, "org.gnu.gdb.or1k.group0", NULL},
- {"ppc" , GROUP0 + 18, "org.gnu.gdb.or1k.group0", NULL},
- {"npc" , GROUP0 + 16, "org.gnu.gdb.or1k.group0", NULL},
- {"sr" , GROUP0 + 17, "org.gnu.gdb.or1k.group0", NULL},
- {"vr" , GROUP0 + 0, "org.gnu.gdb.or1k.group0", "system"},
- {"upr" , GROUP0 + 1, "org.gnu.gdb.or1k.group0", "system"},
- {"cpucfgr" , GROUP0 + 2, "org.gnu.gdb.or1k.group0", "system"},
- {"dmmucfgr" , GROUP0 + 3, "org.gnu.gdb.or1k.group0", "system"},
- {"immucfgr" , GROUP0 + 4, "org.gnu.gdb.or1k.group0", "system"},
- {"dccfgr" , GROUP0 + 5, "org.gnu.gdb.or1k.group0", "system"},
- {"iccfgr" , GROUP0 + 6, "org.gnu.gdb.or1k.group0", "system"},
- {"dcfgr" , GROUP0 + 7, "org.gnu.gdb.or1k.group0", "system"},
- {"pccfgr" , GROUP0 + 8, "org.gnu.gdb.or1k.group0", "system"},
- {"fpcsr" , GROUP0 + 20, "org.gnu.gdb.or1k.group0", "system"},
- {"epcr0" , GROUP0 + 32, "org.gnu.gdb.or1k.group0", "system"},
- {"epcr1" , GROUP0 + 33, "org.gnu.gdb.or1k.group0", "system"},
- {"epcr2" , GROUP0 + 34, "org.gnu.gdb.or1k.group0", "system"},
- {"epcr3" , GROUP0 + 35, "org.gnu.gdb.or1k.group0", "system"},
- {"epcr4" , GROUP0 + 36, "org.gnu.gdb.or1k.group0", "system"},
- {"epcr5" , GROUP0 + 37, "org.gnu.gdb.or1k.group0", "system"},
- {"epcr6" , GROUP0 + 38, "org.gnu.gdb.or1k.group0", "system"},
- {"epcr7" , GROUP0 + 39, "org.gnu.gdb.or1k.group0", "system"},
- {"epcr8" , GROUP0 + 40, "org.gnu.gdb.or1k.group0", "system"},
- {"epcr9" , GROUP0 + 41, "org.gnu.gdb.or1k.group0", "system"},
- {"epcr10" , GROUP0 + 42, "org.gnu.gdb.or1k.group0", "system"},
- {"epcr11" , GROUP0 + 43, "org.gnu.gdb.or1k.group0", "system"},
- {"epcr12" , GROUP0 + 44, "org.gnu.gdb.or1k.group0", "system"},
- {"epcr13" , GROUP0 + 45, "org.gnu.gdb.or1k.group0", "system"},
- {"epcr14" , GROUP0 + 46, "org.gnu.gdb.or1k.group0", "system"},
- {"epcr15" , GROUP0 + 47, "org.gnu.gdb.or1k.group0", "system"},
- {"eear0" , GROUP0 + 48, "org.gnu.gdb.or1k.group0", "system"},
- {"eear1" , GROUP0 + 49, "org.gnu.gdb.or1k.group0", "system"},
- {"eear2" , GROUP0 + 50, "org.gnu.gdb.or1k.group0", "system"},
- {"eear3" , GROUP0 + 51, "org.gnu.gdb.or1k.group0", "system"},
- {"eear4" , GROUP0 + 52, "org.gnu.gdb.or1k.group0", "system"},
- {"eear5" , GROUP0 + 53, "org.gnu.gdb.or1k.group0", "system"},
- {"eear6" , GROUP0 + 54, "org.gnu.gdb.or1k.group0", "system"},
- {"eear7" , GROUP0 + 55, "org.gnu.gdb.or1k.group0", "system"},
- {"eear8" , GROUP0 + 56, "org.gnu.gdb.or1k.group0", "system"},
- {"eear9" , GROUP0 + 57, "org.gnu.gdb.or1k.group0", "system"},
- {"eear10" , GROUP0 + 58, "org.gnu.gdb.or1k.group0", "system"},
- {"eear11" , GROUP0 + 59, "org.gnu.gdb.or1k.group0", "system"},
- {"eear12" , GROUP0 + 60, "org.gnu.gdb.or1k.group0", "system"},
- {"eear13" , GROUP0 + 61, "org.gnu.gdb.or1k.group0", "system"},
- {"eear14" , GROUP0 + 62, "org.gnu.gdb.or1k.group0", "system"},
- {"eear15" , GROUP0 + 63, "org.gnu.gdb.or1k.group0", "system"},
- {"esr0" , GROUP0 + 64, "org.gnu.gdb.or1k.group0", "system"},
- {"esr1" , GROUP0 + 65, "org.gnu.gdb.or1k.group0", "system"},
- {"esr2" , GROUP0 + 66, "org.gnu.gdb.or1k.group0", "system"},
- {"esr3" , GROUP0 + 67, "org.gnu.gdb.or1k.group0", "system"},
- {"esr4" , GROUP0 + 68, "org.gnu.gdb.or1k.group0", "system"},
- {"esr5" , GROUP0 + 69, "org.gnu.gdb.or1k.group0", "system"},
- {"esr6" , GROUP0 + 70, "org.gnu.gdb.or1k.group0", "system"},
- {"esr7" , GROUP0 + 71, "org.gnu.gdb.or1k.group0", "system"},
- {"esr8" , GROUP0 + 72, "org.gnu.gdb.or1k.group0", "system"},
- {"esr9" , GROUP0 + 73, "org.gnu.gdb.or1k.group0", "system"},
- {"esr10" , GROUP0 + 74, "org.gnu.gdb.or1k.group0", "system"},
- {"esr11" , GROUP0 + 75, "org.gnu.gdb.or1k.group0", "system"},
- {"esr12" , GROUP0 + 76, "org.gnu.gdb.or1k.group0", "system"},
- {"esr13" , GROUP0 + 77, "org.gnu.gdb.or1k.group0", "system"},
- {"esr14" , GROUP0 + 78, "org.gnu.gdb.or1k.group0", "system"},
- {"esr15" , GROUP0 + 79, "org.gnu.gdb.or1k.group0", "system"},
-
- {"dmmuucr" , GROUP1 + 0, "org.gnu.gdb.or1k.group1", "dmmu"},
- {"dmmuupr" , GROUP1 + 1, "org.gnu.gdb.or1k.group1", "dmmu"},
- {"dtlbeir" , GROUP1 + 2, "org.gnu.gdb.or1k.group1", "dmmu"},
- {"datbmr0" , GROUP1 + 4, "org.gnu.gdb.or1k.group1", "dmmu"},
- {"datbmr1" , GROUP1 + 5, "org.gnu.gdb.or1k.group1", "dmmu"},
- {"datbmr2" , GROUP1 + 6, "org.gnu.gdb.or1k.group1", "dmmu"},
- {"datbmr3" , GROUP1 + 7, "org.gnu.gdb.or1k.group1", "dmmu"},
- {"datbtr0" , GROUP1 + 8, "org.gnu.gdb.or1k.group1", "dmmu"},
- {"datbtr1" , GROUP1 + 9, "org.gnu.gdb.or1k.group1", "dmmu"},
- {"datbtr2" , GROUP1 + 10, "org.gnu.gdb.or1k.group1", "dmmu"},
- {"datbtr3" , GROUP1 + 11, "org.gnu.gdb.or1k.group1", "dmmu"},
-
- {"immucr" , GROUP2 + 0, "org.gnu.gdb.or1k.group2", "immu"},
- {"immupr" , GROUP2 + 1, "org.gnu.gdb.or1k.group2", "immu"},
- {"itlbeir" , GROUP2 + 2, "org.gnu.gdb.or1k.group2", "immu"},
- {"iatbmr0" , GROUP2 + 4, "org.gnu.gdb.or1k.group2", "immu"},
- {"iatbmr1" , GROUP2 + 5, "org.gnu.gdb.or1k.group2", "immu"},
- {"iatbmr2" , GROUP2 + 6, "org.gnu.gdb.or1k.group2", "immu"},
- {"iatbmr3" , GROUP2 + 7, "org.gnu.gdb.or1k.group2", "immu"},
- {"iatbtr0" , GROUP2 + 8, "org.gnu.gdb.or1k.group2", "immu"},
- {"iatbtr1" , GROUP2 + 9, "org.gnu.gdb.or1k.group2", "immu"},
- {"iatbtr2" , GROUP2 + 10, "org.gnu.gdb.or1k.group2", "immu"},
- {"iatbtr3" , GROUP2 + 11, "org.gnu.gdb.or1k.group2", "immu"},
-
- {"dccr" , GROUP3 + 0, "org.gnu.gdb.or1k.group3", "dcache"},
- {"dcbpr" , GROUP3 + 1, "org.gnu.gdb.or1k.group3", "dcache"},
- {"dcbfr" , GROUP3 + 2, "org.gnu.gdb.or1k.group3", "dcache"},
- {"dcbir" , GROUP3 + 3, "org.gnu.gdb.or1k.group3", "dcache"},
- {"dcbwr" , GROUP3 + 4, "org.gnu.gdb.or1k.group3", "dcache"},
- {"dcblr" , GROUP3 + 5, "org.gnu.gdb.or1k.group3", "dcache"},
-
- {"iccr" , GROUP4 + 0, "org.gnu.gdb.or1k.group4", "icache"},
- {"icbpr" , GROUP4 + 1, "org.gnu.gdb.or1k.group4", "icache"},
- {"icbir" , GROUP4 + 2, "org.gnu.gdb.or1k.group4", "icache"},
- {"icblr" , GROUP4 + 3, "org.gnu.gdb.or1k.group4", "icache"},
-
- {"maclo" , GROUP5 + 0, "org.gnu.gdb.or1k.group5", "mac"},
- {"machi" , GROUP5 + 1, "org.gnu.gdb.or1k.group5", "mac"},
-
- {"dvr0" , GROUP6 + 0, "org.gnu.gdb.or1k.group6", "debug"},
- {"dvr1" , GROUP6 + 1, "org.gnu.gdb.or1k.group6", "debug"},
- {"dvr2" , GROUP6 + 2, "org.gnu.gdb.or1k.group6", "debug"},
- {"dvr3" , GROUP6 + 3, "org.gnu.gdb.or1k.group6", "debug"},
- {"dvr4" , GROUP6 + 4, "org.gnu.gdb.or1k.group6", "debug"},
- {"dvr5" , GROUP6 + 5, "org.gnu.gdb.or1k.group6", "debug"},
- {"dvr6" , GROUP6 + 6, "org.gnu.gdb.or1k.group6", "debug"},
- {"dvr7" , GROUP6 + 7, "org.gnu.gdb.or1k.group6", "debug"},
- {"dcr0" , GROUP6 + 8, "org.gnu.gdb.or1k.group6", "debug"},
- {"dcr1" , GROUP6 + 9, "org.gnu.gdb.or1k.group6", "debug"},
- {"dcr2" , GROUP6 + 10, "org.gnu.gdb.or1k.group6", "debug"},
- {"dcr3" , GROUP6 + 11, "org.gnu.gdb.or1k.group6", "debug"},
- {"dcr4" , GROUP6 + 12, "org.gnu.gdb.or1k.group6", "debug"},
- {"dcr5" , GROUP6 + 13, "org.gnu.gdb.or1k.group6", "debug"},
- {"dcr6" , GROUP6 + 14, "org.gnu.gdb.or1k.group6", "debug"},
- {"dcr7" , GROUP6 + 15, "org.gnu.gdb.or1k.group6", "debug"},
- {"dmr1" , GROUP6 + 16, "org.gnu.gdb.or1k.group6", "debug"},
- {"dmr2" , GROUP6 + 17, "org.gnu.gdb.or1k.group6", "debug"},
- {"dcwr0" , GROUP6 + 18, "org.gnu.gdb.or1k.group6", "debug"},
- {"dcwr1" , GROUP6 + 19, "org.gnu.gdb.or1k.group6", "debug"},
- {"dsr" , GROUP6 + 20, "org.gnu.gdb.or1k.group6", "debug"},
- {"drr" , GROUP6 + 21, "org.gnu.gdb.or1k.group6", "debug"},
-
- {"pccr0" , GROUP7 + 0, "org.gnu.gdb.or1k.group7", "perf"},
- {"pccr1" , GROUP7 + 1, "org.gnu.gdb.or1k.group7", "perf"},
- {"pccr2" , GROUP7 + 2, "org.gnu.gdb.or1k.group7", "perf"},
- {"pccr3" , GROUP7 + 3, "org.gnu.gdb.or1k.group7", "perf"},
- {"pccr4" , GROUP7 + 4, "org.gnu.gdb.or1k.group7", "perf"},
- {"pccr5" , GROUP7 + 5, "org.gnu.gdb.or1k.group7", "perf"},
- {"pccr6" , GROUP7 + 6, "org.gnu.gdb.or1k.group7", "perf"},
- {"pccr7" , GROUP7 + 7, "org.gnu.gdb.or1k.group7", "perf"},
- {"pcmr0" , GROUP7 + 8, "org.gnu.gdb.or1k.group7", "perf"},
- {"pcmr1" , GROUP7 + 9, "org.gnu.gdb.or1k.group7", "perf"},
- {"pcmr2" , GROUP7 + 10, "org.gnu.gdb.or1k.group7", "perf"},
- {"pcmr3" , GROUP7 + 11, "org.gnu.gdb.or1k.group7", "perf"},
- {"pcmr4" , GROUP7 + 12, "org.gnu.gdb.or1k.group7", "perf"},
- {"pcmr5" , GROUP7 + 13, "org.gnu.gdb.or1k.group7", "perf"},
- {"pcmr6" , GROUP7 + 14, "org.gnu.gdb.or1k.group7", "perf"},
- {"pcmr7" , GROUP7 + 15, "org.gnu.gdb.or1k.group7", "perf"},
-
- {"pmr" , GROUP8 + 0, "org.gnu.gdb.or1k.group8", "power"},
-
- {"picmr" , GROUP9 + 0, "org.gnu.gdb.or1k.group9", "pic"},
- {"picsr" , GROUP9 + 2, "org.gnu.gdb.or1k.group9", "pic"},
-
- {"ttmr" , GROUP10 + 0, "org.gnu.gdb.or1k.group10", "timer"},
- {"ttcr" , GROUP10 + 1, "org.gnu.gdb.or1k.group10", "timer"},
+static const struct or1k_core_reg_init or1k_init_reg_list[] = {
+ {"r0", GROUP0 + 1024, "org.gnu.gdb.or1k.group0", NULL},
+ {"r1", GROUP0 + 1025, "org.gnu.gdb.or1k.group0", NULL},
+ {"r2", GROUP0 + 1026, "org.gnu.gdb.or1k.group0", NULL},
+ {"r3", GROUP0 + 1027, "org.gnu.gdb.or1k.group0", NULL},
+ {"r4", GROUP0 + 1028, "org.gnu.gdb.or1k.group0", NULL},
+ {"r5", GROUP0 + 1029, "org.gnu.gdb.or1k.group0", NULL},
+ {"r6", GROUP0 + 1030, "org.gnu.gdb.or1k.group0", NULL},
+ {"r7", GROUP0 + 1031, "org.gnu.gdb.or1k.group0", NULL},
+ {"r8", GROUP0 + 1032, "org.gnu.gdb.or1k.group0", NULL},
+ {"r9", GROUP0 + 1033, "org.gnu.gdb.or1k.group0", NULL},
+ {"r10", GROUP0 + 1034, "org.gnu.gdb.or1k.group0", NULL},
+ {"r11", GROUP0 + 1035, "org.gnu.gdb.or1k.group0", NULL},
+ {"r12", GROUP0 + 1036, "org.gnu.gdb.or1k.group0", NULL},
+ {"r13", GROUP0 + 1037, "org.gnu.gdb.or1k.group0", NULL},
+ {"r14", GROUP0 + 1038, "org.gnu.gdb.or1k.group0", NULL},
+ {"r15", GROUP0 + 1039, "org.gnu.gdb.or1k.group0", NULL},
+ {"r16", GROUP0 + 1040, "org.gnu.gdb.or1k.group0", NULL},
+ {"r17", GROUP0 + 1041, "org.gnu.gdb.or1k.group0", NULL},
+ {"r18", GROUP0 + 1042, "org.gnu.gdb.or1k.group0", NULL},
+ {"r19", GROUP0 + 1043, "org.gnu.gdb.or1k.group0", NULL},
+ {"r20", GROUP0 + 1044, "org.gnu.gdb.or1k.group0", NULL},
+ {"r21", GROUP0 + 1045, "org.gnu.gdb.or1k.group0", NULL},
+ {"r22", GROUP0 + 1046, "org.gnu.gdb.or1k.group0", NULL},
+ {"r23", GROUP0 + 1047, "org.gnu.gdb.or1k.group0", NULL},
+ {"r24", GROUP0 + 1048, "org.gnu.gdb.or1k.group0", NULL},
+ {"r25", GROUP0 + 1049, "org.gnu.gdb.or1k.group0", NULL},
+ {"r26", GROUP0 + 1050, "org.gnu.gdb.or1k.group0", NULL},
+ {"r27", GROUP0 + 1051, "org.gnu.gdb.or1k.group0", NULL},
+ {"r28", GROUP0 + 1052, "org.gnu.gdb.or1k.group0", NULL},
+ {"r29", GROUP0 + 1053, "org.gnu.gdb.or1k.group0", NULL},
+ {"r30", GROUP0 + 1054, "org.gnu.gdb.or1k.group0", NULL},
+ {"r31", GROUP0 + 1055, "org.gnu.gdb.or1k.group0", NULL},
+ {"ppc", GROUP0 + 18, "org.gnu.gdb.or1k.group0", NULL},
+ {"npc", GROUP0 + 16, "org.gnu.gdb.or1k.group0", NULL},
+ {"sr", GROUP0 + 17, "org.gnu.gdb.or1k.group0", NULL},
+ {"vr", GROUP0 + 0, "org.gnu.gdb.or1k.group0", "system"},
+ {"upr", GROUP0 + 1, "org.gnu.gdb.or1k.group0", "system"},
+ {"cpucfgr", GROUP0 + 2, "org.gnu.gdb.or1k.group0", "system"},
+ {"dmmucfgr", GROUP0 + 3, "org.gnu.gdb.or1k.group0", "system"},
+ {"immucfgr", GROUP0 + 4, "org.gnu.gdb.or1k.group0", "system"},
+ {"dccfgr", GROUP0 + 5, "org.gnu.gdb.or1k.group0", "system"},
+ {"iccfgr", GROUP0 + 6, "org.gnu.gdb.or1k.group0", "system"},
+ {"dcfgr", GROUP0 + 7, "org.gnu.gdb.or1k.group0", "system"},
+ {"pccfgr", GROUP0 + 8, "org.gnu.gdb.or1k.group0", "system"},
+ {"fpcsr", GROUP0 + 20, "org.gnu.gdb.or1k.group0", "system"},
+ {"epcr0", GROUP0 + 32, "org.gnu.gdb.or1k.group0", "system"},
+ {"epcr1", GROUP0 + 33, "org.gnu.gdb.or1k.group0", "system"},
+ {"epcr2", GROUP0 + 34, "org.gnu.gdb.or1k.group0", "system"},
+ {"epcr3", GROUP0 + 35, "org.gnu.gdb.or1k.group0", "system"},
+ {"epcr4", GROUP0 + 36, "org.gnu.gdb.or1k.group0", "system"},
+ {"epcr5", GROUP0 + 37, "org.gnu.gdb.or1k.group0", "system"},
+ {"epcr6", GROUP0 + 38, "org.gnu.gdb.or1k.group0", "system"},
+ {"epcr7", GROUP0 + 39, "org.gnu.gdb.or1k.group0", "system"},
+ {"epcr8", GROUP0 + 40, "org.gnu.gdb.or1k.group0", "system"},
+ {"epcr9", GROUP0 + 41, "org.gnu.gdb.or1k.group0", "system"},
+ {"epcr10", GROUP0 + 42, "org.gnu.gdb.or1k.group0", "system"},
+ {"epcr11", GROUP0 + 43, "org.gnu.gdb.or1k.group0", "system"},
+ {"epcr12", GROUP0 + 44, "org.gnu.gdb.or1k.group0", "system"},
+ {"epcr13", GROUP0 + 45, "org.gnu.gdb.or1k.group0", "system"},
+ {"epcr14", GROUP0 + 46, "org.gnu.gdb.or1k.group0", "system"},
+ {"epcr15", GROUP0 + 47, "org.gnu.gdb.or1k.group0", "system"},
+ {"eear0", GROUP0 + 48, "org.gnu.gdb.or1k.group0", "system"},
+ {"eear1", GROUP0 + 49, "org.gnu.gdb.or1k.group0", "system"},
+ {"eear2", GROUP0 + 50, "org.gnu.gdb.or1k.group0", "system"},
+ {"eear3", GROUP0 + 51, "org.gnu.gdb.or1k.group0", "system"},
+ {"eear4", GROUP0 + 52, "org.gnu.gdb.or1k.group0", "system"},
+ {"eear5", GROUP0 + 53, "org.gnu.gdb.or1k.group0", "system"},
+ {"eear6", GROUP0 + 54, "org.gnu.gdb.or1k.group0", "system"},
+ {"eear7", GROUP0 + 55, "org.gnu.gdb.or1k.group0", "system"},
+ {"eear8", GROUP0 + 56, "org.gnu.gdb.or1k.group0", "system"},
+ {"eear9", GROUP0 + 57, "org.gnu.gdb.or1k.group0", "system"},
+ {"eear10", GROUP0 + 58, "org.gnu.gdb.or1k.group0", "system"},
+ {"eear11", GROUP0 + 59, "org.gnu.gdb.or1k.group0", "system"},
+ {"eear12", GROUP0 + 60, "org.gnu.gdb.or1k.group0", "system"},
+ {"eear13", GROUP0 + 61, "org.gnu.gdb.or1k.group0", "system"},
+ {"eear14", GROUP0 + 62, "org.gnu.gdb.or1k.group0", "system"},
+ {"eear15", GROUP0 + 63, "org.gnu.gdb.or1k.group0", "system"},
+ {"esr0", GROUP0 + 64, "org.gnu.gdb.or1k.group0", "system"},
+ {"esr1", GROUP0 + 65, "org.gnu.gdb.or1k.group0", "system"},
+ {"esr2", GROUP0 + 66, "org.gnu.gdb.or1k.group0", "system"},
+ {"esr3", GROUP0 + 67, "org.gnu.gdb.or1k.group0", "system"},
+ {"esr4", GROUP0 + 68, "org.gnu.gdb.or1k.group0", "system"},
+ {"esr5", GROUP0 + 69, "org.gnu.gdb.or1k.group0", "system"},
+ {"esr6", GROUP0 + 70, "org.gnu.gdb.or1k.group0", "system"},
+ {"esr7", GROUP0 + 71, "org.gnu.gdb.or1k.group0", "system"},
+ {"esr8", GROUP0 + 72, "org.gnu.gdb.or1k.group0", "system"},
+ {"esr9", GROUP0 + 73, "org.gnu.gdb.or1k.group0", "system"},
+ {"esr10", GROUP0 + 74, "org.gnu.gdb.or1k.group0", "system"},
+ {"esr11", GROUP0 + 75, "org.gnu.gdb.or1k.group0", "system"},
+ {"esr12", GROUP0 + 76, "org.gnu.gdb.or1k.group0", "system"},
+ {"esr13", GROUP0 + 77, "org.gnu.gdb.or1k.group0", "system"},
+ {"esr14", GROUP0 + 78, "org.gnu.gdb.or1k.group0", "system"},
+ {"esr15", GROUP0 + 79, "org.gnu.gdb.or1k.group0", "system"},
+
+ {"dmmuucr", GROUP1 + 0, "org.gnu.gdb.or1k.group1", "dmmu"},
+ {"dmmuupr", GROUP1 + 1, "org.gnu.gdb.or1k.group1", "dmmu"},
+ {"dtlbeir", GROUP1 + 2, "org.gnu.gdb.or1k.group1", "dmmu"},
+ {"datbmr0", GROUP1 + 4, "org.gnu.gdb.or1k.group1", "dmmu"},
+ {"datbmr1", GROUP1 + 5, "org.gnu.gdb.or1k.group1", "dmmu"},
+ {"datbmr2", GROUP1 + 6, "org.gnu.gdb.or1k.group1", "dmmu"},
+ {"datbmr3", GROUP1 + 7, "org.gnu.gdb.or1k.group1", "dmmu"},
+ {"datbtr0", GROUP1 + 8, "org.gnu.gdb.or1k.group1", "dmmu"},
+ {"datbtr1", GROUP1 + 9, "org.gnu.gdb.or1k.group1", "dmmu"},
+ {"datbtr2", GROUP1 + 10, "org.gnu.gdb.or1k.group1", "dmmu"},
+ {"datbtr3", GROUP1 + 11, "org.gnu.gdb.or1k.group1", "dmmu"},
+
+ {"immucr", GROUP2 + 0, "org.gnu.gdb.or1k.group2", "immu"},
+ {"immupr", GROUP2 + 1, "org.gnu.gdb.or1k.group2", "immu"},
+ {"itlbeir", GROUP2 + 2, "org.gnu.gdb.or1k.group2", "immu"},
+ {"iatbmr0", GROUP2 + 4, "org.gnu.gdb.or1k.group2", "immu"},
+ {"iatbmr1", GROUP2 + 5, "org.gnu.gdb.or1k.group2", "immu"},
+ {"iatbmr2", GROUP2 + 6, "org.gnu.gdb.or1k.group2", "immu"},
+ {"iatbmr3", GROUP2 + 7, "org.gnu.gdb.or1k.group2", "immu"},
+ {"iatbtr0", GROUP2 + 8, "org.gnu.gdb.or1k.group2", "immu"},
+ {"iatbtr1", GROUP2 + 9, "org.gnu.gdb.or1k.group2", "immu"},
+ {"iatbtr2", GROUP2 + 10, "org.gnu.gdb.or1k.group2", "immu"},
+ {"iatbtr3", GROUP2 + 11, "org.gnu.gdb.or1k.group2", "immu"},
+
+ {"dccr", GROUP3 + 0, "org.gnu.gdb.or1k.group3", "dcache"},
+ {"dcbpr", GROUP3 + 1, "org.gnu.gdb.or1k.group3", "dcache"},
+ {"dcbfr", GROUP3 + 2, "org.gnu.gdb.or1k.group3", "dcache"},
+ {"dcbir", GROUP3 + 3, "org.gnu.gdb.or1k.group3", "dcache"},
+ {"dcbwr", GROUP3 + 4, "org.gnu.gdb.or1k.group3", "dcache"},
+ {"dcblr", GROUP3 + 5, "org.gnu.gdb.or1k.group3", "dcache"},
+
+ {"iccr", GROUP4 + 0, "org.gnu.gdb.or1k.group4", "icache"},
+ {"icbpr", GROUP4 + 1, "org.gnu.gdb.or1k.group4", "icache"},
+ {"icbir", GROUP4 + 2, "org.gnu.gdb.or1k.group4", "icache"},
+ {"icblr", GROUP4 + 3, "org.gnu.gdb.or1k.group4", "icache"},
+
+ {"maclo", GROUP5 + 0, "org.gnu.gdb.or1k.group5", "mac"},
+ {"machi", GROUP5 + 1, "org.gnu.gdb.or1k.group5", "mac"},
+
+ {"dvr0", GROUP6 + 0, "org.gnu.gdb.or1k.group6", "debug"},
+ {"dvr1", GROUP6 + 1, "org.gnu.gdb.or1k.group6", "debug"},
+ {"dvr2", GROUP6 + 2, "org.gnu.gdb.or1k.group6", "debug"},
+ {"dvr3", GROUP6 + 3, "org.gnu.gdb.or1k.group6", "debug"},
+ {"dvr4", GROUP6 + 4, "org.gnu.gdb.or1k.group6", "debug"},
+ {"dvr5", GROUP6 + 5, "org.gnu.gdb.or1k.group6", "debug"},
+ {"dvr6", GROUP6 + 6, "org.gnu.gdb.or1k.group6", "debug"},
+ {"dvr7", GROUP6 + 7, "org.gnu.gdb.or1k.group6", "debug"},
+ {"dcr0", GROUP6 + 8, "org.gnu.gdb.or1k.group6", "debug"},
+ {"dcr1", GROUP6 + 9, "org.gnu.gdb.or1k.group6", "debug"},
+ {"dcr2", GROUP6 + 10, "org.gnu.gdb.or1k.group6", "debug"},
+ {"dcr3", GROUP6 + 11, "org.gnu.gdb.or1k.group6", "debug"},
+ {"dcr4", GROUP6 + 12, "org.gnu.gdb.or1k.group6", "debug"},
+ {"dcr5", GROUP6 + 13, "org.gnu.gdb.or1k.group6", "debug"},
+ {"dcr6", GROUP6 + 14, "org.gnu.gdb.or1k.group6", "debug"},
+ {"dcr7", GROUP6 + 15, "org.gnu.gdb.or1k.group6", "debug"},
+ {"dmr1", GROUP6 + 16, "org.gnu.gdb.or1k.group6", "debug"},
+ {"dmr2", GROUP6 + 17, "org.gnu.gdb.or1k.group6", "debug"},
+ {"dcwr0", GROUP6 + 18, "org.gnu.gdb.or1k.group6", "debug"},
+ {"dcwr1", GROUP6 + 19, "org.gnu.gdb.or1k.group6", "debug"},
+ {"dsr", GROUP6 + 20, "org.gnu.gdb.or1k.group6", "debug"},
+ {"drr", GROUP6 + 21, "org.gnu.gdb.or1k.group6", "debug"},
+
+ {"pccr0", GROUP7 + 0, "org.gnu.gdb.or1k.group7", "perf"},
+ {"pccr1", GROUP7 + 1, "org.gnu.gdb.or1k.group7", "perf"},
+ {"pccr2", GROUP7 + 2, "org.gnu.gdb.or1k.group7", "perf"},
+ {"pccr3", GROUP7 + 3, "org.gnu.gdb.or1k.group7", "perf"},
+ {"pccr4", GROUP7 + 4, "org.gnu.gdb.or1k.group7", "perf"},
+ {"pccr5", GROUP7 + 5, "org.gnu.gdb.or1k.group7", "perf"},
+ {"pccr6", GROUP7 + 6, "org.gnu.gdb.or1k.group7", "perf"},
+ {"pccr7", GROUP7 + 7, "org.gnu.gdb.or1k.group7", "perf"},
+ {"pcmr0", GROUP7 + 8, "org.gnu.gdb.or1k.group7", "perf"},
+ {"pcmr1", GROUP7 + 9, "org.gnu.gdb.or1k.group7", "perf"},
+ {"pcmr2", GROUP7 + 10, "org.gnu.gdb.or1k.group7", "perf"},
+ {"pcmr3", GROUP7 + 11, "org.gnu.gdb.or1k.group7", "perf"},
+ {"pcmr4", GROUP7 + 12, "org.gnu.gdb.or1k.group7", "perf"},
+ {"pcmr5", GROUP7 + 13, "org.gnu.gdb.or1k.group7", "perf"},
+ {"pcmr6", GROUP7 + 14, "org.gnu.gdb.or1k.group7", "perf"},
+ {"pcmr7", GROUP7 + 15, "org.gnu.gdb.or1k.group7", "perf"},
+
+ {"pmr", GROUP8 + 0, "org.gnu.gdb.or1k.group8", "power"},
+
+ {"picmr", GROUP9 + 0, "org.gnu.gdb.or1k.group9", "pic"},
+ {"picsr", GROUP9 + 2, "org.gnu.gdb.or1k.group9", "pic"},
+
+ {"ttmr", GROUP10 + 0, "org.gnu.gdb.or1k.group10", "timer"},
+ {"ttcr", GROUP10 + 1, "org.gnu.gdb.or1k.group10", "timer"},
};
static int or1k_add_reg(struct target *target, struct or1k_core_reg *new_reg)
if ((num >= 0) && (num < OR1KNUMCOREREGS)) {
reg_value = or1k->core_regs[num];
buf_set_u32(or1k->core_cache->reg_list[num].value, 0, 32, reg_value);
- LOG_DEBUG("Read core reg %i value 0x%08" PRIx32, num , reg_value);
- or1k->core_cache->reg_list[num].valid = 1;
- or1k->core_cache->reg_list[num].dirty = 0;
+ LOG_DEBUG("Read core reg %i value 0x%08" PRIx32, num, reg_value);
+ or1k->core_cache->reg_list[num].valid = true;
+ or1k->core_cache->reg_list[num].dirty = false;
} else {
/* This is an spr, always read value from HW */
int retval = du_core->or1k_jtag_read_cpu(&or1k->jtag,
return retval;
}
buf_set_u32(or1k->core_cache->reg_list[num].value, 0, 32, reg_value);
- LOG_DEBUG("Read spr reg %i value 0x%08" PRIx32, num , reg_value);
+ LOG_DEBUG("Read spr reg %i value 0x%08" PRIx32, num, reg_value);
}
return ERROR_OK;
uint32_t reg_value = buf_get_u32(or1k->core_cache->reg_list[num].value, 0, 32);
or1k->core_regs[num] = reg_value;
- LOG_DEBUG("Write core reg %i value 0x%08" PRIx32, num , reg_value);
- or1k->core_cache->reg_list[num].valid = 1;
- or1k->core_cache->reg_list[num].dirty = 0;
+ LOG_DEBUG("Write core reg %i value 0x%08" PRIx32, num, reg_value);
+ or1k->core_cache->reg_list[num].valid = true;
+ or1k->core_cache->reg_list[num].dirty = false;
return ERROR_OK;
}
if (or1k_reg->list_num < OR1KNUMCOREREGS) {
buf_set_u32(reg->value, 0, 32, value);
- reg->dirty = 1;
- reg->valid = 1;
+ reg->dirty = true;
+ reg->valid = true;
} else {
/* This is an spr, write it to the HW */
int retval = du_core->or1k_jtag_write_cpu(&or1k->jtag,
struct or1k_common *or1k = target_to_or1k(target);
struct reg_cache **cache_p = register_get_last_cache_p(&target->reg_cache);
struct reg_cache *cache = malloc(sizeof(struct reg_cache));
- struct reg *reg_list = malloc((or1k->nb_regs) * sizeof(struct reg));
+ struct reg *reg_list = calloc(or1k->nb_regs, sizeof(struct reg));
struct or1k_core_reg *arch_info =
malloc((or1k->nb_regs) * sizeof(struct or1k_core_reg));
struct reg_feature *feature;
reg_list[i].group = or1k_core_reg_list_arch_info[i].group;
reg_list[i].size = 32;
reg_list[i].value = calloc(1, 4);
- reg_list[i].dirty = 0;
- reg_list[i].valid = 0;
+ reg_list[i].dirty = false;
+ reg_list[i].valid = false;
reg_list[i].type = &or1k_reg_type;
reg_list[i].arch_info = &arch_info[i];
reg_list[i].number = i;
LOG_WARNING("Debug IF CPU control reg read failure.");
/* Try once to restart the JTAG infrastructure -
quite possibly the board has just been reset. */
- LOG_WARNING("Resetting JTAG TAP state and reconnectiong to debug IF.");
+ LOG_WARNING("Resetting JTAG TAP state and reconnecting to debug IF.");
du_core->or1k_jtag_init(&or1k->jtag);
LOG_WARNING("...attempt %d of %d", tries, RETRIES_MAX);
int retval = du_core->or1k_cpu_reset(&or1k->jtag, CPU_NOT_RESET);
if (retval != ERROR_OK) {
- LOG_ERROR("Error while desasserting RESET");
+ LOG_ERROR("Error while deasserting RESET");
return retval;
}
/* Single step past breakpoint at current address */
breakpoint = breakpoint_find(target, resume_pc);
if (breakpoint) {
- LOG_DEBUG("Unset breakpoint at 0x%08" PRIx32, breakpoint->address);
+ LOG_DEBUG("Unset breakpoint at 0x%08" TARGET_PRIxADDR, breakpoint->address);
retval = or1k_remove_breakpoint(target, breakpoint);
if (retval != ERROR_OK)
return retval;
}
static int or1k_resume(struct target *target, int current,
- uint32_t address, int handle_breakpoints, int debug_execution)
+ target_addr_t address, int handle_breakpoints,
+ int debug_execution)
{
return or1k_resume_or_step(target, current, address,
handle_breakpoints,
}
static int or1k_step(struct target *target, int current,
- uint32_t address, int handle_breakpoints)
+ target_addr_t address, int handle_breakpoints)
{
return or1k_resume_or_step(target, current, address,
handle_breakpoints,
struct or1k_du *du_core = or1k_to_du(or1k);
uint8_t data;
- LOG_DEBUG("Adding breakpoint: addr 0x%08" PRIx32 ", len %d, type %d, set: %d, id: %" PRId32,
+ LOG_DEBUG("Adding breakpoint: addr 0x%08" TARGET_PRIxADDR ", len %d, type %d, id: %" PRIu32,
breakpoint->address, breakpoint->length, breakpoint->type,
- breakpoint->set, breakpoint->unique_id);
+ breakpoint->unique_id);
/* Only support SW breakpoints for now. */
if (breakpoint->type == BKPT_HARD)
1,
&data);
if (retval != ERROR_OK) {
- LOG_ERROR("Error while reading the instruction at 0x%08" PRIx32,
+ LOG_ERROR("Error while reading the instruction at 0x%08" TARGET_PRIxADDR,
breakpoint->address);
return retval;
}
- if (breakpoint->orig_instr != NULL)
- free(breakpoint->orig_instr);
+ free(breakpoint->orig_instr);
breakpoint->orig_instr = malloc(breakpoint->length);
memcpy(breakpoint->orig_instr, &data, breakpoint->length);
/* Sub in the OR1K trap instruction */
- uint32_t or1k_trap_insn = OR1K_TRAP_INSTR;
+ uint8_t or1k_trap_insn[4];
+ target_buffer_set_u32(target, or1k_trap_insn, OR1K_TRAP_INSTR);
retval = du_core->or1k_jtag_write_memory(&or1k->jtag,
breakpoint->address,
4,
1,
- (uint8_t *)&or1k_trap_insn);
+ or1k_trap_insn);
if (retval != ERROR_OK) {
- LOG_ERROR("Error while writing OR1K_TRAP_INSTR at 0x%08" PRIx32,
+ LOG_ERROR("Error while writing OR1K_TRAP_INSTR at 0x%08" TARGET_PRIxADDR,
breakpoint->address);
return retval;
}
/* invalidate instruction cache */
+ uint32_t addr = breakpoint->address;
retval = du_core->or1k_jtag_write_cpu(&or1k->jtag,
- OR1K_ICBIR_CPU_REG_ADD, 1, &breakpoint->address);
+ OR1K_ICBIR_CPU_REG_ADD, 1, &addr);
if (retval != ERROR_OK) {
LOG_ERROR("Error while invalidating the ICACHE");
return retval;
struct or1k_common *or1k = target_to_or1k(target);
struct or1k_du *du_core = or1k_to_du(or1k);
- LOG_DEBUG("Removing breakpoint: addr 0x%08" PRIx32 ", len %d, type %d, set: %d, id: %" PRId32,
+ LOG_DEBUG("Removing breakpoint: addr 0x%08" TARGET_PRIxADDR ", len %d, type %d, id: %" PRIu32,
breakpoint->address, breakpoint->length, breakpoint->type,
- breakpoint->set, breakpoint->unique_id);
+ breakpoint->unique_id);
/* Only support SW breakpoints for now. */
if (breakpoint->type == BKPT_HARD)
breakpoint->orig_instr);
if (retval != ERROR_OK) {
- LOG_ERROR("Error while writing back the instruction at 0x%08" PRIx32,
+ LOG_ERROR("Error while writing back the instruction at 0x%08" TARGET_PRIxADDR,
breakpoint->address);
return retval;
}
/* invalidate instruction cache */
+ uint32_t addr = breakpoint->address;
retval = du_core->or1k_jtag_write_cpu(&or1k->jtag,
- OR1K_ICBIR_CPU_REG_ADD, 1, &breakpoint->address);
+ OR1K_ICBIR_CPU_REG_ADD, 1, &addr);
if (retval != ERROR_OK) {
LOG_ERROR("Error while invalidating the ICACHE");
return retval;
return ERROR_OK;
}
-static int or1k_read_memory(struct target *target, uint32_t address,
+static int or1k_read_memory(struct target *target, target_addr_t address,
uint32_t size, uint32_t count, uint8_t *buffer)
{
struct or1k_common *or1k = target_to_or1k(target);
struct or1k_du *du_core = or1k_to_du(or1k);
- LOG_DEBUG("Read memory at 0x%08" PRIx32 ", size: %" PRIu32 ", count: 0x%08" PRIx32, address, size, count);
+ LOG_DEBUG("Read memory at 0x%08" TARGET_PRIxADDR ", size: %" PRIu32 ", count: 0x%08" PRIx32, address, size, count);
if (target->state != TARGET_HALTED) {
LOG_ERROR("Target not halted");
return ERROR_TARGET_UNALIGNED_ACCESS;
}
- /* or1k_read_memory with size 4/2 returns uint32_t/uint16_t in host */
- /* endianness, but byte array should represent target endianness */
-
- void *t = NULL;
- if (size > 1) {
- t = malloc(count * size * sizeof(uint8_t));
- if (t == NULL) {
- LOG_ERROR("Out of memory");
- return ERROR_FAIL;
- }
- } else
- t = buffer;
-
-
- int retval = du_core->or1k_jtag_read_memory(&or1k->jtag, address,
- size, count, t);
-
- if (retval == ERROR_OK) {
- switch (size) {
- case 4:
- target_buffer_set_u32_array(target, buffer, count, t);
- break;
- case 2:
- target_buffer_set_u16_array(target, buffer, count, t);
- break;
- }
- }
-
- if ((size > 1) && (t != NULL))
- free(t);
-
- return ERROR_OK;
+ return du_core->or1k_jtag_read_memory(&or1k->jtag, address, size, count, buffer);
}
-static int or1k_write_memory(struct target *target, uint32_t address,
+static int or1k_write_memory(struct target *target, target_addr_t address,
uint32_t size, uint32_t count, const uint8_t *buffer)
{
struct or1k_common *or1k = target_to_or1k(target);
struct or1k_du *du_core = or1k_to_du(or1k);
- LOG_DEBUG("Write memory at 0x%08" PRIx32 ", size: %" PRIu32 ", count: 0x%08" PRIx32, address, size, count);
+ LOG_DEBUG("Write memory at 0x%08" TARGET_PRIxADDR ", size: %" PRIu32 ", count: 0x%08" PRIx32, address, size, count);
if (target->state != TARGET_HALTED) {
LOG_WARNING("Target not halted");
return ERROR_TARGET_UNALIGNED_ACCESS;
}
- /* or1k_write_memory with size 4/2 requires uint32_t/uint16_t in host */
- /* endianness, but byte array represents target endianness */
-
- void *t = NULL;
- if (size > 1) {
- t = malloc(count * size * sizeof(uint8_t));
- if (t == NULL) {
- LOG_ERROR("Out of memory");
- return ERROR_FAIL;
- }
-
- switch (size) {
- case 4:
- target_buffer_get_u32_array(target, buffer, count, (uint32_t *)t);
- break;
- case 2:
- target_buffer_get_u16_array(target, buffer, count, (uint16_t *)t);
- break;
- }
- buffer = t;
- }
-
- int retval = du_core->or1k_jtag_write_memory(&or1k->jtag, address, size, count, buffer);
-
- if (t != NULL)
- free(t);
-
- if (retval != ERROR_OK)
- return retval;
-
- return ERROR_OK;
+ return du_core->or1k_jtag_write_memory(&or1k->jtag, address, size, count, buffer);
}
static int or1k_init_target(struct command_context *cmd_ctx,
struct or1k_du *du_core = or1k_to_du(or1k);
struct or1k_jtag *jtag = &or1k->jtag;
- if (du_core == NULL) {
+ if (!du_core) {
LOG_ERROR("No debug unit selected");
return ERROR_FAIL;
}
- if (jtag->tap_ip == NULL) {
+ if (!jtag->tap_ip) {
LOG_ERROR("No tap selected");
return ERROR_FAIL;
}
or1k->jtag.tap = target->tap;
or1k->jtag.or1k_jtag_inited = 0;
or1k->jtag.or1k_jtag_module_selected = -1;
+ or1k->jtag.target = target;
or1k_build_reg_cache(target);
static int or1k_target_create(struct target *target, Jim_Interp *interp)
{
- struct or1k_common *or1k = calloc(1, sizeof(struct or1k_common));
-
- if (target->tap == NULL)
+ if (!target->tap)
return ERROR_FAIL;
+ struct or1k_common *or1k = calloc(1, sizeof(struct or1k_common));
+
target->arch_info = or1k;
or1k_create_reg_list(target);
}
-int or1k_get_gdb_fileio_info(struct target *target, struct gdb_fileio_info *fileio_info)
+static int or1k_get_gdb_fileio_info(struct target *target, struct gdb_fileio_info *fileio_info)
{
return ERROR_FAIL;
}
-static int or1k_checksum_memory(struct target *target, uint32_t address,
- uint32_t count, uint32_t *checksum) {
-
+static int or1k_checksum_memory(struct target *target, target_addr_t address,
+ uint32_t count, uint32_t *checksum)
+{
return ERROR_FAIL;
}
+static int or1k_profiling(struct target *target, uint32_t *samples,
+ uint32_t max_num_samples, uint32_t *num_samples, uint32_t seconds)
+{
+ struct timeval timeout, now;
+ struct or1k_common *or1k = target_to_or1k(target);
+ struct or1k_du *du_core = or1k_to_du(or1k);
+ int retval = ERROR_OK;
+
+ gettimeofday(&timeout, NULL);
+ timeval_add_time(&timeout, seconds, 0);
+
+ LOG_INFO("Starting or1k profiling. Sampling npc as fast as we can...");
+
+ /* Make sure the target is running */
+ target_poll(target);
+ if (target->state == TARGET_HALTED)
+ retval = target_resume(target, 1, 0, 0, 0);
+
+ if (retval != ERROR_OK) {
+ LOG_ERROR("Error while resuming target");
+ return retval;
+ }
+
+ uint32_t sample_count = 0;
+
+ for (;;) {
+ uint32_t reg_value;
+ retval = du_core->or1k_jtag_read_cpu(&or1k->jtag, GROUP0 + 16 /* NPC */, 1, ®_value);
+ if (retval != ERROR_OK) {
+ LOG_ERROR("Error while reading NPC");
+ return retval;
+ }
+
+ samples[sample_count++] = reg_value;
+
+ gettimeofday(&now, NULL);
+ if ((sample_count >= max_num_samples) || timeval_compare(&now, &timeout) > 0) {
+ LOG_INFO("Profiling completed. %" PRIu32 " samples.", sample_count);
+ break;
+ }
+ }
+
+ *num_samples = sample_count;
+ return retval;
+}
+
COMMAND_HANDLER(or1k_tap_select_command_handler)
{
struct target *target = get_current_target(CMD_CTX);
list_for_each_entry(or1k_tap, &tap_list, list) {
if (or1k_tap->name)
- command_print(CMD_CTX, "%s", or1k_tap->name);
+ command_print(CMD, "%s", or1k_tap->name);
}
return ERROR_OK;
list_for_each_entry(or1k_du, &du_list, list) {
if (or1k_du->name)
- command_print(CMD_CTX, "%s", or1k_du->name);
+ command_print(CMD, "%s", or1k_du->name);
}
return ERROR_OK;
static const struct command_registration or1k_hw_ip_command_handlers[] = {
{
- "tap_select",
+ .name = "tap_select",
.handler = or1k_tap_select_command_handler,
.mode = COMMAND_ANY,
- .usage = "tap_select name",
+ .usage = "name",
.help = "Select the TAP core to use",
},
{
- "tap_list",
+ .name = "tap_list",
.handler = or1k_tap_list_command_handler,
.mode = COMMAND_ANY,
- .usage = "tap_list",
+ .usage = "",
.help = "Display available TAP core",
},
{
- "du_select",
+ .name = "du_select",
.handler = or1k_du_select_command_handler,
.mode = COMMAND_ANY,
- .usage = "du_select name",
+ .usage = "name",
.help = "Select the Debug Unit core to use",
},
{
- "du_list",
+ .name = "du_list",
.handler = or1k_du_list_command_handler,
.mode = COMMAND_ANY,
.usage = "select_tap name",
static const struct command_registration or1k_reg_command_handlers[] = {
{
- "addreg",
+ .name = "addreg",
.handler = or1k_addreg_command_handler,
.mode = COMMAND_ANY,
- .usage = "addreg name addr feature group",
+ .usage = "name addr feature group",
.help = "Add a register to the register list",
},
COMMAND_REGISTRATION_DONE
.examine = or1k_examine,
.get_gdb_fileio_info = or1k_get_gdb_fileio_info,
+
+ .profiling = or1k_profiling,
};