MCPcopy Create free account
hub / github.com/Marus/cortex-debug / getProtocolDisassembly

Method getProtocolDisassembly

src/backend/disasm.ts:495–561  ·  view source on GitHub ↗
(range: DisasmRange, args: DebugProtocol.DisassembleArguments)

Source from the content-addressed store, hash-verified

493 }
494
495 protected getProtocolDisassembly(range: DisasmRange, args: DebugProtocol.DisassembleArguments): Promise<DisassemblyReturn | Error> {
496 let startAddress = range.qStart;
497 const endAddress = range.qEnd;
498 const validationAddr = range.verify;
499 // To annotate questionable instructions. Too lazy to do on per instruction basis
500 return new Promise<DisassemblyReturn | Error>(async (resolve) => {
501 let iter = 0;
502 const maxTries = Math.ceil((this.maxInstrSize - this.minInstrSize) / this.instrMultiple);
503 const doWork = () => {
504 const old = this.findInCache(startAddress, endAddress);
505 if (old) {
506 const foundIx = old.findInstrIndex(validationAddr);
507 if (foundIx < 0) {
508 const msg = `Bad instruction cache. Could not find address ${validationAddr} that should have been found`;
509 this.handleMsg('log', msg + '\n');
510 resolve(new Error(msg));
511 } else {
512 resolve(new DisassemblyReturn(old.instructions, foundIx));
513 }
514 return;
515 }
516
517 const entireRangeGood = range.isKnownStart || this.isRangeInValidMem(startAddress, endAddress);
518 const end = endAddress;
519 // const end = range.isData ? endAddress : this.clipHigh(endAddress, endAddress + this.maxInstrSize); // Get a bit more for functions
520 let cmd: string;
521 cmd = `data-disassemble -s ${hexFormat(startAddress)} -e ${hexFormat(end)} -- 5`;
522 if (this.doTiming) {
523 const symName = range.symNode ? ` (${range.symNode.symbol.name})` : '';
524 const count = `${end - startAddress} bytes`.padStart(15);
525 this.handleMsg('log', `Debug: Gdb command: -${cmd}${count} ${symName}\n`);
526 }
527 this.miDebugger.sendCommand(cmd, false, false, true).then((result) => {
528 try {
529 const ret = this.parseDisassembleResults(result, validationAddr, entireRangeGood, cmd);
530 const foundIx = ret.foundAt;
531 if (foundIx < 0) {
532 if (GdbDisassembler.debug) {
533 const msg = `Could not disassemble at this address Looking for ${hexFormat(validationAddr)}: ${cmd} `;
534 console.log(msg, ret.instructions);
535 }
536 if ((startAddress >= this.instrMultiple) && (iter < maxTries)) {
537 iter++;
538 startAddress -= this.instrMultiple; // Try again with this address
539 doWork();
540 } else {
541 const msg = `Error: Could not disassemble at this address ${hexFormat(validationAddr)} ` + JSON.stringify(args);
542 this.handleMsg('log', msg + '\n');
543 resolve(new Error(msg));
544 }
545 } else {
546 const instrRange = new InstructionRange(ret.instructions);
547 this.addToCache(instrRange);
548 resolve(ret);
549 }
550 }
551 catch (e) {
552 resolve(e);

Callers 1

Calls

no outgoing calls

Tested by

no test coverage detected