{"record":{"id":"0b3416fc0ddbfee0","repo":"NationalSecurityAgency/ghidra","slug":"processor-context-register-not-allowed","errorCode":null,"errorMessage":"Processor context register not allowed","messagePattern":"Processor context register not allowed","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"Ghidra/Features/Base/src/main/java/ghidra/app/merge/listing/RegisterMergeManager.java","lineNumber":134,"sourceCode":"\t\tthis.registerName = registerName;\n\t\tthis.mergeManager = mergeManager;\n\t\tthis.resultPgm = resultPgm;\n\t\tthis.originalPgm = originalPgm;\n\t\tthis.latestPgm = latestPgm;\n\t\tthis.myPgm = myPgm;\n\t\tthis.latestChanges = latestChanges;\n\t\tthis.myChanges = myChanges;\n\t\tthis.latestSet = latestChanges.getRegisterAddressSet();\n\t\tthis.mySet = myChanges.getRegisterAddressSet();\n\n\t\toriginalContext = originalPgm.getProgramContext();\n\t\tlatestContext = latestPgm.getProgramContext();\n\t\tmyContext = myPgm.getProgramContext();\n\t\tresultContext = resultPgm.getProgramContext();\n\n\t\tresultReg = resultContext.getRegister(registerName);\n\t\tif (resultReg.isProcessorContext()) {\n\t\t\tthrow new IllegalArgumentException(\"Processor context register not allowed\");\n\t\t}\n\t}\n\n\tvoid apply() {\n\t\tconflictOption = conflictPanel.getSelectedOptions();\n\n\t\t// If the \"Use For All\" check box is selected \n\t\t// then save the option chosen for this conflict type.\n\t\tif (conflictPanel.getUseForAll()) {\n\t\t\tcontextChoice = conflictOption;\n\t\t}\n\n\t\tmerge(min, max, resultReg);\n\t}\n\n\tvoid cancel() {\n\t\tconflictOption = CANCELED;\n\t}","sourceCodeStart":116,"sourceCodeEnd":152,"githubUrl":"https://github.com/NationalSecurityAgency/ghidra/blob/d5f144c24d6bc53c9cbf4448c6d11143e7696206/Ghidra/Features/Base/src/main/java/ghidra/app/merge/listing/RegisterMergeManager.java#L116-L152","documentation":"Thrown as IllegalArgumentException from the RegisterMergeManager constructor when the requested register is the processor context register (Register.isProcessorContext() == true). RegisterMergeManager merges a single named register's values across program versions and explicitly excludes the special processor-context register because it is handled by a different merge path.","triggerScenarios":"Constructing `new RegisterMergeManager(registerName, ...)` where registerName resolves to the processor context register (commonly \"psr\", \"CONTEXT\", or the register whose isProcessorContext() is true for the loaded language).","commonSituations":"Iterating all registers of a language to create a merge manager per register and forgetting to skip the processor-context register; passing a register name obtained from ProgramContext that includes the context register.","solutions":["Skip registers where register.isProcessorContext() is true before constructing RegisterMergeManager.","Filter the register list against the processor-context register when driving a multi-register merge loop.","If you genuinely need context-register merging, use the dedicated context-merge path rather than this constructor."],"exampleFix":"// before\nfor (String name : allRegisterNames) {\n    new RegisterMergeManager(name, mm, result, orig, latest, my, lc, mc); // throws on context reg\n}\n\n// after — skip the processor context register\nfor (String name : allRegisterNames) {\n    Register r = resultPgm.getProgramContext().getRegister(name);\n    if (r != null && r.isProcessorContext()) {\n        continue;\n    }\n    new RegisterMergeManager(name, mm, result, orig, latest, my, lc, mc);\n}","handlingStrategy":"validation","validationCode":"Register r = resultPgm.getProgramContext().getRegister(registerName);\nif (r != null && r.isProcessorContext()) {\n    // skip — not allowed for RegisterMergeManager\n    return;\n}","typeGuard":"boolean mergeable = resultReg != null && !resultReg.isProcessorContext();","tryCatchPattern":"try {\n    new RegisterMergeManager(name, mm, result, orig, latest, my, lc, mc);\n} catch (IllegalArgumentException e) {\n    // skip processor-context register\n}","preventionTips":["Filter the register list to exclude the processor-context register.","Check isProcessorContext() before constructing the manager.","Use the dedicated context-register merge path if context merge is required."],"tags":["ghidra","merge","register","validation","illegal-argument"],"backgroundTag":null,"analyzedSha":"d5f144c24d6bc53c9cbf4448c6d11143e7696206","analyzedAt":"2026-08-14T01:00:57.564Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}