Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
97 changes: 97 additions & 0 deletions src/coreclr/debug/inc/dbgtargetcontext.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@
#define DTCONTEXT_IS_ARM
#elif defined (TARGET_ARM64)
#define DTCONTEXT_IS_ARM64
#elif defined (TARGET_LOONGARCH64)
#define DTCONTEXT_IS_LOONGARCH64
#endif

#if defined(DTCONTEXT_IS_X86)
Expand Down Expand Up @@ -447,6 +449,101 @@ typedef DECLSPEC_ALIGN(16) struct {

} DT_CONTEXT;

#elif defined(DTCONTEXT_IS_LOONGARCH64)
#define DT_CONTEXT_LOONGARCH64 0x00800000L

#define DT_CONTEXT_CONTROL (DT_CONTEXT_LOONGARCH64 | 0x1L)
#define DT_CONTEXT_INTEGER (DT_CONTEXT_LOONGARCH64 | 0x2L)
#define DT_CONTEXT_FLOATING_POINT (DT_CONTEXT_LOONGARCH64 | 0x4L)
#define DT_CONTEXT_DEBUG_REGISTERS (DT_CONTEXT_LOONGARCH64 | 0x8L)

#define DT_CONTEXT_FULL (DT_CONTEXT_CONTROL | DT_CONTEXT_INTEGER | DT_CONTEXT_FLOATING_POINT)
#define DT_CONTEXT_ALL (DT_CONTEXT_CONTROL | DT_CONTEXT_INTEGER | DT_CONTEXT_FLOATING_POINT | DT_CONTEXT_DEBUG_REGISTERS)

#define DT_LOONGARCH64_MAX_BREAKPOINTS 8
#define DT_LOONGARCH64_MAX_WATCHPOINTS 2

typedef DECLSPEC_ALIGN(16) struct {
//
// Control flags.
//

/* +0x000 */ DWORD ContextFlags;

//
// Integer registers
//
DWORD64 R0;
DWORD64 RA;
DWORD64 TP;
DWORD64 SP;
DWORD64 A0;
DWORD64 A1;
DWORD64 A2;
DWORD64 A3;
DWORD64 A4;
DWORD64 A5;
DWORD64 A6;
DWORD64 A7;
DWORD64 T0;
DWORD64 T1;
DWORD64 T2;
DWORD64 T3;
DWORD64 T4;
DWORD64 T5;
DWORD64 T6;
DWORD64 T7;
DWORD64 T8;
DWORD64 X0;
DWORD64 FP;
DWORD64 S0;
DWORD64 S1;
DWORD64 S2;
DWORD64 S3;
DWORD64 S4;
DWORD64 S5;
DWORD64 S6;
DWORD64 S7;
DWORD64 S8;
DWORD64 PC;

//
// Floating Point Registers
//
DWORD64 F0;
DWORD64 F1;
DWORD64 F2;
DWORD64 F3;
DWORD64 F4;
DWORD64 F5;
DWORD64 F6;
DWORD64 F7;
DWORD64 F8;
DWORD64 F9;
DWORD64 F10;
DWORD64 F11;
DWORD64 F12;
DWORD64 F13;
DWORD64 F14;
DWORD64 F15;
DWORD64 F16;
DWORD64 F17;
DWORD64 F18;
DWORD64 F19;
DWORD64 F20;
DWORD64 F21;
DWORD64 F22;
DWORD64 F23;
DWORD64 F24;
DWORD64 F25;
DWORD64 F26;
DWORD64 F27;
DWORD64 F28;
DWORD64 F29;
DWORD64 F30;
DWORD64 F31;
} DT_CONTEXT;

#else
#error Unsupported platform
#endif
Expand Down
71 changes: 70 additions & 1 deletion src/coreclr/inc/cordebug.idl
Original file line number Diff line number Diff line change
Expand Up @@ -285,7 +285,8 @@ interface ICorDebugDataTarget : IUnknown
CORDB_PLATFORM_POSIX_AMD64, // Posix supporting OS on Intel x64
CORDB_PLATFORM_POSIX_X86, // Posix supporting OS on Intel x86
CORDB_PLATFORM_POSIX_ARM, // Posix supporting OS on ARM32
CORDB_PLATFORM_POSIX_ARM64 // Posix supporting OS on ARM64
CORDB_PLATFORM_POSIX_ARM64, // Posix supporting OS on ARM64
CORDB_PLATFORM_POSIX_LOONGARCH64 // Posix supporting OS on LoongArch64
} CorDebugPlatform;

HRESULT GetPlatform([out] CorDebugPlatform * pTargetPlatform);
Expand Down Expand Up @@ -3917,6 +3918,74 @@ interface ICorDebugRegisterSet : IUnknown
REGISTER_ARM64_V30,
REGISTER_ARM64_V31,

