| ... | ... | @@ -1130,6 +1130,19 @@ const LinuxThreadImpl = struct { |
| 1130 | 1130 | [len] "r" (self.mapped.len), |
| 1131 | 1131 | : "memory" |
| 1132 | 1132 | ), |
| 1133 | .hexagon => asm volatile ( |
| 1134 | \\ r6 = #215 // SYS_munmap |
| 1135 | \\ r0 = %[ptr] |
| 1136 | \\ r1 = %[len] |
| 1137 | \\ trap0(#1) |
| 1138 | \\ r6 = #93 // SYS_exit |
| 1139 | \\ r0 = #0 |
| 1140 | \\ trap0(#1) |
| 1141 | : |
| 1142 | : [ptr] "r" (@intFromPtr(self.mapped.ptr)), |
| 1143 | [len] "r" (self.mapped.len), |
| 1144 | : "memory" |
| 1145 | ), |
| 1133 | 1146 | // We set `sp` to the address of the current function as a workaround for a Linux |
| 1134 | 1147 | // kernel bug that caused syscalls to return EFAULT if the stack pointer is invalid. |
| 1135 | 1148 | // The bug was introduced in 46e12c07b3b9603c60fc1d421ff18618241cb081 and fixed in |
| ... | ... | @@ -1188,18 +1201,51 @@ const LinuxThreadImpl = struct { |
| 1188 | 1201 | [len] "r" (self.mapped.len), |
| 1189 | 1202 | : "memory" |
| 1190 | 1203 | ), |
| 1204 | .s390x => asm volatile ( |
| 1205 | \\ lgr %%r2, %[ptr] |
| 1206 | \\ lgr %%r3, %[len] |
| 1207 | \\ svc 91 # SYS_munmap |
| 1208 | \\ lghi %%r2, 0 |
| 1209 | \\ svc 1 # SYS_exit |
| 1210 | : |
| 1211 | : [ptr] "r" (@intFromPtr(self.mapped.ptr)), |
| 1212 | [len] "r" (self.mapped.len), |
| 1213 | : "memory" |
| 1214 | ), |
| 1215 | .sparc => asm volatile ( |
| 1216 | \\ # See sparc64 comments below. |
| 1217 | \\ 1: |
| 1218 | \\ cmp %%fp, 0 |
| 1219 | \\ beq 2f |
| 1220 | \\ nop |
| 1221 | \\ ba 1b |
| 1222 | \\ restore |
| 1223 | \\ 2: |
| 1224 | \\ mov 73, %%g1 # SYS_munmap |
| 1225 | \\ mov %[ptr], %%o0 |
| 1226 | \\ mov %[len], %%o1 |
| 1227 | \\ t 0x3 # ST_FLUSH_WINDOWS |
| 1228 | \\ t 0x10 |
| 1229 | \\ mov 1, %%g1 # SYS_exit |
| 1230 | \\ mov 0, %%o0 |
| 1231 | \\ t 0x10 |
| 1232 | : |
| 1233 | : [ptr] "r" (@intFromPtr(self.mapped.ptr)), |
| 1234 | [len] "r" (self.mapped.len), |
| 1235 | : "memory" |
| 1236 | ), |
| 1191 | 1237 | .sparc64 => asm volatile ( |
| 1192 | 1238 | \\ # SPARCs really don't like it when active stack frames |
| 1193 | 1239 | \\ # is unmapped (it will result in a segfault), so we |
| 1194 | 1240 | \\ # force-deactivate it by running `restore` until |
| 1195 | 1241 | \\ # all frames are cleared. |
| 1196 | | \\ 1: |
| 1242 | \\ 1: |
| 1197 | 1243 | \\ cmp %%fp, 0 |
| 1198 | 1244 | \\ beq 2f |
| 1199 | 1245 | \\ nop |
| 1200 | 1246 | \\ ba 1b |
| 1201 | 1247 | \\ restore |
| 1202 | | \\ 2: |
| 1248 | \\ 2: |
| 1203 | 1249 | \\ mov 73, %%g1 # SYS_munmap |
| 1204 | 1250 | \\ mov %[ptr], %%o0 |
| 1205 | 1251 | \\ mov %[len], %%o1 |
| ... | ... | @@ -1208,7 +1254,7 @@ const LinuxThreadImpl = struct { |
| 1208 | 1254 | \\ flushw |
| 1209 | 1255 | \\ t 0x6d |
| 1210 | 1256 | \\ mov 1, %%g1 # SYS_exit |
| 1211 | | \\ mov 1, %%o0 |
| 1257 | \\ mov 0, %%o0 |
| 1212 | 1258 | \\ t 0x6d |
| 1213 | 1259 | : |
| 1214 | 1260 | : [ptr] "r" (@intFromPtr(self.mapped.ptr)), |