std.debug.cpu_context: add kvx context implementation

This commit is contained in:
Alex Rønne Petersen 2025-11-10 06:54:42 +01:00
parent 80e567b6bd
commit 94b6c7ce5f
No known key found for this signature in database

View file

@ -9,6 +9,7 @@ else switch (native_arch) {
.arm, .armeb, .thumb, .thumbeb => Arm,
.csky => Csky,
.hexagon => Hexagon,
.kvx => Kvx,
.lanai => Lanai,
.loongarch32, .loongarch64 => LoongArch,
.m68k => M68k,
@ -493,6 +494,71 @@ const Hexagon = extern struct {
}
};
/// This is an `extern struct` so that inline assembly in `current` can use field offsets.
const Kvx = extern struct {
r: [64]u64,
ra: u64,
pc: u64,
pub inline fn current() Kvx {
var ctx: Kvx = undefined;
asm volatile (
\\ so (0)[$r32] = $r0r1r2r3
\\ ;;
\\ so (32)[$r32] = $r4r5r6r7
\\ ;;
\\ so (64)[$r32] = $r8r9r10r11
\\ ;;
\\ so (96)[$r32] = $r12r13r14r15
\\ ;;
\\ so (128)[$r32] = $r16r17r18r19
\\ ;;
\\ so (160)[$r32] = $r20r21r22r23
\\ ;;
\\ so (192)[$r32] = $r24r25r26r27
\\ ;;
\\ so (224)[$r32] = $r28r29r30r31
\\ ;;
\\ so (256)[$r32] = $r32r33r34r35
\\ ;;
\\ so (288)[$r32] = $r36r37r38r39
\\ ;;
\\ so (320)[$r32] = $r40r41r42r43
\\ ;;
\\ so (352)[$r32] = $r44r45r46r47
\\ ;;
\\ so (384)[$r32] = $r48r49r50r51
\\ ;;
\\ so (416)[$r32] = $r52r53r54r55
\\ ;;
\\ so (448)[$r32] = $r56r57r58r59
\\ get $r34 = $pc
\\ ;;
\\ so (480)[$r32] = $r60r61r62r63
\\ get $r35 = $ra
\\ ;;
\\ sq (512)[$r32] = $r34r35
:
: [ctx] "{r32}" (&ctx),
: .{ .r34 = true, .r35 = true, .memory = true });
return ctx;
}
pub fn dwarfRegisterBytes(ctx: *Kvx, register_num: u16) DwarfRegisterError![]u8 {
switch (register_num) {
0...63 => return @ptrCast(&ctx.r[register_num]),
64 => return @ptrCast(&ctx.pc),
67 => return @ptrCast(&ctx.ra),
65...66 => return error.UnsupportedRegister, // SFRs
68...255 => return error.UnsupportedRegister, // SFRs
256...767 => return error.UnsupportedRegister, // XCRs
else => return error.InvalidRegister,
}
}
};
/// This is an `extern struct` so that inline assembly in `current` can use field offsets.
const Lanai = extern struct {
r: [32]u32,