| 1 | #include "macros.inc" |
| 2 | |
| 3 | test_suite windowed |
| 4 | |
| 5 | #if XCHAL_HAVE_WINDOWED |
| 6 | |
| 7 | .altmacro |
| 8 | |
| 9 | .macro reset_window start |
| 10 | movi a2, 0xffff |
| 11 | wsr a2, windowstart |
| 12 | rsync |
| 13 | movi a2, 0 |
| 14 | wsr a2, windowbase |
| 15 | rsync |
| 16 | movi a2, \start |
| 17 | wsr a2, windowstart |
| 18 | rsync |
| 19 | .endm |
| 20 | |
| 21 | .macro overflow_test shift, window, probe_ok, probe_ex |
| 22 | set_vector window_overflow_4, 0 |
| 23 | set_vector window_overflow_8, 0 |
| 24 | set_vector window_overflow_12, 0 |
| 25 | |
| 26 | movi a2, 1 | (((1 << ((\window) / 4)) | 1) << ((\shift) / 4)) |
| 27 | wsr a2, windowstart |
| 28 | reset_ps |
| 29 | |
| 30 | mov a2, a\probe_ok |
| 31 | set_vector window_overflow_\window, 10f |
| 32 | 1: |
| 33 | mov a2, a\probe_ex |
| 34 | test_fail |
| 35 | 10: |
| 36 | rsr a2, epc1 |
| 37 | movi a3, 1b |
| 38 | assert eq, a2, a3 |
| 39 | movi a2, 2f |
| 40 | wsr a2, epc1 |
| 41 | |
| 42 | rsr a2, windowbase |
| 43 | movi a3, (\shift) / 4 |
| 44 | assert eq, a2, a3 |
| 45 | rsr a2, ps |
| 46 | movi a3, 0x4001f |
| 47 | assert eq, a2, a3 |
| 48 | rfwo |
| 49 | test_fail |
| 50 | 2: |
| 51 | rsr a2, windowbase |
| 52 | assert eqi, a2, 0 |
| 53 | rsr a2, windowstart |
| 54 | movi a3, 1 | ((1 << ((\window) / 4)) << ((\shift) / 4)) |
| 55 | assert eq, a2, a3 |
| 56 | rsr a2, ps |
| 57 | movi a3, 0x4000f |
| 58 | assert eq, a2, a3 |
| 59 | .endm |
| 60 | |
| 61 | .macro overflow_tests shift, window, probe |
| 62 | .if \probe < 15 |
| 63 | overflow_test \shift, \window, %((\shift) - 1), \probe |
| 64 | overflow_tests \shift, \window, %((\probe) + 1) |
| 65 | .endif |
| 66 | .endm |
| 67 | |
| 68 | .macro all_overflow_tests |
| 69 | .irp shift, 4, 8, 12 |
| 70 | .irp window, 4, 8, 12 |
| 71 | overflow_tests \shift, \window, \shift |
| 72 | .endr |
| 73 | .endr |
| 74 | .endm |
| 75 | |
| 76 | test overflow |
| 77 | all_overflow_tests |
| 78 | test_end |
| 79 | |
| 80 | |
| 81 | .macro underflow_test window |
| 82 | set_vector window_underflow_4, 0 |
| 83 | set_vector window_underflow_8, 0 |
| 84 | set_vector window_underflow_12, 0 |
| 85 | |
| 86 | set_vector window_underflow_\window, 10f |
| 87 | |
| 88 | reset_window 1 |
| 89 | reset_ps |
| 90 | |
| 91 | ssai 2 |
| 92 | movi a2, 2f |
| 93 | slli a2, a2, 2 |
| 94 | movi a3, (\window) / 4 |
| 95 | src a0, a3, a2 |
| 96 | 1: |
| 97 | retw |
| 98 | test_fail |
| 99 | 10: |
| 100 | rsr a2, epc1 |
| 101 | movi a3, 1b |
| 102 | assert eq, a2, a3 |
| 103 | movi a2, 2f |
| 104 | wsr a2, epc1 |
| 105 | |
| 106 | rsr a2, ps |
| 107 | movi a3, 0x4001f |
| 108 | assert eq, a2, a3 |
| 109 | rsr a2, windowbase |
| 110 | movi a3, (XCHAL_NUM_AREGS - (\window)) / 4 |
| 111 | assert eq, a2, a3 |
| 112 | rsr a2, windowstart |
| 113 | assert eqi, a2, 1 |
| 114 | rfwu |
| 115 | 2: |
| 116 | rsr a2, ps |
| 117 | movi a3, 0x4000f |
| 118 | assert eq, a2, a3 |
| 119 | rsr a2, windowbase |
| 120 | assert eqi, a2, 0 |
| 121 | rsr a2, windowstart |
| 122 | assert bsi.l, a2, 0 |
| 123 | assert bsi.l, a2, (XCHAL_NUM_AREGS - (\window)) / 4 |
| 124 | .endm |
| 125 | |
| 126 | test underflow |
| 127 | set_vector window_overflow_4, 0 |
| 128 | set_vector window_overflow_8, 0 |
| 129 | set_vector window_overflow_12, 0 |
| 130 | |
| 131 | underflow_test 4 |
| 132 | underflow_test 8 |
| 133 | underflow_test 12 |
| 134 | test_end |
| 135 | |
| 136 | |
| 137 | .macro retw_test window |
| 138 | reset_window %(1 | (1 << ((XCHAL_NUM_AREGS - \window) / 4))) |
| 139 | reset_ps |
| 140 | |
| 141 | ssai 2 |
| 142 | movi a2, 1f |
| 143 | slli a2, a2, 2 |
| 144 | movi a3, (\window) / 4 |
| 145 | src a0, a3, a2 |
| 146 | retw |
| 147 | test_fail |
| 148 | 1: |
| 149 | rsr a2, ps |
| 150 | movi a3, 0x4000f |
| 151 | assert eq, a2, a3 |
| 152 | rsr a2, windowbase |
| 153 | movi a3, (XCHAL_NUM_AREGS - (\window)) / 4 |
| 154 | assert eq, a2, a3 |
| 155 | rsr a2, windowstart |
| 156 | assert bci.l, a2, 0 |
| 157 | assert bsi.l, a2, (XCHAL_NUM_AREGS - (\window)) / 4 |
| 158 | .endm |
| 159 | |
| 160 | test retw |
| 161 | set_vector window_underflow_4, 0 |
| 162 | set_vector window_underflow_8, 0 |
| 163 | set_vector window_underflow_12, 0 |
| 164 | |
| 165 | retw_test 4 |
| 166 | retw_test 8 |
| 167 | retw_test 12 |
| 168 | test_end |
| 169 | |
| 170 | test movsp |
| 171 | set_vector kernel, 2f |
| 172 | |
| 173 | reset_window 1 |
| 174 | reset_ps |
| 175 | 1: |
| 176 | movsp a2, a3 |
| 177 | test_fail |
| 178 | 2: |
| 179 | rsr a2, exccause |
| 180 | assert eqi, a2, 5 |
| 181 | rsr a2, epc1 |
| 182 | movi a3, 1b |
| 183 | assert eq, a2, a3 |
| 184 | |
| 185 | set_vector kernel, 0 |
| 186 | |
| 187 | reset_window %(0x1 | (1 << ((XCHAL_NUM_AREGS / 4) - 1))) |
| 188 | reset_ps |
| 189 | |
| 190 | movsp a2, a3 |
| 191 | test_end |
| 192 | |
| 193 | test rotw |
| 194 | reset_window 0x4b |
| 195 | reset_ps |
| 196 | |
| 197 | movi a3, 0x10 |
| 198 | |
| 199 | rotw 1 |
| 200 | rsr a2, windowbase |
| 201 | assert eqi, a2, 1 |
| 202 | movi a3, 0x11 |
| 203 | movi a7, 0x12 |
| 204 | |
| 205 | rotw 2 |
| 206 | rsr a2, windowbase |
| 207 | assert eqi, a2, 3 |
| 208 | movi a3, 0x13 |
| 209 | movi a7, 0x14 |
| 210 | movi a11, 0x15 |
| 211 | |
| 212 | rotw 3 |
| 213 | rsr a2, windowbase |
| 214 | assert eqi, a2, 6 |
| 215 | movi a3, 0x16 |
| 216 | movi a7, 0x17 |
| 217 | |
| 218 | #if XCHAL_NUM_AREGS == 32 |
| 219 | movi a2, 0x44 |
| 220 | wsr a2, windowstart |
| 221 | #elif XCHAL_NUM_AREGS == 64 |
| 222 | movi a2, 0x4004 |
| 223 | wsr a2, windowstart |
| 224 | rotw -8 |
| 225 | #else |
| 226 | #error XCHAL_NUM_AREGS unsupported |
| 227 | #endif |
| 228 | rsync |
| 229 | |
| 230 | movi a2, 0x10 |
| 231 | assert eq, a2, a11 |
| 232 | movi a11, 0x18 |
| 233 | movi a2, 0x11 |
| 234 | assert eq, a2, a15 |
| 235 | movi a15, 0x19 |
| 236 | |
| 237 | rotw 4 |
| 238 | movi a2, 0x12 |
| 239 | assert eq, a2, a3 |
| 240 | movi a2, 0x13 |
| 241 | assert eq, a2, a7 |
| 242 | movi a2, 0x14 |
| 243 | assert eq, a2, a11 |
| 244 | movi a2, 0x15 |
| 245 | assert eq, a2, a15 |
| 246 | |
| 247 | movi a2, 0x5 |
| 248 | wsr a2, windowstart |
| 249 | rsync |
| 250 | |
| 251 | rotw -2 |
| 252 | movi a2, 0x18 |
| 253 | assert eq, a2, a3 |
| 254 | movi a2, 0x19 |
| 255 | assert eq, a2, a7 |
| 256 | test_end |
| 257 | |
| 258 | .macro callw_test window |
| 259 | call\window 2f |
| 260 | 1: |
| 261 | test_fail |
| 262 | .align 4 |
| 263 | 2: |
| 264 | rsr a2, windowbase |
| 265 | assert eqi, a2, 0 |
| 266 | rsr a2, ps |
| 267 | movi a3, 0x4000f | ((\window) << 14) |
| 268 | assert eq, a2, a3 |
| 269 | movi a2, 1b |
| 270 | slli a2, a2, 2 |
| 271 | ssai 2 |
| 272 | movi a3, (\window) / 4 |
| 273 | src a2, a3, a2 |
| 274 | assert eq, a2, a\window |
| 275 | .endm |
| 276 | |
| 277 | test callw |
| 278 | reset_window 0x1 |
| 279 | reset_ps |
| 280 | |
| 281 | callw_test 4 |
| 282 | callw_test 8 |
| 283 | callw_test 12 |
| 284 | test_end |
| 285 | |
| 286 | |
| 287 | .macro entry_test window |
| 288 | reset_window 0x1 |
| 289 | reset_ps |
| 290 | movi a2, 0x4000f | ((\window) << 14) |
| 291 | wsr a2, ps |
| 292 | isync |
| 293 | movi a3, 0x12345678 |
| 294 | j 1f |
| 295 | .align 4 |
| 296 | 1: |
| 297 | entry a3, 0x5678 |
| 298 | movi a2, 0x12340000 |
| 299 | assert eq, a2, a3 |
| 300 | rsr a2, windowbase |
| 301 | assert eqi, a2, (\window) / 4 |
| 302 | rsr a2, windowstart |
| 303 | movi a3, 1 | (1 << ((\window) / 4)) |
| 304 | assert eq, a2, a3 |
| 305 | rotw -(\window) / 4 |
| 306 | .endm |
| 307 | |
| 308 | test entry |
| 309 | entry_test 4 |
| 310 | entry_test 8 |
| 311 | entry_test 12 |
| 312 | test_end |
| 313 | |
| 314 | .macro entry_overflow_test window, free, next_window |
| 315 | set_vector window_overflow_4, 0 |
| 316 | set_vector window_overflow_8, 0 |
| 317 | set_vector window_overflow_12, 0 |
| 318 | set_vector window_overflow_\next_window, 10f |
| 319 | |
| 320 | movi a2, \window |
| 321 | movi a2, \free |
| 322 | movi a2, \next_window |
| 323 | reset_window %(1 | ((1 | (1 << ((\next_window) / 4))) << ((\free) / 4))) |
| 324 | reset_ps |
| 325 | movi a2, 0x4000f | ((\window) << 14) |
| 326 | wsr a2, ps |
| 327 | isync |
| 328 | movi a3, 0x12345678 |
| 329 | j 1f |
| 330 | .align 4 |
| 331 | 1: |
| 332 | entry a3, 0x5678 |
| 333 | test_fail |
| 334 | .align 4 |
| 335 | 10: |
| 336 | rsr a2, epc1 |
| 337 | movi a3, 1b |
| 338 | assert eq, a2, a3 |
| 339 | movi a2, 2f |
| 340 | wsr a2, epc1 |
| 341 | |
| 342 | rsr a2, windowbase |
| 343 | movi a3, (\free) / 4 |
| 344 | assert eq, a2, a3 |
| 345 | rfwo |
| 346 | 2: |
| 347 | .endm |
| 348 | |
| 349 | .macro all_entry_overflow_tests |
| 350 | .irp window, 4, 8, 12 |
| 351 | .irp next_window, 4, 8, 12 |
| 352 | .irp free, 4, 8, 12 |
| 353 | .if \free <= \window |
| 354 | entry_overflow_test \window, \free, \next_window |
| 355 | .endif |
| 356 | .endr |
| 357 | .endr |
| 358 | .endr |
| 359 | .endm |
| 360 | |
| 361 | test entry_overflow |
| 362 | all_entry_overflow_tests |
| 363 | test_end |
| 364 | |
| 365 | #endif |
| 366 | |
| 367 | test_suite_end |