1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
#!/usr/bin/env dss.sh
//
// Debug Server Scripting C6x launcher.
//
importPackage(Packages.com.ti.debug.engine.scripting);
importPackage(Packages.com.ti.ccstudio.scripting.environment);
importPackage(Packages.java.lang);
if (arguments.length == 0) {
// Extract script name from eclipse
var regex = new RegExp("-dss\\.rhinoArgs\n(.*)");
var matches = regex.exec(environment["eclipse.commands"]);
System.err.println("Usage: " + matches[1] + " executable [args]");
System.err.println();
System.err.println("You're also required to set CCSTARGETCONFIG " +
"environment variable to appoint");
System.err.println("proper .ccxml file, customarily one of " +
"$HOME/ti/CCSTargetConfigurations/*.ccxml");
quit(1);
}
try {
var prog = arguments[0];
var script = ScriptingEnvironment.instance();
var debugServer = script.getServer("DebugServer.1");
// CCSTARGETCONFIG environment variable should point at proper .ccxml,
// customarily one of $HOME/ti/CCSTargetConfigurations/*.ccxml.
debugServer.setConfig(System.getenv("CCSTARGETCONFIG"));
var debugSession = debugServer.openSession("*", "*");
// Redirect GEL output to |prog|.gel file, so that it doesn't clobber
// standard output from the program...
var dot = prog.lastIndexOf(".");
var gel_out = prog + ".gel";
if (dot > 0) {
gel_out = prog.substr(0,dot) + ".gel";
}
debugSession.expression.evaluate('GEL_EnableFileOutput("'
+ gel_out + '", 0, 0)');
debugSession.target.connect();
// It should be noted that "current working directory" for program
// executed on the target system is one where |prog| resides, and
// not where script executed [as one would expect]...
debugSession.memory.loadProgram(prog, arguments);
// Pull exit()'s address and set breakpoint, then just execute till
// it's reached...
var exitAddr = debugSession.symbol.getAddress("exit");
debugSession.breakpoint.add(exitAddr);
while (1) {
debugSession.target.run();
var PC = debugSession.expression.evaluate("PC");
if (PC == exitAddr) {
break;
}
}
// Snatch value passed to exit(), so that it can be passed down to
// shell as exit code from this script...
var exitCode = debugSession.expression.evaluate("A4");
// Last run to termination...
debugSession.target.run();
// Clean up...
debugSession.terminate();
debugServer.stop();
// It should be noted that there is kind of a bug in C6x run-time.
// Return value from main() is not passed to last implicit exit()
// call [as it would on other systems], but instead constant 1 is
// passed, which conventionally indicates an error. So that if one
// wants to pass specific exit code, or even 0 indicating "success",
// one has to call exit() explicitly instead of relying on value
// returned by main()...
quit(exitCode);
} catch (e) {
// We catch everything, because default handler terminates script with
// "success" exit code upon exception...
System.err.println(e.rhinoException);
quit(139);
}
|