{"record":{"id":"396191f59d0ada5d","repo":"NationalSecurityAgency/ghidra","slug":"unknown-context-register","errorCode":null,"errorMessage":"Unknown context register ","messagePattern":"Unknown context register ","errorType":"exception","errorClass":"JDOMException","httpStatus":null,"severity":"error","filePath":"Ghidra/Extensions/SleighDevTools/src/main/java/ghidra/app/util/disassemble/GNUExternalDisassembler.java","lineNumber":236,"sourceCode":"\t\t\t\t\t//global optstring has already been parsed, so we're done\n\t\t\t\t\tif (globalElement != null) {\n\t\t\t\t\t\tMsg.info(this,\n\t\t\t\t\t\t\t\"no context register element in \" + gdisOpts.getAbsolutePath());\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\t//no context register element or global element, error\n\t\t\t\t\tthrow new JDOMException(\n\t\t\t\t\t\t\"No context_register element or global element in gdis options file\");\n\t\t\t\t}\n\t\t\t\tif (contextRegisterElement.getContentSize() == 0) {\n\t\t\t\t\tthrow new JDOMException(\"No context register name provided.\");\n\t\t\t\t}\n\t\t\t\tString contextRegisterName = contextRegisterElement.getContent(0).getValue();\n\t\t\t\tcontextRegister = lang.getRegister(contextRegisterName);\n\t\t\t\tif (contextRegister == null) {\n\t\t\t\t\t//the context register named in the xml file does not exist in the sleigh language\n\t\t\t\t\t//this is an error\n\t\t\t\t\tthrow new JDOMException(\"Unknown context register \" + contextRegisterName +\n\t\t\t\t\t\t\" for language \" + lang.getLanguageID().getIdAsString());\n\t\t\t\t}\n\t\t\t\tvalueToOptionString = new HashMap<>();\n\t\t\t\tvalueToDisplayPrefix = new HashMap<>();\n\t\t\t\tElement options = rootElem.getChild(\"options\");\n\t\t\t\tList<Element> optList = options.getChildren(\"option\");\n\t\t\t\tfor (Element opt : optList) {\n\t\t\t\t\tLong value = Long.decode(opt.getAttributeValue(\"value\"));\n\t\t\t\t\tString optString = opt.getAttributeValue(\"optstring\");\n\t\t\t\t\tvalueToOptionString.put(value, optString);\n\t\t\t\t\tString displayPrefix = opt.getAttributeValue(\"display_prefix\");\n\t\t\t\t\tvalueToDisplayPrefix.put(value, displayPrefix);\n\t\t\t\t}\n\n\t\t\t}\n\t\t\tcatch (JDOMException e) {\n\t\t\t\tMsg.error(this, \"Error reading \" + fileName + \": \" + e.getMessage());\n\t\t\t\tcontextRegister = null;","sourceCodeStart":218,"sourceCodeEnd":254,"githubUrl":"https://github.com/NationalSecurityAgency/ghidra/blob/d5f144c24d6bc53c9cbf4448c6d11143e7696206/Ghidra/Extensions/SleighDevTools/src/main/java/ghidra/app/util/disassemble/GNUExternalDisassembler.java#L218-L254","documentation":"Thrown by GNUExternalDisassembler when parsing the gdis options XML file: the context register named in the XML does not exist in the target Sleigh language's register set. The XML file declares a context_register element whose value is looked up via lang.getRegister(contextRegisterName), and if that returns null the JDOMException is raised. This means the gdis configuration file and the Sleigh processor specification are out of sync.","triggerScenarios":"Parsing a gdis options XML file (via the contextRegisterElement branch) where contextRegisterElement.getContent(0).getValue() names a register that lang.getRegister() cannot resolve. The lookup happens immediately after reading the context_register element's text content.","commonSituations":"The gdis XML config was written for a different processor version or language variant whose register names differ; the context register was renamed in a Sleigh spec update; the XML file is copy-pasted from another architecture without updating the register name; a custom Sleigh language is used but the gdis config still references the stock register name.","solutions":["Open the gdis options XML file referenced for this language and verify the context_register element's text matches a register defined in the Sleigh .sla/.ldefs for that language.","List the registers available via the Sleigh language (lang.getRegisters()) and replace the XML value with the correct register name.","If the architecture genuinely has no context register, remove or adjust the context_register element so it matches the expected gdis options schema for that processor.","Ensure the gdis config file version matches the Ghidra/Sleigh version in use — a version mismatch often renames or removes context registers."],"exampleFix":"// before (gdis XML references stale register name)\n// <context_register>ctx_reg_v1</context_register>\n//\n// after — name matches the Sleigh spec's actual register\n// <context_register>ctx</context_register>","handlingStrategy":"validation","validationCode":"// Before parsing the gdis options XML, verify the context register exists\nString contextRegisterName = contextRegisterElement.getContent(0).getValue();\nRegister reg = lang.getRegister(contextRegisterName);\nif (reg == null) {\n    // Log available registers for diagnosis, then skip or use a default\n    throw new JDOMException(\"Unknown context register '\" + contextRegisterName +\n        \"'. Available: \" + lang.getRegisters());\n}","typeGuard":null,"tryCatchPattern":"try {\n    // parse gdis options XML\n} catch (JDOMException e) {\n    if (e.getMessage().startsWith(\"Unknown context register\")) {\n        // surface to user: gdis config is out of sync with Sleigh language\n        Msg.showError(this, null, \"Config Error\", e.getMessage());\n    } else {\n        throw e;\n    }\n}","preventionTips":["Keep gdis option XML files version-aligned with the Sleigh processor specifications they target.","Validate the context register name against lang.getRegisters() during config load, not at disassembly time.","Run a config smoke-test after Sleigh spec updates to catch renamed registers."],"tags":["sleigh","gdis","configuration","xml","register"],"backgroundTag":null,"analyzedSha":"d5f144c24d6bc53c9cbf4448c6d11143e7696206","analyzedAt":"2026-08-14T01:00:57.564Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}