| ... | ... | @@ -11,6 +11,7 @@ else switch (native_arch) { |
| 11 | 11 | .lanai => Lanai, |
| 12 | 12 | .loongarch32, .loongarch64 => LoongArch, |
| 13 | 13 | .mips, .mipsel, .mips64, .mips64el => Mips, |
| 14 | .or1k => Or1k, |
| 14 | 15 | .powerpc, .powerpcle, .powerpc64, .powerpc64le => Powerpc, |
| 15 | 16 | .sparc, .sparc64 => Sparc, |
| 16 | 17 | .riscv32, .riscv32be, .riscv64, .riscv64be => Riscv, |
| ... | ... | @@ -818,6 +819,66 @@ const Mips = extern struct { |
| 818 | 819 | } |
| 819 | 820 | }; |
| 820 | 821 | |
| 822 | /// This is an `extern struct` so that inline assembly in `current` can use field offsets. |
| 823 | const Or1k = extern struct { |
| 824 | /// The numbered general-purpose registers r0 - r31. |
| 825 | r: [32]u32, |
| 826 | pc: u32, |
| 827 | |
| 828 | pub inline fn current() Or1k { |
| 829 | var ctx: Or1k = undefined; |
| 830 | asm volatile ( |
| 831 | \\ l.sw 0(r15), r0 |
| 832 | \\ l.sw 4(r15), r1 |
| 833 | \\ l.sw 8(r15), r2 |
| 834 | \\ l.sw 12(r15), r3 |
| 835 | \\ l.sw 16(r15), r4 |
| 836 | \\ l.sw 20(r15), r5 |
| 837 | \\ l.sw 24(r15), r6 |
| 838 | \\ l.sw 28(r15), r7 |
| 839 | \\ l.sw 32(r15), r8 |
| 840 | \\ l.sw 36(r15), r9 |
| 841 | \\ l.sw 40(r15), r10 |
| 842 | \\ l.sw 44(r15), r11 |
| 843 | \\ l.sw 48(r15), r12 |
| 844 | \\ l.sw 52(r15), r13 |
| 845 | \\ l.sw 56(r15), r14 |
| 846 | \\ l.sw 60(r15), r15 |
| 847 | \\ l.sw 64(r15), r16 |
| 848 | \\ l.sw 68(r15), r17 |
| 849 | \\ l.sw 72(r15), r18 |
| 850 | \\ l.sw 76(r15), r19 |
| 851 | \\ l.sw 80(r15), r20 |
| 852 | \\ l.sw 84(r15), r21 |
| 853 | \\ l.sw 88(r15), r22 |
| 854 | \\ l.sw 92(r15), r23 |
| 855 | \\ l.sw 96(r15), r24 |
| 856 | \\ l.sw 100(r15), r25 |
| 857 | \\ l.sw 104(r15), r26 |
| 858 | \\ l.sw 108(r15), r27 |
| 859 | \\ l.sw 112(r15), r28 |
| 860 | \\ l.sw 116(r15), r29 |
| 861 | \\ l.sw 120(r15), r30 |
| 862 | \\ l.sw 124(r15), r31 |
| 863 | \\ l.jal 1f |
| 864 | \\1: |
| 865 | \\ l.sw 128(r15), r9 |
| 866 | : |
| 867 | : [ctx] "{r15}" (&ctx), |
| 868 | : .{ .r9 = true, .memory = true }); |
| 869 | return ctx; |
| 870 | } |
| 871 | |
| 872 | pub fn dwarfRegisterBytes(ctx: *Or1k, register_num: u16) DwarfRegisterError![]u8 { |
| 873 | switch (register_num) { |
| 874 | 0...31 => return @ptrCast(&ctx.r[register_num]), |
| 875 | 35 => return @ptrCast(&ctx.pc), |
| 876 | |
| 877 | else => return error.InvalidRegister, |
| 878 | } |
| 879 | } |
| 880 | }; |
| 881 | |
| 821 | 882 | /// This is an `extern struct` so that inline assembly in `current` can use field offsets. |
| 822 | 883 | const Powerpc = extern struct { |
| 823 | 884 | /// The numbered general-purpose registers r0 - r31. |