{"record":{"id":"9162fb8d80e6303a","repo":"go-delve/delve","slug":"changing-register-d-not-implemented-9162fb","errorCode":null,"errorMessage":"changing register %d not implemented","messagePattern":"changing register (.+?) not implemented","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/proc/linutil/regs_loong64_arch.go","lineNumber":196,"sourceCode":"\t\tr.Regs.Regs[regNum] = reg.Uint64Val\n\t\treturn false, nil\n\n\tcase regNum >= regnum.LOONG64_F0 && regNum <= regnum.LOONG64_F31:\n\t\tif r.loadFpRegs != nil {\n\t\t\terr := r.loadFpRegs(r)\n\t\t\tr.loadFpRegs = nil\n\t\t\tif err != nil {\n\t\t\t\treturn false, err\n\t\t\t}\n\t\t}\n\n\t\ti := regNum - regnum.LOONG64_F0\n\t\treg.FillBytes()\n\t\tcopy(r.Fpregset[8*i:], reg.Bytes)\n\t\treturn true, nil\n\n\tdefault:\n\t\treturn false, fmt.Errorf(\"changing register %d not implemented\", regNum)\n\t}\n}\n\n// LOONG64PtraceFpRegs refers to the definition of struct user_fp_state in kernel ptrace.h\ntype LOONG64PtraceFpRegs struct {\n\tFregs []byte\n\tFcc   uint64\n\tFcsr  uint32\n}\n\nconst _LOONG64_FPREGSET_LENGTH = (32 * 8)\n\nfunc (fpregs *LOONG64PtraceFpRegs) Decode() (regs []proc.Register) {\n\tfor i := 0; i < len(fpregs.Fregs); i += 8 {\n\t\tname := fmt.Sprintf(\"F%d\", (i / 8))\n\t\tvalue := fpregs.Fregs[i : i+8]\n\t\tregs = proc.AppendBytesRegister(regs, name, value)\n\t}","sourceCodeStart":178,"sourceCodeEnd":214,"githubUrl":"https://github.com/go-delve/delve/blob/a23773e6c31361e43246bc43a424ee009679b174/pkg/proc/linutil/regs_loong64_arch.go#L178-L214","documentation":"The loong64 SetReg implementation only handles general-purpose and F0-F31 floating-point registers; any other register number reaches the default branch and is rejected as unimplemented.","triggerScenarios":"Calling SetReg on Linux/loong64 with a register number outside the implemented GPR set and outside LOONG64_F0..F0+31 (e.g. FCC, FCSR registers).","commonSituations":"Attempting to write loong64 floating-point control/status registers; using register constants not defined for this port.","solutions":["Only write GPRs and F0-F31 via SetReg on loong64","Extend the native backend (and add kernel ptrace support) if FCSR writes are required","Validate regnum ranges in the caller before invoking SetReg"],"exampleFix":"// before\nthread.SetReg(regnum.LOONG64_FCSR, reg) // not implemented\n// after\nif regnum.LOONG64_F0 <= regNum && regNum <= regnum.LOONG64_F0+31 {\n    thread.SetReg(regNum, reg)\n} else {\n    return fmt.Errorf(\"cannot set register %d on loong64\", regNum)\n}","handlingStrategy":"validation","validationCode":"supported := isGPR(regNum) || (regNum >= regnum.LOONG64_F0 && regNum <= regnum.LOONG64_F0+31)\nif !supported {\n    return fmt.Errorf(\"register %d not settable on loong64\", regNum)\n}","typeGuard":"func isSettableLOONG64(regNum uint64) bool {\n    return (regNum >= regnum.LOONG64_R0 && regNum <= regnum.LOONG64_R0+31) || (regNum >= regnum.LOONG64_F0 && regNum <= regnum.LOONG64_F0+31)\n}","tryCatchPattern":"if _, err := thread.SetReg(regNum, reg); err != nil {\n    if strings.Contains(err.Error(), \"not implemented\") {\n        return fmt.Errorf(\"loong64 register %d cannot be modified\", regNum)\n    }\n    return err\n}","preventionTips":["Only write R0-R31 and F0-F31 on loong64","Treat FCSR/FCC registers as read-only through SetReg","Verify regnum constants belong to the loong64 package"],"tags":["go","registers","loong64","ptrace"],"backgroundTag":"register-not-settable","analyzedSha":"a23773e6c31361e43246bc43a424ee009679b174","analyzedAt":"2026-08-31T15:12:45.221Z","schemaVersion":2},"datasetVersion":"2026-08-31T22:30:34.772Z"}