From 94b6c7ce5f71792b55a0027f831394afa27e3c8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Mon, 10 Nov 2025 06:54:42 +0100 Subject: [PATCH] std.debug.cpu_context: add kvx context implementation --- lib/std/debug/cpu_context.zig | 66 +++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/lib/std/debug/cpu_context.zig b/lib/std/debug/cpu_context.zig index 5fa84f9098..f29cda4036 100644 --- a/lib/std/debug/cpu_context.zig +++ b/lib/std/debug/cpu_context.zig @@ -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,