diff options
| author | John Dallaway | 2022-04-21 21:24:30 +0000 |
|---|---|---|
| committer | John Dallaway | 2022-04-22 09:56:43 +0000 |
| commit | 90627bfa830f27f12646637bb30865d8a9f2ed13 (patch) | |
| tree | eb8ab913ea7ce5cb29927ace110aa8dcaab0bc6a | |
| parent | a1c02e2cce72f98aa1c73324225fc53563a81856 (diff) | |
| download | org.eclipse.cdt-90627bfa830f27f12646637bb30865d8a9f2ed13.tar.gz org.eclipse.cdt-90627bfa830f27f12646637bb30865d8a9f2ed13.tar.xz org.eclipse.cdt-90627bfa830f27f12646637bb30865d8a9f2ed13.zip | |
Bug 535143: Support multiple remote debug protocols
Change-Id: If3362e3742aa05a8577faa217b46c41dcddb792f
17 files changed, 284 insertions, 111 deletions
diff --git a/jtag/org.eclipse.cdt.debug.gdbjtag.core.tests/META-INF/MANIFEST.MF b/jtag/org.eclipse.cdt.debug.gdbjtag.core.tests/META-INF/MANIFEST.MF index a0683bf3605..2573a09165f 100644 --- a/jtag/org.eclipse.cdt.debug.gdbjtag.core.tests/META-INF/MANIFEST.MF +++ b/jtag/org.eclipse.cdt.debug.gdbjtag.core.tests/META-INF/MANIFEST.MF @@ -2,14 +2,14 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: org.eclipse.cdt.debug.gdbjtag.core.tests;singleton:=true -Bundle-Version: 1.0.300.qualifier +Bundle-Version: 1.0.400.qualifier Bundle-Activator: org.eclipse.cdt.debug.gdbjtag.core.tests.Activator Require-Bundle: org.eclipse.core.runtime, org.eclipse.cdt.tests.dsf.gdb;bundle-version="2.3.0", org.junit, org.eclipse.cdt.debug.core, org.eclipse.cdt.dsf.gdb, - org.eclipse.cdt.debug.gdbjtag.core;bundle-version="9.2.1", + org.eclipse.cdt.debug.gdbjtag.core;bundle-version="10.6.0", org.eclipse.cdt.dsf, org.eclipse.cdt.launch, org.eclipse.debug.core diff --git a/jtag/org.eclipse.cdt.debug.gdbjtag.core.tests/pom.xml b/jtag/org.eclipse.cdt.debug.gdbjtag.core.tests/pom.xml index f22c49c2011..cb343510332 100644 --- a/jtag/org.eclipse.cdt.debug.gdbjtag.core.tests/pom.xml +++ b/jtag/org.eclipse.cdt.debug.gdbjtag.core.tests/pom.xml @@ -21,7 +21,7 @@ <relativePath>../../pom.xml</relativePath> </parent> - <version>1.0.300-SNAPSHOT</version> + <version>1.0.400-SNAPSHOT</version> <artifactId>org.eclipse.cdt.debug.gdbjtag.core.tests</artifactId> <packaging>eclipse-test-plugin</packaging> diff --git a/jtag/org.eclipse.cdt.debug.gdbjtag.core.tests/src/org/eclipse/cdt/debug/gdbjtag/core/tests/launch/AutomatedSuite.java b/jtag/org.eclipse.cdt.debug.gdbjtag.core.tests/src/org/eclipse/cdt/debug/gdbjtag/core/tests/AutomatedSuite.java index dadb27e0174..0154a8a2134 100644 --- a/jtag/org.eclipse.cdt.debug.gdbjtag.core.tests/src/org/eclipse/cdt/debug/gdbjtag/core/tests/launch/AutomatedSuite.java +++ b/jtag/org.eclipse.cdt.debug.gdbjtag.core.tests/src/org/eclipse/cdt/debug/gdbjtag/core/tests/AutomatedSuite.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2012, 2018 Ericsson and others. + * Copyright (c) 2012, 2022 Ericsson and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -12,7 +12,7 @@ * Marc Khouzam (Ericsson) - Base Implementation * John Dallaway - GDB JTAG Implementation (bug 538282) *******************************************************************************/ -package org.eclipse.cdt.debug.gdbjtag.core.tests.launch; +package org.eclipse.cdt.debug.gdbjtag.core.tests; import org.junit.runner.RunWith; import org.junit.runners.Suite; diff --git a/jtag/org.eclipse.cdt.debug.gdbjtag.core.tests/src/org/eclipse/cdt/debug/gdbjtag/core/tests/launch/SuiteGDBJtag.java b/jtag/org.eclipse.cdt.debug.gdbjtag.core.tests/src/org/eclipse/cdt/debug/gdbjtag/core/tests/SuiteGDBJtag.java index e331dd8e3b5..015722804bf 100644 --- a/jtag/org.eclipse.cdt.debug.gdbjtag.core.tests/src/org/eclipse/cdt/debug/gdbjtag/core/tests/launch/SuiteGDBJtag.java +++ b/jtag/org.eclipse.cdt.debug.gdbjtag.core.tests/src/org/eclipse/cdt/debug/gdbjtag/core/tests/SuiteGDBJtag.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2016, 2018 QNX Software System and others. + * Copyright (c) 2016, 2022 QNX Software System and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -12,8 +12,10 @@ * Elena Laskavaia (QNX Software System) - Base API and implementation * John Dallaway - GDB JTAG implementation (bug 538282) *******************************************************************************/ -package org.eclipse.cdt.debug.gdbjtag.core.tests.launch; +package org.eclipse.cdt.debug.gdbjtag.core.tests; +import org.eclipse.cdt.debug.gdbjtag.core.tests.jtagdevice.GDBJtagDeviceContributionTest; +import org.eclipse.cdt.debug.gdbjtag.core.tests.launch.GDBJtagLaunchTest; import org.eclipse.cdt.tests.dsf.gdb.framework.BaseParametrizedTestCase; import org.junit.BeforeClass; import org.junit.runner.RunWith; @@ -21,7 +23,7 @@ import org.junit.runners.Suite; @SuppressWarnings("restriction") @RunWith(Suite.class) -@Suite.SuiteClasses({ GDBJtagLaunchTest.class }) +@Suite.SuiteClasses({ GDBJtagDeviceContributionTest.class, GDBJtagLaunchTest.class }) public class SuiteGDBJtag { diff --git a/jtag/org.eclipse.cdt.debug.gdbjtag.core.tests/src/org/eclipse/cdt/debug/gdbjtag/core/tests/jtagdevice/GDBJtagDeviceContributionTest.java b/jtag/org.eclipse.cdt.debug.gdbjtag.core.tests/src/org/eclipse/cdt/debug/gdbjtag/core/tests/jtagdevice/GDBJtagDeviceContributionTest.java new file mode 100644 index 00000000000..f2718126103 --- /dev/null +++ b/jtag/org.eclipse.cdt.debug.gdbjtag.core.tests/src/org/eclipse/cdt/debug/gdbjtag/core/tests/jtagdevice/GDBJtagDeviceContributionTest.java @@ -0,0 +1,41 @@ +/******************************************************************************* + * Copyright (c) 2022 John Dallaway and others. + * + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * John Dallaway - Initial implementation (Bug 535143) + *******************************************************************************/ +package org.eclipse.cdt.debug.gdbjtag.core.tests.jtagdevice; + +import static org.junit.Assert.assertArrayEquals; + +import org.eclipse.cdt.debug.gdbjtag.core.IGDBJtagConnection; +import org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.GDBJtagDeviceContribution; +import org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.GDBJtagDeviceContributionFactory; +import org.junit.Test; + +import junit.framework.TestCase; + +public class GDBJtagDeviceContributionTest extends TestCase { + + private static final String TEST_JTAG_DEVICE_ID = "org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.genericDevice"; //$NON-NLS-1$ + private static final String EXPECTED_PROTOCOLS = "remote,extended-remote"; //$NON-NLS-1$ + private static final String EXPECTED_DEFAULT_CONNECTION = "localhost:1234"; //$NON-NLS-1$ + + @Test + public void testGdbJtagDeviceContribution() { + final GDBJtagDeviceContribution contribution = GDBJtagDeviceContributionFactory.getInstance() + .findByDeviceId(TEST_JTAG_DEVICE_ID); + assertNotNull(contribution); + final IGDBJtagConnection device = (IGDBJtagConnection) contribution.getDevice(); + assertArrayEquals(EXPECTED_PROTOCOLS.split(","), device.getDeviceProtocols()); + assertEquals(EXPECTED_DEFAULT_CONNECTION, device.getDefaultDeviceConnection()); + } + +} diff --git a/jtag/org.eclipse.cdt.debug.gdbjtag.core/.settings/.api_filters b/jtag/org.eclipse.cdt.debug.gdbjtag.core/.settings/.api_filters new file mode 100644 index 00000000000..746fa73a706 --- /dev/null +++ b/jtag/org.eclipse.cdt.debug.gdbjtag.core/.settings/.api_filters @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<component id="org.eclipse.cdt.debug.gdbjtag.core" version="2"> + <resource path="src/org/eclipse/cdt/debug/gdbjtag/core/IGDBJtagConnection.java" type="org.eclipse.cdt.debug.gdbjtag.core.IGDBJtagConnection"> + <filter id="404000815"> + <message_arguments> + <message_argument value="org.eclipse.cdt.debug.gdbjtag.core.IGDBJtagConnection"/> + <message_argument value="doTarget(String, String, Collection<String>)"/> + </message_arguments> + </filter> + <filter id="404000815"> + <message_arguments> + <message_argument value="org.eclipse.cdt.debug.gdbjtag.core.IGDBJtagConnection"/> + <message_argument value="getDeviceProtocols()"/> + </message_arguments> + </filter> + <filter id="404000815"> + <message_arguments> + <message_argument value="org.eclipse.cdt.debug.gdbjtag.core.IGDBJtagConnection"/> + <message_argument value="setDeviceProtocols(String[])"/> + </message_arguments> + </filter> + </resource> +</component> diff --git a/jtag/org.eclipse.cdt.debug.gdbjtag.core/META-INF/MANIFEST.MF b/jtag/org.eclipse.cdt.debug.gdbjtag.core/META-INF/MANIFEST.MF index c6d6e482141..c2ddd0440ad 100644 --- a/jtag/org.eclipse.cdt.debug.gdbjtag.core/META-INF/MANIFEST.MF +++ b/jtag/org.eclipse.cdt.debug.gdbjtag.core/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: org.eclipse.cdt.debug.gdbjtag.core;singleton:=true -Bundle-Version: 10.5.300.qualifier +Bundle-Version: 10.6.0.qualifier Bundle-Activator: org.eclipse.cdt.debug.gdbjtag.core.Activator Bundle-Localization: plugin Require-Bundle: org.eclipse.core.runtime, diff --git a/jtag/org.eclipse.cdt.debug.gdbjtag.core/plugin.xml b/jtag/org.eclipse.cdt.debug.gdbjtag.core/plugin.xml index a581dca10ce..4dce8fbb9da 100644 --- a/jtag/org.eclipse.cdt.debug.gdbjtag.core/plugin.xml +++ b/jtag/org.eclipse.cdt.debug.gdbjtag.core/plugin.xml @@ -27,63 +27,73 @@ point="org.eclipse.cdt.debug.gdbjtag.core.JTagDevice"> <device class="org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.GenericDevice" - default_connection="localhost:10000" + default_connection="localhost:1234" id="org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.genericDevice" - name="%Generic.name"> + name="%Generic.name" + protocols="remote,extended-remote"> </device> <device class="org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.AbatronBDI2000" default_connection="bdi2000:2001" id="org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.AbatronBDI2000" - name="%AbatronBDI2000.name"> + name="%AbatronBDI2000.name" + protocols="remote"> </device> <device class="org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.MacraigorUsb2Demon" default_connection="localhost:8888" id="org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.MacraigorUsb2Demon" - name="%MacraigorUsb2Demon.name"> + name="%MacraigorUsb2Demon.name" + protocols="remote"> </device> <device class="org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.DefaultGDBJtagConnectionImpl" - default_connection="/dev/com1" + default_connection="COM1" id="org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.GenericSerial" - name="%GenericSerial.name"> + name="%GenericSerial.name" + protocols="remote,extended-remote"> </device> <device class="org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.OpenOCDPipe" default_connection="| openocd --pipe" id="org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.OpenOCD" - name="%OpenOCDPipe.name"> + name="%OpenOCDPipe.name" + protocols="remote"> </device> <device class="org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.OpenOCDSocket" default_connection="localhost:3333" id="org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.OpenOCDSocket" - name="%OpenOCDSocket.name"> + name="%OpenOCDSocket.name" + protocols="remote"> </device> <device class="org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.PEMicro" default_connection="localhost:7224" id="org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.PEMicro" - name="%PEMicro.name"> + name="%PEMicro.name" + protocols="remote"> </device> <device class="org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.PyOCD" default_connection="localhost:3333" id="org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.PyOCD" - name="%PyOCD.name"> + name="%PyOCD.name" + protocols="remote"> </device> <device class="org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.SeggerJLink" default_connection="localhost:2331" id="org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.SeggerJLink" - name="%SeggerJLink.name"> + name="%SeggerJLink.name" + protocols="remote"> </device> <device class="org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.STLink" default_connection="localhost:61234" id="org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.STLink" - name="%STLink.name"> + name="%STLink.name" + protocols="remote"> </device> </extension> </plugin> diff --git a/jtag/org.eclipse.cdt.debug.gdbjtag.core/schema/JTagDevice.exsd b/jtag/org.eclipse.cdt.debug.gdbjtag.core/schema/JTagDevice.exsd index de56b802698..5f3972450d5 100644 --- a/jtag/org.eclipse.cdt.debug.gdbjtag.core/schema/JTagDevice.exsd +++ b/jtag/org.eclipse.cdt.debug.gdbjtag.core/schema/JTagDevice.exsd @@ -80,6 +80,13 @@ </documentation> </annotation> </attribute> + <attribute name="protocols" type="string"> + <annotation> + <documentation> + The comma-separated set of GDB target types (protocols) supported by the JTAG device. If omitted, the "remote" protocol is assumed. + </documentation> + </annotation> + </attribute> </complexType> </element> diff --git a/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/GDBJtagDSFFinalLaunchSequence.java b/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/GDBJtagDSFFinalLaunchSequence.java index 28961ed5eb7..39a697b3b1c 100644 --- a/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/GDBJtagDSFFinalLaunchSequence.java +++ b/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/GDBJtagDSFFinalLaunchSequence.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2007, 2021 QNX Software Systems and others. + * Copyright (c) 2007, 2022 QNX Software Systems and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -26,6 +26,7 @@ * John Dallaway - Eliminate deprecated API (Bug 566462) * John Dallaway - Set executable file (Bug 457697) * John Dallaway - Initialize memory data before connecting to target (Bug 575934) + * John Dallaway - Support multiple remote debug protocols (Bug 535143) *******************************************************************************/ package org.eclipse.cdt.debug.gdbjtag.core; @@ -421,8 +422,10 @@ public class GDBJtagDSFFinalLaunchSequence extends FinalLaunchSequence { connection = String.format("%s:%d", ipAddress, portNumber); //$NON-NLS-1$ } } + String protocol = CDebugUtils.getAttribute(getAttributes(), IGDBJtagConstants.ATTR_PROTOCOL, + IGDBJtagConstants.DEFAULT_PROTOCOL); IGDBJtagConnection device = (IGDBJtagConnection) fGdbJtagDevice; - device.doRemote(connection, commands); + device.doTarget(protocol, connection, commands); queueCommands(commands, rm); } else { rm.done(); diff --git a/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/IGDBJtagConnection.java b/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/IGDBJtagConnection.java index 7f3a3c3f2d2..b60aa687e9a 100644 --- a/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/IGDBJtagConnection.java +++ b/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/IGDBJtagConnection.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2008-2010 QNX Software Systems and others. + * Copyright (c) 2008, 2022 QNX Software Systems and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -14,6 +14,7 @@ * Sage Electronic Engineering, LLC - bug 305943 * - API generalization to become transport-independent (e.g. to * allow connections via serial ports and pipes). + * John Dallaway - Support multiple remote debug protocols - bug 535143 *******************************************************************************/ package org.eclipse.cdt.debug.gdbjtag.core; @@ -22,30 +23,76 @@ import java.util.Collection; /** * Provides device specific debug commands for different hardware - * JTAG devices. See <code>DefaultGDBJtagDeviceImpl</code> for - * the default implementations. + * JTAG devices. See <code>DefaultGDBJtagConnectionImpl</code> for + * the default implementation. * @since 7.0 */ public interface IGDBJtagConnection { /** + * Used during instantiation to set the supported protocol strings from XML + * @param protocols + * the array of supported protocols (default protocol first) + * @since 10.6 + */ + default void setDeviceProtocols(String[] protocols) { + // not implemented + } + + /** * Used during instantiation to set the device default connection string from XML - * @param connection A device specific default connection string that GDB understands + * @param connection + * the GDB string describing the default connection to the target */ public void setDefaultDeviceConnection(String connection); /** * Commands to connect to remote JTAG device - * @param connection defines the gdb string required to establish a connection to the target - * @param commands gdb commands to execute on the remote device (usually the target probe) + * @param connection + * the GDB string describing the connection to the target + * @param commands + * implementation should populate the collection with the gdb + * commands that will connect to the JTAG device using the remote + * protocol, or leave the collection as-is if that operation is + * either unsupported or not applicable + * @deprecated call or override {@link #doTarget(String, String, Collection)} instead */ + @Deprecated(since = "10.6") public void doRemote(String connection, Collection<String> commands); /** + * Supported protocols used by GDB to connect to a device + * @return the array of supported protocols (default protocol first) + * @since 10.6 + */ + default String[] getDeviceProtocols() { + return new String[] { "remote" }; //$NON-NLS-1$ + } + + /** * Host specific default device name used by GDB to connect to a device * @return identifier for the remote device. It is up to GDB to figure out how to interpret * the connection string (e.g /dev/COM1, 127.0.0.1:8888, etc.) */ public String getDefaultDeviceConnection(); + /** + * Commands to connect to remote JTAG device + * @param protocol + * the GDB string describing the communication protocol between host and target + * @param connection + * the GDB string required to establish a connection to the target + * @param commands + * implementation should populate the collection with the gdb + * commands that will connect to the JTAG device, or leave + * the collection as-is if that operation is either unsupported + * or not applicable + * @since 10.6 + */ + default void doTarget(String protocol, String connection, Collection<String> commands) { + if ("remote".equals(protocol)) { //$NON-NLS-1$ + doRemote(connection, commands); + } // else protocol not supported + } + } diff --git a/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/IGDBJtagConstants.java b/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/IGDBJtagConstants.java index f3805fdabeb..9c602419205 100644 --- a/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/IGDBJtagConstants.java +++ b/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/IGDBJtagConstants.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2007 - 2020 QNX Software Systems and others. + * Copyright (c) 2007, 2022 QNX Software Systems and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -15,6 +15,7 @@ * Torbjörn Svensson (STMicroelectronics) - Bug 535024 * John Dallaway - Sort JTAG device list, bug 560186 * John Dallaway - Eliminate deprecated API, bug 566462 + * John Dallaway - Support multiple remote debug protocols, bug 535143 *******************************************************************************/ package org.eclipse.cdt.debug.gdbjtag.core; @@ -52,6 +53,8 @@ public interface IGDBJtagConstants { public static final String ATTR_STOP_AT = Activator.PLUGIN_ID + ".stopAt"; //$NON-NLS-1$ public static final String ATTR_SET_RESUME = Activator.PLUGIN_ID + ".setResume"; //$NON-NLS-1$ public static final String ATTR_RUN_COMMANDS = Activator.PLUGIN_ID + ".runCommands"; //$NON-NLS-1$ + /** @since 10.6 */ + public static final String ATTR_PROTOCOL = Activator.PLUGIN_ID + ".protocol"; //$NON-NLS-1$ /** @since 7.0 */ public static final String ATTR_CONNECTION = Activator.PLUGIN_ID + ".connection"; //$NON-NLS-1$ /** @since 7.0 */ @@ -73,6 +76,8 @@ public interface IGDBJtagConstants { public static final boolean DEFAULT_SET_RESUME = false; public static final boolean DEFAULT_USE_DEFAULT_RUN = true; + /** @since 10.6 */ + public static final String DEFAULT_PROTOCOL = "remote"; //$NON-NLS-1$ /** @since 7.0 */ public static final String DEFAULT_CONNECTION = "unspecified-ip-address:unspecified-port-number"; //$NON-NLS-1$ /** @since 7.0 */ diff --git a/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/jtagdevice/DefaultGDBJtagConnectionImpl.java b/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/jtagdevice/DefaultGDBJtagConnectionImpl.java index 23bd38b57e6..3fb438cdddd 100644 --- a/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/jtagdevice/DefaultGDBJtagConnectionImpl.java +++ b/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/jtagdevice/DefaultGDBJtagConnectionImpl.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2010, 2020 Sage Electronic Engineering and others. + * Copyright (c) 2010, 2022 Sage Electronic Engineering and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -13,6 +13,7 @@ * - API generalization to become transport-independent (e.g. to * allow connections via serial ports and pipes). * John Dallaway - Eliminate deprecated API - bug 566462 + * John Dallaway - Support multiple remote debug protocols - bug 535143 *******************************************************************************/ package org.eclipse.cdt.debug.gdbjtag.core.jtagdevice; @@ -26,14 +27,24 @@ import org.eclipse.cdt.debug.gdbjtag.core.IGDBJtagConnection; */ public class DefaultGDBJtagConnectionImpl extends DefaultGDBJtagDeviceImpl implements IGDBJtagConnection { + private static final String PROTOCOL_REMOTE = "remote"; //$NON-NLS-1$ + + private String[] protocols = new String[0]; protected String connection = null; @Override + public final void setDeviceProtocols(String[] protocols) { + this.protocols = protocols; + } + + @Override public final void setDefaultDeviceConnection(String connection) { this.connection = connection; } + /** @deprecated call or override {@link #doTarget(String, String, Collection)} instead */ @Override + @Deprecated(since = "10.6") public void doRemote(String connection, Collection<String> commands) { String cmd = ""; //$NON-NLS-1$ if (connection != null) { @@ -48,6 +59,21 @@ public class DefaultGDBJtagConnectionImpl extends DefaultGDBJtagDeviceImpl imple } @Override + public void doTarget(String protocol, String connection, Collection<String> commands) { + if (PROTOCOL_REMOTE.equals(protocol)) { + doRemote(connection, commands); // use legacy method which may have been overridden + } else if ((connection != null) && (protocol != null)) { + String cmd = String.format("-target-select %s %s", protocol, connection); //$NON-NLS-1$ + addCmd(commands, cmd); + } + } + + @Override + public String[] getDeviceProtocols() { + return protocols; + } + + @Override public String getDefaultDeviceConnection() { return connection; } diff --git a/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/jtagdevice/GDBJtagDeviceContribution.java b/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/jtagdevice/GDBJtagDeviceContribution.java index ab90d4d4b08..803118657e4 100644 --- a/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/jtagdevice/GDBJtagDeviceContribution.java +++ b/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/jtagdevice/GDBJtagDeviceContribution.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2008 - 2020 QNX Software Systems and others. + * Copyright (c) 2008, 2022 QNX Software Systems and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -15,6 +15,7 @@ * - API generalization to become transport-independent (allow * connections via serial ports and pipes). * John Dallaway - Eliminate deprecated API - bug 566462 + * John Dallaway - Support multiple remote debug protocols - bug 535143 *******************************************************************************/ package org.eclipse.cdt.debug.gdbjtag.core.jtagdevice; @@ -33,6 +34,7 @@ public class GDBJtagDeviceContribution { private IGDBJtagDevice device; private String deviceClassBundleName; private String deviceDefaultConnection; + private String[] deviceProtocols; /** * @return the deviceId @@ -98,6 +100,7 @@ public class GDBJtagDeviceContribution { try { o = Platform.getBundle(deviceClassBundleName).loadClass(deviceClassName).getConstructor().newInstance(); if (o instanceof IGDBJtagConnection) { + ((IGDBJtagConnection) o).setDeviceProtocols(deviceProtocols); ((IGDBJtagConnection) o).setDefaultDeviceConnection(deviceDefaultConnection); } device = (IGDBJtagDevice) o; @@ -110,4 +113,14 @@ public class GDBJtagDeviceContribution { } + /** @since 10.6 */ + public void setDeviceProtocols(String[] protocols) { + deviceProtocols = protocols; + } + + /** @since 10.6 */ + public String[] getDeviceProtocols() { + return deviceProtocols; + } + } diff --git a/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/jtagdevice/GDBJtagDeviceContributionFactory.java b/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/jtagdevice/GDBJtagDeviceContributionFactory.java index 921dff40634..7159693f298 100644 --- a/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/jtagdevice/GDBJtagDeviceContributionFactory.java +++ b/jtag/org.eclipse.cdt.debug.gdbjtag.core/src/org/eclipse/cdt/debug/gdbjtag/core/jtagdevice/GDBJtagDeviceContributionFactory.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2008, 2018 QNX Software Systems and others. + * Copyright (c) 2008, 2022 QNX Software Systems and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -15,10 +15,12 @@ * - API generalization to become transport-independent (allow * connections via serial ports and pipes). * Torbjörn Svensson (STMicroelectronics) - Bug 535024 + * John Dallaway - Support multiple remote debug protocols - bug 535143 *******************************************************************************/ package org.eclipse.cdt.debug.gdbjtag.core.jtagdevice; import java.util.ArrayList; +import java.util.Arrays; import org.eclipse.cdt.debug.gdbjtag.core.Activator; import org.eclipse.cdt.debug.gdbjtag.core.IGDBJtagConstants; @@ -60,11 +62,15 @@ public class GDBJtagDeviceContributionFactory { String className = getRequired(configurationElement, "class"); //$NON-NLS-1$ String connection = getOptional(configurationElement, "default_connection", //$NON-NLS-1$ IGDBJtagConstants.DEFAULT_CONNECTION); + String[] protocols = getOptional(configurationElement, "protocols", //$NON-NLS-1$ + IGDBJtagConstants.DEFAULT_PROTOCOL).split(","); //$NON-NLS-1$ GDBJtagDeviceContribution adapter = new GDBJtagDeviceContribution(); adapter.setDeviceId(id); adapter.setDeviceName(name); adapter.setDeviceClassName(className); adapter.setDeviceDefaultConnection(connection); + adapter.setDeviceProtocols( + Arrays.stream(protocols).map(String::trim).filter(s -> !s.isEmpty()).toArray(String[]::new)); adapter.setDeviceClassBundleName(configurationElement.getContributor().getName()); addContribution(adapter); } diff --git a/jtag/org.eclipse.cdt.debug.gdbjtag.ui/src/org/eclipse/cdt/debug/gdbjtag/ui/GDBJtagDSFDebuggerTab.java b/jtag/org.eclipse.cdt.debug.gdbjtag.ui/src/org/eclipse/cdt/debug/gdbjtag/ui/GDBJtagDSFDebuggerTab.java index 8619797f4d9..8c62e9fe7eb 100644 --- a/jtag/org.eclipse.cdt.debug.gdbjtag.ui/src/org/eclipse/cdt/debug/gdbjtag/ui/GDBJtagDSFDebuggerTab.java +++ b/jtag/org.eclipse.cdt.debug.gdbjtag.ui/src/org/eclipse/cdt/debug/gdbjtag/ui/GDBJtagDSFDebuggerTab.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2007, 2021 QNX Software Systems and others. + * Copyright (c) 2007, 2022 QNX Software Systems and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -23,6 +23,7 @@ * John Dallaway - Sort JTAG device list, bug 560186 * John Dallaway - Eliminate deprecated API, bug 566462 * John Dallaway - Eliminate pixel-level sizing, bug 567662 + * John Dallaway - Support multiple remote debug protocols, bug 535143 *******************************************************************************/ package org.eclipse.cdt.debug.gdbjtag.ui; @@ -50,10 +51,11 @@ import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; import org.eclipse.debug.ui.AbstractLaunchConfigurationTab; import org.eclipse.debug.ui.StringVariableSelectionDialog; -import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.layout.PixelConverter; +import org.eclipse.jface.viewers.ArrayContentProvider; +import org.eclipse.jface.viewers.ComboViewer; +import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.SWT; -import org.eclipse.swt.custom.StackLayout; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; @@ -82,10 +84,11 @@ public class GDBJtagDSFDebuggerTab extends AbstractLaunchConfigurationTab { private Text gdbCommand; private Button useRemote; + private Label jtagDeviceLabel; private Combo jtagDevice; - private Composite remoteConnectionParameters; - private StackLayout remoteConnectParmsLayout; - private Composite remoteConnectionBox; + private Label protocolLabel; + private ComboViewer protocol; + private Label connectionLabel; private Text connection; private String savedJtagDevice; protected Button fUpdateThreadlistOnSuspend; @@ -205,15 +208,13 @@ public class GDBJtagDSFDebuggerTab extends AbstractLaunchConfigurationTab { private void createRemoteControl(Composite parent) { Group group = new Group(parent, SWT.NONE); - GridLayout layout = new GridLayout(2, false); + GridLayout layout = new GridLayout(); group.setLayout(layout); - GridData gd = new GridData(GridData.FILL_HORIZONTAL); - gd.horizontalSpan = 2; - group.setLayoutData(gd); + group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); group.setText(Messages.getString("GDBJtagDebuggerTab.remoteGroup_Text")); //$NON-NLS-1$ useRemote = new Button(group, SWT.CHECK); - useRemote.setLayoutData(GridDataFactory.swtDefaults().span(2, 1).create()); + useRemote.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); useRemote.setText(Messages.getString("GDBJtagDebuggerTab.useRemote_Text")); //$NON-NLS-1$ useRemote.addSelectionListener(new SelectionAdapter() { @Override @@ -223,7 +224,16 @@ public class GDBJtagDSFDebuggerTab extends AbstractLaunchConfigurationTab { } }); - remoteTimeoutEnabled = new Button(group, SWT.CHECK); + Composite comp = new Composite(group, SWT.NONE); + layout = new GridLayout(); + layout.numColumns = 2; + layout.marginHeight = 0; + layout.marginLeft = new PixelConverter(group).convertHorizontalDLUsToPixels(8); + layout.marginRight = 0; + comp.setLayout(layout); + comp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + + remoteTimeoutEnabled = new Button(comp, SWT.CHECK); remoteTimeoutEnabled.setText(Messages.getString("GDBJtagDebuggerTab.remoteTimeout")); //$NON-NLS-1$ remoteTimeoutEnabled.setToolTipText(Messages.getString("GDBJtagDebuggerTab.remoteTimeoutTooltip")); //$NON-NLS-1$ remoteTimeoutEnabled.addSelectionListener(new SelectionAdapter() { @@ -233,22 +243,15 @@ public class GDBJtagDSFDebuggerTab extends AbstractLaunchConfigurationTab { updateLaunchConfigurationDialog(); } }); - remoteTimeoutValue = new Text(group, SWT.BORDER); - gd = new GridData(); - gd.widthHint = new PixelConverter(remoteTimeoutValue).convertWidthInCharsToPixels(10); - remoteTimeoutValue.setLayoutData(gd); + remoteTimeoutValue = new Text(comp, SWT.BORDER); + remoteTimeoutValue.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); remoteTimeoutValue.setToolTipText(Messages.getString("GDBJtagDebuggerTab.remoteTimeoutTooltip")); //$NON-NLS-1$ - Composite comp = new Composite(group, SWT.NONE); - layout = new GridLayout(); - layout.numColumns = 2; - comp.setLayout(layout); - comp.setLayoutData(GridDataFactory.swtDefaults().span(2, 1).grab(true, false).create()); - - Label label = new Label(comp, SWT.NONE); - label.setText(Messages.getString("GDBJtagDebuggerTab.jtagDeviceLabel")); //$NON-NLS-1$ + jtagDeviceLabel = new Label(comp, SWT.NONE); + jtagDeviceLabel.setText(Messages.getString("GDBJtagDebuggerTab.jtagDeviceLabel")); //$NON-NLS-1$ jtagDevice = new Combo(comp, SWT.READ_ONLY | SWT.DROP_DOWN); + jtagDevice.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); GDBJtagDeviceContribution[] availableDevices = GDBJtagDeviceContributionFactory.getInstance() .getGDBJtagDeviceContribution(); @@ -263,58 +266,50 @@ public class GDBJtagDSFDebuggerTab extends AbstractLaunchConfigurationTab { } }); - remoteConnectionParameters = new Composite(group, SWT.NO_TRIM | SWT.NO_FOCUS); - remoteConnectParmsLayout = new StackLayout(); - remoteConnectionParameters.setLayout(remoteConnectParmsLayout); - remoteConnectionParameters.setLayoutData(GridDataFactory.fillDefaults().span(2, 1).create()); + protocolLabel = new Label(comp, SWT.NONE); + protocolLabel.setText(Messages.getString("GDBJtagDebuggerTab.protocolLabel")); //$NON-NLS-1$ + protocol = new ComboViewer(comp, SWT.READ_ONLY | SWT.DROP_DOWN); + protocol.setContentProvider(new ArrayContentProvider()); + protocol.getCombo().setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); - // - // Create entry fields for other types of connections - // - - { - remoteConnectionBox = new Composite(remoteConnectionParameters, SWT.NO_TRIM | SWT.NO_FOCUS); - layout = new GridLayout(); - layout.numColumns = 2; - remoteConnectionBox.setLayout(layout); - remoteConnectionBox.setBackground(remoteConnectionParameters.getParent().getBackground()); - - label = new Label(remoteConnectionBox, SWT.NONE); - label.setText(Messages.getString("GDBJtagDebuggerTab.connectionLabel")); //$NON-NLS-1$ - connection = new Text(remoteConnectionBox, SWT.BORDER); - gd = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL); - connection.setLayoutData(gd); - } + connectionLabel = new Label(comp, SWT.NONE); + connectionLabel.setText(Messages.getString("GDBJtagDebuggerTab.connectionLabel")); //$NON-NLS-1$ + connection = new Text(comp, SWT.BORDER); + connection.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); // // Add watchers for user data entry // - connection.addModifyListener(new ModifyListener() { - @Override - public void modifyText(ModifyEvent e) { - scheduleUpdateJob(); // provides much better performance for Text listeners - } - }); + protocol.getCombo().addListener(SWT.Selection, e -> scheduleUpdateJob()); + connection.addListener(SWT.Modify, e -> scheduleUpdateJob()); } /** * @param text */ protected void updateDeviceIpPort(String selectedDeviceName) { - if (selectedDeviceName.equals(savedJtagDevice)) { - return; + if (!selectedDeviceName.equals(savedJtagDevice)) { + resetTargetParameters(selectedDeviceName); } + } + + private void resetTargetParameters(String deviceName) { GDBJtagDeviceContribution[] availableDevices = GDBJtagDeviceContributionFactory.getInstance() .getGDBJtagDeviceContribution(); IGDBJtagDevice selectedDevice = null; for (int i = 0; i < availableDevices.length; i++) { String name = availableDevices[i].getDeviceName(); - if (name.equals(selectedDeviceName)) { + if (name.equals(deviceName)) { selectedDevice = availableDevices[i].getDevice(); if (selectedDevice != null) { if (selectedDevice instanceof IGDBJtagConnection) { IGDBJtagConnection connectionDevice = (IGDBJtagConnection) selectedDevice; connection.setText(connectionDevice.getDefaultDeviceConnection()); + String[] protocols = connectionDevice.getDeviceProtocols(); + protocol.setInput(protocols); + if (0 != protocols.length) { + protocol.setSelection(new StructuredSelection(protocols[0])); + } } useRemoteChanged(); updateLaunchConfigurationDialog(); @@ -331,24 +326,13 @@ public class GDBJtagDSFDebuggerTab extends AbstractLaunchConfigurationTab { private void useRemoteChanged() { boolean enabled = useRemote.getSelection(); remoteTimeoutEnabled.setEnabled(enabled); - remoteTimeoutValue.setEnabled(remoteTimeoutEnabled.getSelection()); + remoteTimeoutValue.setEnabled(enabled && remoteTimeoutEnabled.getSelection()); + jtagDeviceLabel.setEnabled(enabled); jtagDevice.setEnabled(enabled); + protocolLabel.setEnabled(enabled); + protocol.getCombo().setEnabled(enabled); + connectionLabel.setEnabled(enabled); connection.setEnabled(enabled); - GDBJtagDeviceContribution selectedDeviceEntry = GDBJtagDeviceContributionFactory.getInstance() - .findByDeviceName(jtagDevice.getText()); - if ((selectedDeviceEntry == null) || (selectedDeviceEntry.getDevice() == null)) { - remoteConnectParmsLayout.topControl = null; - remoteConnectionParameters.layout(); - } else { - IGDBJtagDevice device = selectedDeviceEntry.getDevice(); - if (device instanceof IGDBJtagConnection) { - remoteConnectParmsLayout.topControl = remoteConnectionBox; - remoteConnectionBox.getParent().layout(); - } else { - remoteConnectParmsLayout.topControl = null; - remoteConnectionParameters.layout(); - } - } } /** @@ -434,28 +418,31 @@ public class GDBJtagDSFDebuggerTab extends AbstractLaunchConfigurationTab { String storedAddress = ""; //$NON-NLS-1$ int storedPort = -1; String storedConnection = null; + String storedProtocol = null; for (int i = 0; i < jtagDevice.getItemCount(); i++) { if (jtagDevice.getItem(i).equals(savedJtagDevice)) { storedAddress = configuration.getAttribute(IGDBJtagConstants.ATTR_IP_ADDRESS, ""); //$NON-NLS-1$ storedPort = configuration.getAttribute(IGDBJtagConstants.ATTR_PORT_NUMBER, -1); storedConnection = configuration.getAttribute(IGDBJtagConstants.ATTR_CONNECTION, (String) null); + storedProtocol = configuration.getAttribute(IGDBJtagConstants.ATTR_PROTOCOL, (String) null); jtagDevice.select(i); + resetTargetParameters(savedJtagDevice); break; } } - - String connectionText = IGDBJtagConstants.DEFAULT_CONNECTION; + if (null != storedProtocol) { + protocol.setSelection(new StructuredSelection(storedProtocol)); + } if (null != storedConnection) { // if a connection URI try { - connectionText = new URI(storedConnection).getSchemeSpecificPart(); + connection.setText(new URI(storedConnection).getSchemeSpecificPart()); } catch (URISyntaxException e) { Activator.log(e); } } else if (storedPort != -1) { // if a legacy address:port - connectionText = String.format("%s:%d", storedAddress, storedPort); //$NON-NLS-1$ + connection.setText(String.format("%s:%d", storedAddress, storedPort)); //$NON-NLS-1$ } - connection.setText(connectionText); } boolean updateThreadsOnSuspend = configuration.getAttribute( IGDBLaunchConfigurationConstants.ATTR_DEBUGGER_UPDATE_THREADLIST_ON_SUSPEND, @@ -505,10 +492,12 @@ public class GDBJtagDSFDebuggerTab extends AbstractLaunchConfigurationTab { if (device instanceof IGDBJtagConnection) { String conn = connection.getText().trim(); URI uri = new URI("gdb", conn, ""); //$NON-NLS-1$ //$NON-NLS-2$ + configuration.setAttribute(IGDBJtagConstants.ATTR_PROTOCOL, protocol.getCombo().getText()); configuration.setAttribute(IGDBJtagConstants.ATTR_CONNECTION, uri.toString()); configuration.removeAttribute(IGDBJtagConstants.ATTR_IP_ADDRESS); configuration.removeAttribute(IGDBJtagConstants.ATTR_PORT_NUMBER); } else { + configuration.removeAttribute(IGDBJtagConstants.ATTR_PROTOCOL); configuration.removeAttribute(IGDBJtagConstants.ATTR_CONNECTION); } } catch (URISyntaxException e) { diff --git a/jtag/org.eclipse.cdt.debug.gdbjtag.ui/src/org/eclipse/cdt/debug/gdbjtag/ui/JtagUi.properties b/jtag/org.eclipse.cdt.debug.gdbjtag.ui/src/org/eclipse/cdt/debug/gdbjtag/ui/JtagUi.properties index 320a02cf8be..d0c96d7cb0a 100644 --- a/jtag/org.eclipse.cdt.debug.gdbjtag.ui/src/org/eclipse/cdt/debug/gdbjtag/ui/JtagUi.properties +++ b/jtag/org.eclipse.cdt.debug.gdbjtag.ui/src/org/eclipse/cdt/debug/gdbjtag/ui/JtagUi.properties @@ -65,11 +65,12 @@ GDBJtagDebuggerTab.miProtocolLabel=Protocol Version: GDBJtagDebuggerTab.verboseModeLabel=Verbose console mode GDBJtagDebuggerTab.remoteGroup_Text=Remote Target GDBJtagDebuggerTab.useRemote_Text=Use remote target -GDBJtagDebuggerTab.jtagDeviceLabel=JTAG Device: +GDBJtagDebuggerTab.jtagDeviceLabel=Debug server: GDBJtagDebuggerTab.ipAddressLabel=Host name or IP address: GDBJtagDebuggerTab.portNumberLabel=Port number: -GDBJtagDebuggerTab.connectionLabel=GDB Connection String: +GDBJtagDebuggerTab.protocolLabel=Protocol: +GDBJtagDebuggerTab.connectionLabel=Connection: GDBJtagDebuggerTab.update_thread_list_on_suspend=Force thread list update on suspend -GDBJtagDebuggerTab.remoteTimeout=Remote timeout (seconds): +GDBJtagDebuggerTab.remoteTimeout=Timeout (seconds): GDBJtagDebuggerTab.remoteTimeoutTooltip=Timeout for the remote target to respond. If unchecked, uses GDB default value. See GDB's help for "set remotetimeout num". GDBJtagDebuggerTab.tabName=Debugger |
