| ... | @@ -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 | }; |
| 495 | | 496 | |
| | 497 | /// This is an `extern struct` so that inline assembly in `current` can use field offsets. |
| | 498 | const 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. |
| 497 | const Lanai = extern struct { | 563 | const Lanai = extern struct { |
| 498 | r: [32]u32, | 564 | r: [32]u32, |