// LoongArch64 registers
REGISTER_LOONGARCH64_R0 = 0,
REGISTER_LOONGARCH64_RA,
REGISTER_LOONGARCH64_TP,
REGISTER_LOONGARCH64_SP,
REGISTER_LOONGARCH64_A0,
REGISTER_LOONGARCH64_A1,
REGISTER_LOONGARCH64_A2,
REGISTER_LOONGARCH64_A3,
REGISTER_LOONGARCH64_A4,
REGISTER_LOONGARCH64_A5,
REGISTER_LOONGARCH64_A6,
REGISTER_LOONGARCH64_A7,
REGISTER_LOONGARCH64_T0,
REGISTER_LOONGARCH64_T1,
REGISTER_LOONGARCH64_T2,
REGISTER_LOONGARCH64_T3,
REGISTER_LOONGARCH64_T4,
REGISTER_LOONGARCH64_T5,
REGISTER_LOONGARCH64_T6,
REGISTER_LOONGARCH64_T7,
REGISTER_LOONGARCH64_T8,
REGISTER_LOONGARCH64_X0,
REGISTER_LOONGARCH64_FP,
REGISTER_LOONGARCH64_S0,
REGISTER_LOONGARCH64_S1,
REGISTER_LOONGARCH64_S2,
REGISTER_LOONGARCH64_S3,
REGISTER_LOONGARCH64_S4,
REGISTER_LOONGARCH64_S5,
REGISTER_LOONGARCH64_S6,
REGISTER_LOONGARCH64_S7,
REGISTER_LOONGARCH64_S8,
REGISTER_LOONGARCH64_PC,

REGISTER_LOONGARCH64_F0,
REGISTER_LOONGARCH64_F1,
REGISTER_LOONGARCH64_F2,
REGISTER_LOONGARCH64_F3,
REGISTER_LOONGARCH64_F4,
REGISTER_LOONGARCH64_F5,
REGISTER_LOONGARCH64_F6,
REGISTER_LOONGARCH64_F7,
REGISTER_LOONGARCH64_F8,
REGISTER_LOONGARCH64_F9,
REGISTER_LOONGARCH64_F10,
REGISTER_LOONGARCH64_F11,
REGISTER_LOONGARCH64_F12,
REGISTER_LOONGARCH64_F13,
REGISTER_LOONGARCH64_F14,
REGISTER_LOONGARCH64_F15,
REGISTER_LOONGARCH64_F16,
REGISTER_LOONGARCH64_F17,
REGISTER_LOONGARCH64_F18,
REGISTER_LOONGARCH64_F19,
REGISTER_LOONGARCH64_F20,
REGISTER_LOONGARCH64_F21,
REGISTER_LOONGARCH64_F22,
REGISTER_LOONGARCH64_F23,
REGISTER_LOONGARCH64_F24,
REGISTER_LOONGARCH64_F25,
REGISTER_LOONGARCH64_F26,
REGISTER_LOONGARCH64_F27,
REGISTER_LOONGARCH64_F28,
REGISTER_LOONGARCH64_F29,
REGISTER_LOONGARCH64_F30,
REGISTER_LOONGARCH64_F31,

// other architectures here

} CorDebugRegister;
Expand Down
36 changes: 36 additions & 0 deletions src/coreclr/inc/cordebuginfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,40 @@ class ICorDebugInfo
REGNUM_R13,
REGNUM_R14,
REGNUM_R15,
#elif TARGET_LOONGARCH64
REGNUM_R0,
REGNUM_RA,
REGNUM_TP,
REGNUM_SP,
REGNUM_A0,
REGNUM_A1,
REGNUM_A2,
REGNUM_A3,
REGNUM_A4,
REGNUM_A5,
REGNUM_A6,
REGNUM_A7,
REGNUM_T0,
REGNUM_T1,
REGNUM_T2,
REGNUM_T3,
REGNUM_T4,
REGNUM_T5,
REGNUM_T6,
REGNUM_T7,
REGNUM_T8,
REGNUM_X0,
REGNUM_FP,
REGNUM_S0,
REGNUM_S1,
REGNUM_S2,
REGNUM_S3,
REGNUM_S4,
REGNUM_S5,
REGNUM_S6,
REGNUM_S7,
REGNUM_S8,
REGNUM_PC,
#else
PORTABILITY_WARNING("Register numbers not defined on this platform")
#endif
Expand All @@ -165,6 +199,8 @@ class ICorDebugInfo
#endif //REDHAWK
#elif TARGET_ARM64
//Nothing to do here. FP is already alloted.
#elif TARGET_LOONGARCH64
//Nothing to do here. FP is already alloted.
#else
// RegNum values should be properly defined for this platform
REGNUM_FP = 0,
Expand Down
140 changes: 140 additions & 0 deletions src/coreclr/inc/crosscomp.h
Original file line number Diff line number Diff line change
Expand Up @@ -382,6 +382,144 @@ enum

