| ... | @@ -12,6 +12,7 @@ else switch (native_arch) { | ... | @@ -12,6 +12,7 @@ else switch (native_arch) { |
| 12 | .powerpc, .powerpcle, .powerpc64, .powerpc64le => Powerpc, | 12 | .powerpc, .powerpcle, .powerpc64, .powerpc64le => Powerpc, |
| 13 | .sparc, .sparc64 => Sparc, | 13 | .sparc, .sparc64 => Sparc, |
| 14 | .riscv32, .riscv32be, .riscv64, .riscv64be => Riscv, | 14 | .riscv32, .riscv32be, .riscv64, .riscv64be => Riscv, |
| | 15 | .ve => Ve, |
| 15 | .s390x => S390x, | 16 | .s390x => S390x, |
| 16 | .x86 => X86, | 17 | .x86 => X86, |
| 17 | .x86_64 => X86_64, | 18 | .x86_64 => X86_64, |
| ... | @@ -1126,6 +1127,100 @@ const S390x = extern struct { | ... | @@ -1126,6 +1127,100 @@ const S390x = extern struct { |
| 1126 | } | 1127 | } |
| 1127 | }; | 1128 | }; |
| 1128 | | 1129 | |
| | 1130 | /// This is an `extern struct` so that inline assembly in `current` can use field offsets. |
| | 1131 | const Ve = extern struct { |
| | 1132 | s: [64]u64, |
| | 1133 | ic: u64, |
| | 1134 | |
| | 1135 | pub inline fn current() Ve { |
| | 1136 | var ctx: Ve = undefined; |
| | 1137 | asm volatile ( |
| | 1138 | \\ st %%s0, 0(, %%s8) |
| | 1139 | \\ st %%s1, 8(, %%s8) |
| | 1140 | \\ st %%s2, 16(, %%s8) |
| | 1141 | \\ st %%s3, 24(, %%s8) |
| | 1142 | \\ st %%s4, 32(, %%s8) |
| | 1143 | \\ st %%s5, 40(, %%s8) |
| | 1144 | \\ st %%s6, 48(, %%s8) |
| | 1145 | \\ st %%s7, 56(, %%s8) |
| | 1146 | \\ st %%s8, 64(, %%s8) |
| | 1147 | \\ st %%s9, 72(, %%s8) |
| | 1148 | \\ st %%s10, 80(, %%s8) |
| | 1149 | \\ st %%s11, 88(, %%s8) |
| | 1150 | \\ st %%s12, 96(, %%s8) |
| | 1151 | \\ st %%s13, 104(, %%s8) |
| | 1152 | \\ st %%s14, 112(, %%s8) |
| | 1153 | \\ st %%s15, 120(, %%s8) |
| | 1154 | \\ st %%s16, 128(, %%s8) |
| | 1155 | \\ st %%s17, 136(, %%s8) |
| | 1156 | \\ st %%s18, 144(, %%s8) |
| | 1157 | \\ st %%s19, 152(, %%s8) |
| | 1158 | \\ st %%s20, 160(, %%s8) |
| | 1159 | \\ st %%s21, 168(, %%s8) |
| | 1160 | \\ st %%s22, 176(, %%s8) |
| | 1161 | \\ st %%s23, 184(, %%s8) |
| | 1162 | \\ st %%s24, 192(, %%s8) |
| | 1163 | \\ st %%s25, 200(, %%s8) |
| | 1164 | \\ st %%s26, 208(, %%s8) |
| | 1165 | \\ st %%s27, 216(, %%s8) |
| | 1166 | \\ st %%s28, 224(, %%s8) |
| | 1167 | \\ st %%s29, 232(, %%s8) |
| | 1168 | \\ st %%s30, 240(, %%s8) |
| | 1169 | \\ st %%s31, 248(, %%s8) |
| | 1170 | \\ st %%s32, 256(, %%s8) |
| | 1171 | \\ st %%s33, 264(, %%s8) |
| | 1172 | \\ st %%s34, 272(, %%s8) |
| | 1173 | \\ st %%s35, 280(, %%s8) |
| | 1174 | \\ st %%s36, 288(, %%s8) |
| | 1175 | \\ st %%s37, 296(, %%s8) |
| | 1176 | \\ st %%s38, 304(, %%s8) |
| | 1177 | \\ st %%s39, 312(, %%s8) |
| | 1178 | \\ st %%s40, 320(, %%s8) |
| | 1179 | \\ st %%s41, 328(, %%s8) |
| | 1180 | \\ st %%s42, 336(, %%s8) |
| | 1181 | \\ st %%s43, 344(, %%s8) |
| | 1182 | \\ st %%s44, 352(, %%s8) |
| | 1183 | \\ st %%s45, 360(, %%s8) |
| | 1184 | \\ st %%s46, 368(, %%s8) |
| | 1185 | \\ st %%s47, 376(, %%s8) |
| | 1186 | \\ st %%s48, 384(, %%s8) |
| | 1187 | \\ st %%s49, 392(, %%s8) |
| | 1188 | \\ st %%s50, 400(, %%s8) |
| | 1189 | \\ st %%s51, 408(, %%s8) |
| | 1190 | \\ st %%s52, 416(, %%s8) |
| | 1191 | \\ st %%s53, 424(, %%s8) |
| | 1192 | \\ st %%s54, 432(, %%s8) |
| | 1193 | \\ st %%s55, 440(, %%s8) |
| | 1194 | \\ st %%s56, 448(, %%s8) |
| | 1195 | \\ st %%s57, 456(, %%s8) |
| | 1196 | \\ st %%s58, 464(, %%s8) |
| | 1197 | \\ st %%s59, 472(, %%s8) |
| | 1198 | \\ st %%s60, 480(, %%s8) |
| | 1199 | \\ st %%s61, 488(, %%s8) |
| | 1200 | \\ st %%s62, 496(, %%s8) |
| | 1201 | \\ st %%s63, 504(, %%s8) |
| | 1202 | \\ br.l 1f |
| | 1203 | \\1: |
| | 1204 | \\ st %%lr, 512(, %%s8) |
| | 1205 | : |
| | 1206 | : [ctx] "{s8}" (&ctx), |
| | 1207 | : .{ .s10 = true, .memory = true }); |
| | 1208 | return ctx; |
| | 1209 | } |
| | 1210 | |
| | 1211 | pub fn dwarfRegisterBytes(ctx: *Ve, register_num: u16) DwarfRegisterError![]u8 { |
| | 1212 | switch (register_num) { |
| | 1213 | 0...63 => return @ptrCast(&ctx.s[register_num]), |
| | 1214 | 144 => return @ptrCast(&ctx.ic), |
| | 1215 | |
| | 1216 | 64...127 => return error.UnsupportedRegister, // v0 - v63 |
| | 1217 | 128...143 => return error.UnsupportedRegister, // vm0 - vm15 |
| | 1218 | |
| | 1219 | else => return error.InvalidRegister, |
| | 1220 | } |
| | 1221 | } |
| | 1222 | }; |
| | 1223 | |
| 1129 | /// The native operating system's `ucontext_t` as seen in the third argument to signal handlers. | 1224 | /// The native operating system's `ucontext_t` as seen in the third argument to signal handlers. |
| 1130 | /// | 1225 | /// |
| 1131 | /// These are dramatically simplified since we only need general-purpose registers and don't care | 1226 | /// These are dramatically simplified since we only need general-purpose registers and don't care |