| ... | ... | @@ -9,6 +9,7 @@ else switch (native_arch) { |
| 9 | 9 | .arm, .armeb, .thumb, .thumbeb => Arm, |
| 10 | 10 | .csky => Csky, |
| 11 | 11 | .hexagon => Hexagon, |
| 12 | .kvx => Kvx, |
| 12 | 13 | .lanai => Lanai, |
| 13 | 14 | .loongarch32, .loongarch64 => LoongArch, |
| 14 | 15 | .m68k => M68k, |
| ... | ... | @@ -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 | 562 | /// This is an `extern struct` so that inline assembly in `current` can use field offsets. |
| 497 | 563 | const Lanai = extern struct { |
| 498 | 564 | r: [32]u32, |