authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2025-11-10 06:54:42+01:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2025-11-10 09:40:44+01:00
log94b6c7ce5f71792b55a0027f831394afa27e3c8f
tree527fff71d19e7253637d685d19d60eb510e36fbb
parent80e567b6bdf65e23024b9b662768b577541dbcd4
signaturebadge-check Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM

std.debug.cpu_context: add kvx context implementation


1 files changed, 66 insertions(+), 0 deletions(-)

lib/std/debug/cpu_context.zig+66
...@@ -9,6 +9,7 @@ else switch (native_arch) {...@@ -9,6 +9,7 @@ else switch (native_arch) {
9 .arm, .armeb, .thumb, .thumbeb => Arm,9 .arm, .armeb, .thumb, .thumbeb => Arm,
10 .csky => Csky,10 .csky => Csky,
11 .hexagon => Hexagon,11 .hexagon => Hexagon,
12 .kvx => Kvx,
12 .lanai => Lanai,13 .lanai => Lanai,
13 .loongarch32, .loongarch64 => LoongArch,14 .loongarch32, .loongarch64 => LoongArch,
14 .m68k => M68k,15 .m68k => M68k,
...@@ -493,6 +494,71 @@ const Hexagon = extern struct {...@@ -493,6 +494,71 @@ const Hexagon = extern struct {
493 }494 }
494};495};
495496
497/// This is an `extern struct` so that inline assembly in `current` can use field offsets.
498const Kvx = extern struct {
499 r: [64]u64,
500 ra: u64,
501 pc: u64,
502
503 pub inline fn current() Kvx {
504 var ctx: Kvx = undefined;
505 asm volatile (
506 \\ so (0)[$r32] = $r0r1r2r3
507 \\ ;;
508 \\ so (32)[$r32] = $r4r5r6r7
509 \\ ;;
510 \\ so (64)[$r32] = $r8r9r10r11
511 \\ ;;
512 \\ so (96)[$r32] = $r12r13r14r15
513 \\ ;;
514 \\ so (128)[$r32] = $r16r17r18r19
515 \\ ;;
516 \\ so (160)[$r32] = $r20r21r22r23
517 \\ ;;
518 \\ so (192)[$r32] = $r24r25r26r27
519 \\ ;;
520 \\ so (224)[$r32] = $r28r29r30r31
521 \\ ;;
522 \\ so (256)[$r32] = $r32r33r34r35
523 \\ ;;
524 \\ so (288)[$r32] = $r36r37r38r39
525 \\ ;;
526 \\ so (320)[$r32] = $r40r41r42r43
527 \\ ;;
528 \\ so (352)[$r32] = $r44r45r46r47
529 \\ ;;
530 \\ so (384)[$r32] = $r48r49r50r51
531 \\ ;;
532 \\ so (416)[$r32] = $r52r53r54r55
533 \\ ;;
534 \\ so (448)[$r32] = $r56r57r58r59
535 \\ get $r34 = $pc
536 \\ ;;
537 \\ so (480)[$r32] = $r60r61r62r63
538 \\ get $r35 = $ra
539 \\ ;;
540 \\ sq (512)[$r32] = $r34r35
541 :
542 : [ctx] "{r32}" (&ctx),
543 : .{ .r34 = true, .r35 = true, .memory = true });
544 return ctx;
545 }
546
547 pub fn dwarfRegisterBytes(ctx: *Kvx, register_num: u16) DwarfRegisterError![]u8 {
548 switch (register_num) {
549 0...63 => return @ptrCast(&ctx.r[register_num]),
550 64 => return @ptrCast(&ctx.pc),
551 67 => return @ptrCast(&ctx.ra),
552
553 65...66 => return error.UnsupportedRegister, // SFRs
554 68...255 => return error.UnsupportedRegister, // SFRs
555 256...767 => return error.UnsupportedRegister, // XCRs
556
557 else => return error.InvalidRegister,
558 }
559 }
560};
561
496/// This is an `extern struct` so that inline assembly in `current` can use field offsets.562/// This is an `extern struct` so that inline assembly in `current` can use field offsets.
497const Lanai = extern struct {563const Lanai = extern struct {
498 r: [32]u32,564 r: [32]u32,