rp2040js 0.17.0 → 0.17.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -11,6 +11,27 @@ const logging_1 = require("../utils/logging");
11
11
  const gdb_utils_1 = require("./gdb-utils");
12
12
  exports.STOP_REPLY_SIGINT = 'S02';
13
13
  exports.STOP_REPLY_TRAP = 'S05';
14
+ /* string value: armv6m-none-unknown-eabi */
15
+ const lldbTriple = '61726d76366d2d6e6f6e652d756e6b6e6f776e2d65616269';
16
+ const registers = [
17
+ `name:r0;bitsize:32;offset:0;encoding:int;format:hex;set:General Purpose Registers;generic:arg1;gcc:0;dwarf:0;`,
18
+ `name:r1;bitsize:32;offset:4;encoding:int;format:hex;set:General Purpose Registers;generic:arg2;gcc:1;dwarf:1;`,
19
+ `name:r2;bitsize:32;offset:8;encoding:int;format:hex;set:General Purpose Registers;generic:arg3;gcc:2;dwarf:2;`,
20
+ `name:r3;bitsize:32;offset:12;encoding:int;format:hex;set:General Purpose Registers;generic:arg4;gcc:3;dwarf:3;`,
21
+ `name:r4;bitsize:32;offset:16;encoding:int;format:hex;set:General Purpose Registers;gcc:4;dwarf:4;`,
22
+ `name:r5;bitsize:32;offset:20;encoding:int;format:hex;set:General Purpose Registers;gcc:5;dwarf:5;`,
23
+ `name:r6;bitsize:32;offset:24;encoding:int;format:hex;set:General Purpose Registers;gcc:6;dwarf:6;`,
24
+ `name:r7;bitsize:32;offset:28;encoding:int;format:hex;set:General Purpose Registers;gcc:7;dwarf:7;`,
25
+ `name:r8;bitsize:32;offset:32;encoding:int;format:hex;set:General Purpose Registers;gcc:8;dwarf:8;`,
26
+ `name:r9;bitsize:32;offset:36;encoding:int;format:hex;set:General Purpose Registers;gcc:9;dwarf:9;`,
27
+ `name:r10;bitsize:32;offset:40;encoding:int;format:hex;set:General Purpose Registers;gcc:10;dwarf:10;`,
28
+ `name:r11;bitsize:32;offset:44;encoding:int;format:hex;set:General Purpose Registers;generic:fp;gcc:11;dwarf:11;`,
29
+ `name:r12;bitsize:32;offset:48;encoding:int;format:hex;set:General Purpose Registers;gcc:12;dwarf:12;`,
30
+ `name:sp;bitsize:32;offset:52;encoding:int;format:hex;set:General Purpose Registers;generic:sp;alt-name:r13;gcc:13;dwarf:13;`,
31
+ `name:lr;bitsize:32;offset:56;encoding:int;format:hex;set:General Purpose Registers;generic:ra;alt-name:r14;gcc:14;dwarf:14;`,
32
+ `name:pc;bitsize:32;offset:60;encoding:int;format:hex;set:General Purpose Registers;generic:pc;alt-name:r15;gcc:15;dwarf:15;`,
33
+ `name:cpsr;bitsize:32;offset:64;encoding:int;format:hex;set:General Purpose Registers;generic:flags;alt-name:psr;gcc:16;dwarf:16;`,
34
+ ];
14
35
  const targetXML = `<?xml version="1.0"?>
15
36
  <!DOCTYPE target SYSTEM "gdb-target.dtd">
16
37
  <target version="1.0">
@@ -70,6 +91,22 @@ class GDBServer {
70
91
  if (cmd.startsWith('qXfer:features:read:target.xml')) {
71
92
  return gdb_utils_1.gdbMessage('l' + targetXML);
72
93
  }
94
+ if (cmd.startsWith('qRegisterInfo')) {
95
+ const index = parseInt(cmd.substring(13), 16);
96
+ const register = registers[index];
97
+ if (register) {
98
+ return gdb_utils_1.gdbMessage(register);
99
+ }
100
+ else {
101
+ return gdb_utils_1.gdbMessage(`E45`);
102
+ }
103
+ }
104
+ if (cmd === 'qHostInfo') {
105
+ return gdb_utils_1.gdbMessage(`triple:${lldbTriple};endian:little;ptrsize:4;`);
106
+ }
107
+ if (cmd === 'qProcessInfo') {
108
+ return gdb_utils_1.gdbMessage('pid:1;endian:little;ptrsize:4;');
109
+ }
73
110
  return gdb_utils_1.gdbMessage('');
74
111
  case 'v':
75
112
  if (cmd === 'vCont?') {
@@ -83,14 +120,19 @@ class GDBServer {
83
120
  }
84
121
  if (cmd.startsWith('vCont;s')) {
85
122
  rp2040.step();
86
- return gdb_utils_1.gdbMessage(exports.STOP_REPLY_TRAP);
123
+ const registerStatus = [];
124
+ for (let i = 0; i < 17; i++) {
125
+ const value = i === 16 ? core.xPSR : core.registers[i];
126
+ registerStatus.push(`${gdb_utils_1.encodeHexByte(i)}:${gdb_utils_1.encodeHexUint32(value)}`);
127
+ }
128
+ return gdb_utils_1.gdbMessage(`T05${registerStatus.join(';')};reason:trace;`);
87
129
  }
88
130
  break;
89
131
  case 'c':
90
132
  if (!rp2040.executing) {
91
133
  rp2040.execute();
92
134
  }
93
- break;
135
+ return gdb_utils_1.gdbMessage('OK');
94
136
  case 'g': {
95
137
  // Read registers
96
138
  const buf = new Uint32Array(17);
@@ -87,7 +87,7 @@ function irqIndex(irq, machineIndex) {
87
87
  return rel ? (irq & 0x4) | (((irq & 0x3) + machineIndex) & 0x3) : irq & 0x7;
88
88
  }
89
89
  const dreqRx0 = [
90
- dma_1.DREQChannel.DREQ_PIO1_RX0,
90
+ dma_1.DREQChannel.DREQ_PIO0_RX0,
91
91
  dma_1.DREQChannel.DREQ_PIO0_RX1,
92
92
  dma_1.DREQChannel.DREQ_PIO0_RX2,
93
93
  dma_1.DREQChannel.DREQ_PIO0_RX3,
@@ -8,6 +8,27 @@ import { ConsoleLogger, LogLevel } from '../utils/logging';
8
8
  import { decodeHexBuf, encodeHexBuf, encodeHexByte, encodeHexUint32, gdbMessage, } from './gdb-utils';
9
9
  export const STOP_REPLY_SIGINT = 'S02';
10
10
  export const STOP_REPLY_TRAP = 'S05';
11
+ /* string value: armv6m-none-unknown-eabi */
12
+ const lldbTriple = '61726d76366d2d6e6f6e652d756e6b6e6f776e2d65616269';
13
+ const registers = [
14
+ `name:r0;bitsize:32;offset:0;encoding:int;format:hex;set:General Purpose Registers;generic:arg1;gcc:0;dwarf:0;`,
15
+ `name:r1;bitsize:32;offset:4;encoding:int;format:hex;set:General Purpose Registers;generic:arg2;gcc:1;dwarf:1;`,
16
+ `name:r2;bitsize:32;offset:8;encoding:int;format:hex;set:General Purpose Registers;generic:arg3;gcc:2;dwarf:2;`,
17
+ `name:r3;bitsize:32;offset:12;encoding:int;format:hex;set:General Purpose Registers;generic:arg4;gcc:3;dwarf:3;`,
18
+ `name:r4;bitsize:32;offset:16;encoding:int;format:hex;set:General Purpose Registers;gcc:4;dwarf:4;`,
19
+ `name:r5;bitsize:32;offset:20;encoding:int;format:hex;set:General Purpose Registers;gcc:5;dwarf:5;`,
20
+ `name:r6;bitsize:32;offset:24;encoding:int;format:hex;set:General Purpose Registers;gcc:6;dwarf:6;`,
21
+ `name:r7;bitsize:32;offset:28;encoding:int;format:hex;set:General Purpose Registers;gcc:7;dwarf:7;`,
22
+ `name:r8;bitsize:32;offset:32;encoding:int;format:hex;set:General Purpose Registers;gcc:8;dwarf:8;`,
23
+ `name:r9;bitsize:32;offset:36;encoding:int;format:hex;set:General Purpose Registers;gcc:9;dwarf:9;`,
24
+ `name:r10;bitsize:32;offset:40;encoding:int;format:hex;set:General Purpose Registers;gcc:10;dwarf:10;`,
25
+ `name:r11;bitsize:32;offset:44;encoding:int;format:hex;set:General Purpose Registers;generic:fp;gcc:11;dwarf:11;`,
26
+ `name:r12;bitsize:32;offset:48;encoding:int;format:hex;set:General Purpose Registers;gcc:12;dwarf:12;`,
27
+ `name:sp;bitsize:32;offset:52;encoding:int;format:hex;set:General Purpose Registers;generic:sp;alt-name:r13;gcc:13;dwarf:13;`,
28
+ `name:lr;bitsize:32;offset:56;encoding:int;format:hex;set:General Purpose Registers;generic:ra;alt-name:r14;gcc:14;dwarf:14;`,
29
+ `name:pc;bitsize:32;offset:60;encoding:int;format:hex;set:General Purpose Registers;generic:pc;alt-name:r15;gcc:15;dwarf:15;`,
30
+ `name:cpsr;bitsize:32;offset:64;encoding:int;format:hex;set:General Purpose Registers;generic:flags;alt-name:psr;gcc:16;dwarf:16;`,
31
+ ];
11
32
  const targetXML = `<?xml version="1.0"?>