#endif // TARGET_ARM64 && !HOST_ARM64

#elif defined(HOST_AMD64) && defined(TARGET_LOONGARCH64) // Host amd64 managing LOONGARCH64 related code

#ifndef CROSS_COMPILE
#define CROSS_COMPILE
#endif

//
// Specify the number of breakpoints and watchpoints that the OS
// will track. Architecturally, LOONGARCH64 supports up to 16. In practice,
// however, almost no one implements more than 4 of each.
//

#define LOONGARCH64_MAX_BREAKPOINTS 8
#define LOONGARCH64_MAX_WATCHPOINTS 2

#define CONTEXT_UNWOUND_TO_CALL 0x20000000

typedef struct DECLSPEC_ALIGN(16) _T_CONTEXT {

//
// Control flags.
//

/* +0x000 */ DWORD ContextFlags;

//
// Integer registers
//
DWORD64 R0;
DWORD64 Ra;
DWORD64 Tp;
DWORD64 Sp;
DWORD64 A0;//DWORD64 V0;
DWORD64 A1;//DWORD64 V1;
DWORD64 A2;
DWORD64 A3;
DWORD64 A4;
DWORD64 A5;
DWORD64 A6;
DWORD64 A7;
DWORD64 T0;
DWORD64 T1;
DWORD64 T2;
DWORD64 T3;
DWORD64 T4;
DWORD64 T5;
DWORD64 T6;
DWORD64 T7;
DWORD64 T8;
DWORD64 X0;
DWORD64 Fp;
DWORD64 S0;
DWORD64 S1;
DWORD64 S2;
DWORD64 S3;
DWORD64 S4;
DWORD64 S5;
DWORD64 S6;
DWORD64 S7;
DWORD64 S8;
DWORD64 Pc;

//
// Floating Point Registers
//
//TODO: support the SIMD.
DWORD64 F[32];
DWORD Fcsr;
} T_CONTEXT, *PT_CONTEXT;

// _IMAGE_LOONGARCH64_RUNTIME_FUNCTION_ENTRY (see ExternalAPIs\Win9CoreSystem\inc\winnt.h)
typedef struct _T_RUNTIME_FUNCTION {
DWORD BeginAddress;
union {
DWORD UnwindData;
struct {
DWORD Flag : 2;
DWORD FunctionLength : 11;
DWORD RegF : 3;
DWORD RegI : 4;
DWORD H : 1;
DWORD CR : 2;
DWORD FrameSize : 9;
} PackedUnwindData;
};
} T_RUNTIME_FUNCTION, *PT_RUNTIME_FUNCTION;


//
// Define exception dispatch context structure.
//

typedef struct _T_DISPATCHER_CONTEXT {
DWORD64 ControlPc;
DWORD64 ImageBase;
PT_RUNTIME_FUNCTION FunctionEntry;
DWORD64 EstablisherFrame;
DWORD64 TargetPc;
PCONTEXT ContextRecord;
PEXCEPTION_ROUTINE LanguageHandler;
PVOID HandlerData;
PVOID HistoryTable;
DWORD ScopeIndex;
BOOLEAN ControlPcIsUnwound;
PBYTE NonVolatileRegisters;
} T_DISPATCHER_CONTEXT, *PT_DISPATCHER_CONTEXT;



//
// Nonvolatile context pointer record.
//

typedef struct _T_KNONVOLATILE_CONTEXT_POINTERS {

PDWORD64 S0;
PDWORD64 S1;
PDWORD64 S2;
PDWORD64 S3;
PDWORD64 S4;
PDWORD64 S5;
PDWORD64 S6;
PDWORD64 S7;
PDWORD64 S8;
PDWORD64 Fp;
PDWORD64 Tp;
PDWORD64 Ra;

PDWORD64 F24;
PDWORD64 F25;
PDWORD64 F26;
PDWORD64 F27;
PDWORD64 F28;
PDWORD64 F29;
PDWORD64 F30;
PDWORD64 F31;
} T_KNONVOLATILE_CONTEXT_POINTERS, *PT_KNONVOLATILE_CONTEXT_POINTERS;

#else

#define T_CONTEXT CONTEXT
Expand Down Expand Up @@ -420,6 +558,8 @@ enum
#define DAC_CS_NATIVE_DATA_SIZE 80
#elif defined(TARGET_LINUX) && defined(TARGET_ARM64)
#define DAC_CS_NATIVE_DATA_SIZE 116
#elif defined(TARGET_LINUX) && defined(TARGET_LOONGARCH64)
#define DAC_CS_NATIVE_DATA_SIZE 96
#elif defined(TARGET_LINUX) && defined(TARGET_X86)
#define DAC_CS_NATIVE_DATA_SIZE 76
#elif defined(TARGET_LINUX) && defined(TARGET_AMD64)
Expand Down
Loading