From bc7402b1faa9299410892f5d519169c7e15f23c7 Mon Sep 17 00:00:00 2001 From: ghidorahrex Date: Fri, 5 Jan 2024 10:10:55 -0500 Subject: [PATCH 1/2] GP-4104: Fixed address offset in HCS12 PPAGE calculation --- Ghidra/Processors/HCS12/data/languages/HCS_HC12.sinc | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Ghidra/Processors/HCS12/data/languages/HCS_HC12.sinc b/Ghidra/Processors/HCS12/data/languages/HCS_HC12.sinc index df02f01fe4..26ff2c0eaa 100644 --- a/Ghidra/Processors/HCS12/data/languages/HCS_HC12.sinc +++ b/Ghidra/Processors/HCS12/data/languages/HCS_HC12.sinc @@ -333,10 +333,10 @@ macro Store(addr, value) { # macro pageCAddr(addr, shift, page, offset) { - addr = (page << shift) | offset; + addr = addr | ((page << shift) | offset); } macro pagePAddr(addr, shift, page, offset) { - addr = (zext(page) << shift) | offset; + addr = addr | ((zext(page) << shift) | offset); } @if defined(HCS12X) @@ -400,7 +400,7 @@ page: imm8 is imm8 { export *[const]:1 imm8; } #PageDest: dest is imm16p=0xd & imm16 & imm16pv ; imm8 [ dest = ($(MAXFLASHPage) << 16) | imm16; ] { export *:1 dest; } #PageDest: dest is imm16p=0xe & imm16 & imm16pv ; imm8 [ dest = ($(MAXFLASHPage) << 16) | imm16; ] { export *:1 dest; } #PageDest: dest is imm16p=0xf & imm16 & imm16pv ; imm8 [ dest = ($(MAXFLASHPage) << 16) | imm16; ] { export *:1 dest; } -PageDest: opr16a is opr16a; page { export opr16a; } +PageDest: opr16a is opr16a; page { export opr16a; } @else @@ -2084,7 +2084,6 @@ CallDest: PageDest, imm8 is (imm16; imm8) & PageDest { local ppage_tmp:1 = PPAGE; Push1( PPAGE ); - build CallDest; local dest:$(SIZE) = CallDest; From 01ae06d0f8ec424478ee2921a65e733a9198ab80 Mon Sep 17 00:00:00 2001 From: Dan <46821332+nsadeveloper789@users.noreply.github.com> Date: Thu, 4 Jan 2024 11:01:07 -0500 Subject: [PATCH 2/2] GP-4198: Distribute Trace RMI clients (python). ASIDE: Fix terminal buffer overflow. --- .../data/debugger-launchers/local-dbgeng.bat | 11 +++-- .../data/debugger-launchers/local-gdb.sh | 9 ++-- .../core/terminal/ThreadedTerminal.java | 17 +++++--- .../app/plugin/core/terminal/vt/VtParser.java | 43 +++++++++++++++++++ .../app/plugin/core/terminal/vt/VtState.java | 8 ++-- gradle/debugger/hasPythonPackage.gradle | 16 ++++++- 6 files changed, 86 insertions(+), 18 deletions(-) diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/data/debugger-launchers/local-dbgeng.bat b/Ghidra/Debug/Debugger-agent-dbgeng/data/debugger-launchers/local-dbgeng.bat index 4321b2a224..276585318b 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/data/debugger-launchers/local-dbgeng.bat +++ b/Ghidra/Debug/Debugger-agent-dbgeng/data/debugger-launchers/local-dbgeng.bat @@ -18,14 +18,17 @@ @echo off if exist "%GHIDRA_HOME%\ghidra\.git\" ( - set PYTHONPATH=%GHIDRA_HOME%\ghidra\Ghidra\Debug\Debugger-agent-dbgeng\build\pypkg\src;%GHIDRA_HOME%\ghidra\Ghidra\Debug\Debugger-rmi-trace\build\pypkg\src;%PYTHONPATH% + set PYTHONPATH=%GHIDRA_HOME%\ghidra\Ghidra\Debug\Debugger-agent-dbgeng\build\pypkg\src;%PYTHONPATH% + set PYTHONPATH=%GHIDRA_HOME%\ghidra\Ghidra\Debug\Debugger-rmi-trace\build\pypkg\src;%PYTHONPATH% ) else if exist "%GHIDRA_HOME%\.git\" ( - set PYTHONPATH=%GHIDRA_HOME%\Ghidra\Debug\Debugger-agent-dbgeng\build\pypkg\src;%GHIDRA_HOME%\Ghidra\Debug\Debugger-rmi-trace\build\pypkg\src;%PYTHONPATH% + set PYTHONPATH=%GHIDRA_HOME%\Ghidra\Debug\Debugger-agent-dbgeng\build\pypkg\src;%PYTHONPATH% + set PYTHONPATH=%GHIDRA_HOME%\Ghidra\Debug\Debugger-rmi-trace\build\pypkg\src;%PYTHONPATH% ) else ( - set PYTHONPATH=%GHIDRA_HOME%\Ghidra\Debug\Debugger-agent-dbgeng\pypkg\src;%GHIDRA_HOME%\Ghidra\Debug\Debugger-rmi-trace\pypkg\src;%PYTHONPATH% + set PYTHONPATH=%GHIDRA_HOME%\Ghidra\Debug\Debugger-agent-dbgeng\pypkg\src;%PYTHONPATH% + set PYTHONPATH=%GHIDRA_HOME%\Ghidra\Debug\Debugger-rmi-trace\pypkg\src;%PYTHONPATH% ) echo PYTHONPATH is %PYTHONPATH% -echo bat OPT_TARGET_IMG is [%OPT_TARGET_IMG%] +echo OPT_TARGET_IMG is [%OPT_TARGET_IMG%] "%OPT_PYTHON_EXE%" -i ..\support\local-dbgeng.py diff --git a/Ghidra/Debug/Debugger-agent-gdb/data/debugger-launchers/local-gdb.sh b/Ghidra/Debug/Debugger-agent-gdb/data/debugger-launchers/local-gdb.sh index e27b0210ff..cd59acac6b 100755 --- a/Ghidra/Debug/Debugger-agent-gdb/data/debugger-launchers/local-gdb.sh +++ b/Ghidra/Debug/Debugger-agent-gdb/data/debugger-launchers/local-gdb.sh @@ -33,12 +33,15 @@ if [ -d ${GHIDRA_HOME}/ghidra/.git ] then - export PYTHONPATH=$GHIDRA_HOME/ghidra/Ghidra/Debug/Debugger-agent-gdb/build/pypkg/src:$GHIDRA_HOME/ghidra/Ghidra/Debug/Debugger-rmi-trace/build/pypkg/src:$PYTHONPATH + export PYTHONPATH=$GHIDRA_HOME/ghidra/Ghidra/Debug/Debugger-agent-gdb/build/pypkg/src:$PYTHONPATH + export PYTHONPATH=$GHIDRA_HOME/ghidra/Ghidra/Debug/Debugger-rmi-trace/build/pypkg/src:$PYTHONPATH elif [ -d ${GHIDRA_HOME}/.git ] then - export PYTHONPATH=$GHIDRA_HOME/Ghidra/Debug/Debugger-agent-gdb/build/pypkg/src:$GHIDRA_HOME/Ghidra/Debug/Debugger-rmi-trace/build/pypkg/src:$PYTHONPATH + export PYTHONPATH=$GHIDRA_HOME/Ghidra/Debug/Debugger-agent-gdb/build/pypkg/src:$PYTHONPATH + export PYTHONPATH=$GHIDRA_HOME/Ghidra/Debug/Debugger-rmi-trace/build/pypkg/src:$PYTHONPATH else - export PYTHONPATH=$GHIDRA_HOME/Ghidra/Debug/Debugger-agent-gdb/pypkg/src:$GHIDRA_HOME/Ghidra/Debug/Debugger-rmi-trace/build/pypkg/src:$PYTHONPATH + export PYTHONPATH=$GHIDRA_HOME/Ghidra/Debug/Debugger-agent-gdb/pypkg/src:$PYTHONPATH + export PYTHONPATH=$GHIDRA_HOME/Ghidra/Debug/Debugger-rmi-trace/pypkg/src:$PYTHONPATH fi target_image="$1" diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/terminal/ThreadedTerminal.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/terminal/ThreadedTerminal.java index 774a9a5272..497639fa7d 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/terminal/ThreadedTerminal.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/terminal/ThreadedTerminal.java @@ -86,8 +86,8 @@ public class ThreadedTerminal extends DefaultTerminal { } protected void pump() { - try { - while (!closed) { + while (!closed) { + try { if (-1 == in.read(buffer) || closed) { return; } @@ -98,10 +98,15 @@ public class ThreadedTerminal extends DefaultTerminal { } buffer.clear(); } - } - catch (IOException e) { - Msg.error(this, "Console input closed unexpectedly: " + e); - closed = true; + catch (IOException e) { + Msg.error(this, "Console input closed unexpectedly: " + e); + closed = true; + return; + } + catch (Exception e) { + Msg.error(this, "Unexpected error processing terminal input", e); + continue; + } } } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/terminal/vt/VtParser.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/terminal/vt/VtParser.java index 7e14ba8fba..3d77cb4b6c 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/terminal/vt/VtParser.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/terminal/vt/VtParser.java @@ -43,6 +43,49 @@ public class VtParser { this.handler = handler; } + protected static ByteBuffer copyDoubledCapacity(ByteBuffer oldBuf) { + ByteBuffer newBuf = ByteBuffer.allocate(oldBuf.capacity() * 2); + oldBuf.flip(); + newBuf.put(oldBuf); + return newBuf; + } + + /** + * Append a byte to {@link #csiParam}, resizing if necessary + * + * @param b the byte + */ + protected void putCsiParamByte(byte b) { + if (!csiParam.hasRemaining()) { + csiParam = copyDoubledCapacity(csiParam); + } + csiParam.put(b); + } + + /** + * Append a byte to {@link #csiInter}, resizing if necessary + * + * @param b the byte + */ + protected void putCsiInterByte(byte b) { + if (!csiInter.hasRemaining()) { + csiInter = copyDoubledCapacity(csiInter); + } + csiInter.put(b); + } + + /** + * Append a byte to {@link #oscParam}, resizing if necessary + * + * @param b the byte + */ + protected void putOscParamByte(byte b) { + if (!oscParam.hasRemaining()) { + oscParam = copyDoubledCapacity(oscParam); + } + oscParam.put(b); + } + /** * Create a copy of the CSI buffers, reconstructed as they were in the original stream. * diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/terminal/vt/VtState.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/terminal/vt/VtState.java index e6b76edb9f..b0eba58043 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/terminal/vt/VtState.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/terminal/vt/VtState.java @@ -226,11 +226,11 @@ public enum VtState { @Override protected VtState handleNext(byte b, VtParser parser, VtHandler handler) { if (0x30 <= b && b <= 0x3f) { - parser.csiParam.put(b); + parser.putCsiParamByte(b); return CSI_PARAM; } if (0x20 <= b && b <= 0x2f) { - parser.csiInter.put(b); + parser.putCsiInterByte(b); return CSI_INTER; } if (0x40 <= b && b <= 0x7e) { @@ -249,7 +249,7 @@ public enum VtState { @Override protected VtState handleNext(byte b, VtParser parser, VtHandler handler) { if (0x20 <= b && b <= 0x2f) { - parser.csiInter.put(b); + parser.putCsiInterByte(b); return CSI_INTER; } if (0x40 <= b && b <= 0x7e) { @@ -269,7 +269,7 @@ public enum VtState { protected VtState handleNext(byte b, VtParser parser, VtHandler handler) { // For whatever reason, Windows includes the null terminator in titles if (0x20 <= b && b <= 0x7f || b == 0) { - parser.oscParam.put(b); + parser.putOscParamByte(b); return OSC_PARAM; } if (b == 0x07) { diff --git a/gradle/debugger/hasPythonPackage.gradle b/gradle/debugger/hasPythonPackage.gradle index 456fbc8870..4ce93ea36f 100644 --- a/gradle/debugger/hasPythonPackage.gradle +++ b/gradle/debugger/hasPythonPackage.gradle @@ -25,5 +25,19 @@ task buildPyPackage(type: Exec) { outputs.dir(dist) workingDir { "build/pypkg" } - commandLine "python", "-m", "build" + commandLine "python3", "-m", "build" +} + +// At the moment, any module with a python package also distributes it. +// We can separate this into `distributePythonPackage` later, if necessary. + +rootProject.assembleDistribution { + def p = this.project + def zipPath = getZipPath(p) + from (p.assemblePyPackage) { + exclude '**/*.pyc' + exclude '**/*.pyo' + exclude '**/__pycache__/**' + into { zipPath + "/pypkg" } + } }