12
33
  <!DOCTYPE target SYSTEM "gdb-target.dtd">
13
34
  <target version="1.0">
@@ -67,6 +88,22 @@ export class GDBServer {
67
88
  if (cmd.startsWith('qXfer:features:read:target.xml')) {
68
89
  return gdbMessage('l' + targetXML);
69
90
  }
91
+ if (cmd.startsWith('qRegisterInfo')) {
92
+ const index = parseInt(cmd.substring(13), 16);
93
+ const register = registers[index];
94
+ if (register) {
95
+ return gdbMessage(register);
96
+ }
97
+ else {
98
+ return gdbMessage(`E45`);
99
+ }
100
+ }
101
+ if (cmd === 'qHostInfo') {
102
+ return gdbMessage(`triple:${lldbTriple};endian:little;ptrsize:4;`);
103
+ }
104
+ if (cmd === 'qProcessInfo') {
105
+ return gdbMessage('pid:1;endian:little;ptrsize:4;');
106
+ }
70
107
  return gdbMessage('');
71
108
  case 'v':
72
109
  if (cmd === 'vCont?') {
@@ -80,14 +117,19 @@ export class GDBServer {
80
117
  }
81
118
  if (cmd.startsWith('vCont;s')) {
82
119
  rp2040.step();
83
- return gdbMessage(STOP_REPLY_TRAP);
120
+ const registerStatus = [];
121
+ for (let i = 0; i < 17; i++) {
122
+ const value = i === 16 ? core.xPSR : core.registers[i];
123
+ registerStatus.push(`${encodeHexByte(i)}:${encodeHexUint32(value)}`);
124
+ }
125
+ return gdbMessage(`T05${registerStatus.join(';')};reason:trace;`);
84
126
  }
85
127
  break;
86
128
  case 'c':
87
129
  if (!rp2040.executing) {
88
130
  rp2040.execute();
89
131
  }
90
- break;
132
+ return gdbMessage('OK');
91
133
  case 'g': {
92
134
  // Read registers
93
135
  const buf = new Uint32Array(17);
@@ -84,7 +84,7 @@ function irqIndex(irq, machineIndex) {
84
84
  return rel ? (irq & 0x4) | (((irq & 0x3) + machineIndex) & 0x3) : irq & 0x7;
85
85
  }
86
86
  const dreqRx0 = [
87
- DREQChannel.DREQ_PIO1_RX0,
87
+ DREQChannel.DREQ_PIO0_RX0,
88
88
  DREQChannel.DREQ_PIO0_RX1,
89
89
  DREQChannel.DREQ_PIO0_RX2,
90
90
  DREQChannel.DREQ_PIO0_RX3,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rp2040js",
3
- "version": "0.17.0",
3
+ "version": "0.17.2",
4
4
  "description": "Raspberry Pi Pico (RP2040) Emulator",
5
5
  "repository": "https://github.com/wokwi/rp2040js",
6
6
  "keywords": [