Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftests/rseq: Introduce rseq_get_abi() helper

This is done in preparation for the selftest uplift to become compatible
with glibc-2.35.

glibc-2.35 exposes the rseq per-thread data in the TCB, accessible
at an offset from the thread pointer, rather than through an actual
Thread-Local Storage (TLS) variable, as the kernel selftests initially
expected.

Introduce a rseq_get_abi() helper, initially using the __rseq_abi
TLS variable, in preparation for changing this userspace ABI for one
which is compatible with glibc-2.35.

Note that the __rseq_abi TLS and glibc-2.35's ABI for per-thread data
cannot actively coexist in a process, because the kernel supports only
a single rseq registration per thread.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lkml.kernel.org/r/20220124171253.22072-6-mathieu.desnoyers@efficios.com

authored by

Mathieu Desnoyers and committed by
Peter Zijlstra
e546cd48 94b80a19

+99 -94
+16 -16
tools/testing/selftests/rseq/rseq-arm.h
··· 185 185 "5:\n\t" 186 186 : /* gcc asm goto does not allow outputs */ 187 187 : [cpu_id] "r" (cpu), 188 - [current_cpu_id] "m" (__rseq_abi.cpu_id), 189 - [rseq_cs] "m" (__rseq_abi.rseq_cs), 188 + [current_cpu_id] "m" (rseq_get_abi()->cpu_id), 189 + [rseq_cs] "m" (rseq_get_abi()->rseq_cs), 190 190 [v] "m" (*v), 191 191 [expect] "r" (expect), 192 192 [newv] "r" (newv) ··· 255 255 "5:\n\t" 256 256 : /* gcc asm goto does not allow outputs */ 257 257 : [cpu_id] "r" (cpu), 258 - [current_cpu_id] "m" (__rseq_abi.cpu_id), 259 - [rseq_cs] "m" (__rseq_abi.rseq_cs), 258 + [current_cpu_id] "m" (rseq_get_abi()->cpu_id), 259 + [rseq_cs] "m" (rseq_get_abi()->rseq_cs), 260 260 /* final store input */ 261 261 [v] "m" (*v), 262 262 [expectnot] "r" (expectnot), ··· 316 316 "5:\n\t" 317 317 : /* gcc asm goto does not allow outputs */ 318 318 : [cpu_id] "r" (cpu), 319 - [current_cpu_id] "m" (__rseq_abi.cpu_id), 320 - [rseq_cs] "m" (__rseq_abi.rseq_cs), 319 + [current_cpu_id] "m" (rseq_get_abi()->cpu_id), 320 + [rseq_cs] "m" (rseq_get_abi()->rseq_cs), 321 321 [v] "m" (*v), 322 322 [count] "Ir" (count) 323 323 RSEQ_INJECT_INPUT ··· 381 381 "5:\n\t" 382 382 : /* gcc asm goto does not allow outputs */ 383 383 : [cpu_id] "r" (cpu), 384 - [current_cpu_id] "m" (__rseq_abi.cpu_id), 385 - [rseq_cs] "m" (__rseq_abi.rseq_cs), 384 + [current_cpu_id] "m" (rseq_get_abi()->cpu_id), 385 + [rseq_cs] "m" (rseq_get_abi()->rseq_cs), 386 386 /* try store input */ 387 387 [v2] "m" (*v2), 388 388 [newv2] "r" (newv2), ··· 457 457 "5:\n\t" 458 458 : /* gcc asm goto does not allow outputs */ 459 459 : [cpu_id] "r" (cpu), 460 - [current_cpu_id] "m" (__rseq_abi.cpu_id), 461 - [rseq_cs] "m" (__rseq_abi.rseq_cs), 460 + [current_cpu_id] "m" (rseq_get_abi()->cpu_id), 461 + [rseq_cs] "m" (rseq_get_abi()->rseq_cs), 462 462 /* try store input */ 463 463 [v2] "m" (*v2), 464 464 [newv2] "r" (newv2), ··· 537 537 "5:\n\t" 538 538 : /* gcc asm goto does not allow outputs */ 539 539 : [cpu_id] "r" (cpu), 540 - [current_cpu_id] "m" (__rseq_abi.cpu_id), 541 - [rseq_cs] "m" (__rseq_abi.rseq_cs), 540 + [current_cpu_id] "m" (rseq_get_abi()->cpu_id), 541 + [rseq_cs] "m" (rseq_get_abi()->rseq_cs), 542 542 /* cmp2 input */ 543 543 [v2] "m" (*v2), 544 544 [expect2] "r" (expect2), ··· 657 657 "8:\n\t" 658 658 : /* gcc asm goto does not allow outputs */ 659 659 : [cpu_id] "r" (cpu), 660 - [current_cpu_id] "m" (__rseq_abi.cpu_id), 661 - [rseq_cs] "m" (__rseq_abi.rseq_cs), 660 + [current_cpu_id] "m" (rseq_get_abi()->cpu_id), 661 + [rseq_cs] "m" (rseq_get_abi()->rseq_cs), 662 662 /* final store input */ 663 663 [v] "m" (*v), 664 664 [expect] "r" (expect), ··· 782 782 "8:\n\t" 783 783 : /* gcc asm goto does not allow outputs */ 784 784 : [cpu_id] "r" (cpu), 785 - [current_cpu_id] "m" (__rseq_abi.cpu_id), 786 - [rseq_cs] "m" (__rseq_abi.rseq_cs), 785 + [current_cpu_id] "m" (rseq_get_abi()->cpu_id), 786 + [rseq_cs] "m" (rseq_get_abi()->rseq_cs), 787 787 /* final store input */ 788 788 [v] "m" (*v), 789 789 [expect] "r" (expect),
+16 -16
tools/testing/selftests/rseq/rseq-arm64.h
··· 230 230 RSEQ_ASM_DEFINE_ABORT(4, abort) 231 231 : /* gcc asm goto does not allow outputs */ 232 232 : [cpu_id] "r" (cpu), 233 - [current_cpu_id] "Qo" (__rseq_abi.cpu_id), 234 - [rseq_cs] "m" (__rseq_abi.rseq_cs), 233 + [current_cpu_id] "Qo" (rseq_get_abi()->cpu_id), 234 + [rseq_cs] "m" (rseq_get_abi()->rseq_cs), 235 235 [v] "Qo" (*v), 236 236 [expect] "r" (expect), 237 237 [newv] "r" (newv) ··· 287 287 RSEQ_ASM_DEFINE_ABORT(4, abort) 288 288 : /* gcc asm goto does not allow outputs */ 289 289 : [cpu_id] "r" (cpu), 290 - [current_cpu_id] "Qo" (__rseq_abi.cpu_id), 291 - [rseq_cs] "m" (__rseq_abi.rseq_cs), 290 + [current_cpu_id] "Qo" (rseq_get_abi()->cpu_id), 291 + [rseq_cs] "m" (rseq_get_abi()->rseq_cs), 292 292 [v] "Qo" (*v), 293 293 [expectnot] "r" (expectnot), 294 294 [load] "Qo" (*load), ··· 337 337 RSEQ_ASM_DEFINE_ABORT(4, abort) 338 338 : /* gcc asm goto does not allow outputs */ 339 339 : [cpu_id] "r" (cpu), 340 - [current_cpu_id] "Qo" (__rseq_abi.cpu_id), 341 - [rseq_cs] "m" (__rseq_abi.rseq_cs), 340 + [current_cpu_id] "Qo" (rseq_get_abi()->cpu_id), 341 + [rseq_cs] "m" (rseq_get_abi()->rseq_cs), 342 342 [v] "Qo" (*v), 343 343 [count] "r" (count) 344 344 RSEQ_INJECT_INPUT ··· 388 388 RSEQ_ASM_DEFINE_ABORT(4, abort) 389 389 : /* gcc asm goto does not allow outputs */ 390 390 : [cpu_id] "r" (cpu), 391 - [current_cpu_id] "Qo" (__rseq_abi.cpu_id), 392 - [rseq_cs] "m" (__rseq_abi.rseq_cs), 391 + [current_cpu_id] "Qo" (rseq_get_abi()->cpu_id), 392 + [rseq_cs] "m" (rseq_get_abi()->rseq_cs), 393 393 [expect] "r" (expect), 394 394 [v] "Qo" (*v), 395 395 [newv] "r" (newv), ··· 447 447 RSEQ_ASM_DEFINE_ABORT(4, abort) 448 448 : /* gcc asm goto does not allow outputs */ 449 449 : [cpu_id] "r" (cpu), 450 - [current_cpu_id] "Qo" (__rseq_abi.cpu_id), 451 - [rseq_cs] "m" (__rseq_abi.rseq_cs), 450 + [current_cpu_id] "Qo" (rseq_get_abi()->cpu_id), 451 + [rseq_cs] "m" (rseq_get_abi()->rseq_cs), 452 452 [expect] "r" (expect), 453 453 [v] "Qo" (*v), 454 454 [newv] "r" (newv), ··· 508 508 RSEQ_ASM_DEFINE_ABORT(4, abort) 509 509 : /* gcc asm goto does not allow outputs */ 510 510 : [cpu_id] "r" (cpu), 511 - [current_cpu_id] "Qo" (__rseq_abi.cpu_id), 512 - [rseq_cs] "m" (__rseq_abi.rseq_cs), 511 + [current_cpu_id] "Qo" (rseq_get_abi()->cpu_id), 512 + [rseq_cs] "m" (rseq_get_abi()->rseq_cs), 513 513 [v] "Qo" (*v), 514 514 [expect] "r" (expect), 515 515 [v2] "Qo" (*v2), ··· 569 569 RSEQ_ASM_DEFINE_ABORT(4, abort) 570 570 : /* gcc asm goto does not allow outputs */ 571 571 : [cpu_id] "r" (cpu), 572 - [current_cpu_id] "Qo" (__rseq_abi.cpu_id), 573 - [rseq_cs] "m" (__rseq_abi.rseq_cs), 572 + [current_cpu_id] "Qo" (rseq_get_abi()->cpu_id), 573 + [rseq_cs] "m" (rseq_get_abi()->rseq_cs), 574 574 [expect] "r" (expect), 575 575 [v] "Qo" (*v), 576 576 [newv] "r" (newv), ··· 629 629 RSEQ_ASM_DEFINE_ABORT(4, abort) 630 630 : /* gcc asm goto does not allow outputs */ 631 631 : [cpu_id] "r" (cpu), 632 - [current_cpu_id] "Qo" (__rseq_abi.cpu_id), 633 - [rseq_cs] "m" (__rseq_abi.rseq_cs), 632 + [current_cpu_id] "Qo" (rseq_get_abi()->cpu_id), 633 + [rseq_cs] "m" (rseq_get_abi()->rseq_cs), 634 634 [expect] "r" (expect), 635 635 [v] "Qo" (*v), 636 636 [newv] "r" (newv),
+16 -16
tools/testing/selftests/rseq/rseq-mips.h
··· 190 190 "5:\n\t" 191 191 : /* gcc asm goto does not allow outputs */ 192 192 : [cpu_id] "r" (cpu), 193 - [current_cpu_id] "m" (__rseq_abi.cpu_id), 194 - [rseq_cs] "m" (__rseq_abi.rseq_cs), 193 + [current_cpu_id] "m" (rseq_get_abi()->cpu_id), 194 + [rseq_cs] "m" (rseq_get_abi()->rseq_cs), 195 195 [v] "m" (*v), 196 196 [expect] "r" (expect), 197 197 [newv] "r" (newv) ··· 258 258 "5:\n\t" 259 259 : /* gcc asm goto does not allow outputs */ 260 260 : [cpu_id] "r" (cpu), 261 - [current_cpu_id] "m" (__rseq_abi.cpu_id), 262 - [rseq_cs] "m" (__rseq_abi.rseq_cs), 261 + [current_cpu_id] "m" (rseq_get_abi()->cpu_id), 262 + [rseq_cs] "m" (rseq_get_abi()->rseq_cs), 263 263 /* final store input */ 264 264 [v] "m" (*v), 265 265 [expectnot] "r" (expectnot), ··· 319 319 "5:\n\t" 320 320 : /* gcc asm goto does not allow outputs */ 321 321 : [cpu_id] "r" (cpu), 322 - [current_cpu_id] "m" (__rseq_abi.cpu_id), 323 - [rseq_cs] "m" (__rseq_abi.rseq_cs), 322 + [current_cpu_id] "m" (rseq_get_abi()->cpu_id), 323 + [rseq_cs] "m" (rseq_get_abi()->rseq_cs), 324 324 [v] "m" (*v), 325 325 [count] "Ir" (count) 326 326 RSEQ_INJECT_INPUT ··· 382 382 "5:\n\t" 383 383 : /* gcc asm goto does not allow outputs */ 384 384 : [cpu_id] "r" (cpu), 385 - [current_cpu_id] "m" (__rseq_abi.cpu_id), 386 - [rseq_cs] "m" (__rseq_abi.rseq_cs), 385 + [current_cpu_id] "m" (rseq_get_abi()->cpu_id), 386 + [rseq_cs] "m" (rseq_get_abi()->rseq_cs), 387 387 /* try store input */ 388 388 [v2] "m" (*v2), 389 389 [newv2] "r" (newv2), ··· 456 456 "5:\n\t" 457 457 : /* gcc asm goto does not allow outputs */ 458 458 : [cpu_id] "r" (cpu), 459 - [current_cpu_id] "m" (__rseq_abi.cpu_id), 460 - [rseq_cs] "m" (__rseq_abi.rseq_cs), 459 + [current_cpu_id] "m" (rseq_get_abi()->cpu_id), 460 + [rseq_cs] "m" (rseq_get_abi()->rseq_cs), 461 461 /* try store input */ 462 462 [v2] "m" (*v2), 463 463 [newv2] "r" (newv2), ··· 532 532 "5:\n\t" 533 533 : /* gcc asm goto does not allow outputs */ 534 534 : [cpu_id] "r" (cpu), 535 - [current_cpu_id] "m" (__rseq_abi.cpu_id), 536 - [rseq_cs] "m" (__rseq_abi.rseq_cs), 535 + [current_cpu_id] "m" (rseq_get_abi()->cpu_id), 536 + [rseq_cs] "m" (rseq_get_abi()->rseq_cs), 537 537 /* cmp2 input */ 538 538 [v2] "m" (*v2), 539 539 [expect2] "r" (expect2), ··· 649 649 "8:\n\t" 650 650 : /* gcc asm goto does not allow outputs */ 651 651 : [cpu_id] "r" (cpu), 652 - [current_cpu_id] "m" (__rseq_abi.cpu_id), 653 - [rseq_cs] "m" (__rseq_abi.rseq_cs), 652 + [current_cpu_id] "m" (rseq_get_abi()->cpu_id), 653 + [rseq_cs] "m" (rseq_get_abi()->rseq_cs), 654 654 /* final store input */ 655 655 [v] "m" (*v), 656 656 [expect] "r" (expect), ··· 771 771 "8:\n\t" 772 772 : /* gcc asm goto does not allow outputs */ 773 773 : [cpu_id] "r" (cpu), 774 - [current_cpu_id] "m" (__rseq_abi.cpu_id), 775 - [rseq_cs] "m" (__rseq_abi.rseq_cs), 774 + [current_cpu_id] "m" (rseq_get_abi()->cpu_id), 775 + [rseq_cs] "m" (rseq_get_abi()->rseq_cs), 776 776 /* final store input */ 777 777 [v] "m" (*v), 778 778 [expect] "r" (expect),
+16 -16
tools/testing/selftests/rseq/rseq-ppc.h
··· 235 235 RSEQ_ASM_DEFINE_ABORT(4, abort) 236 236 : /* gcc asm goto does not allow outputs */ 237 237 : [cpu_id] "r" (cpu), 238 - [current_cpu_id] "m" (__rseq_abi.cpu_id), 239 - [rseq_cs] "m" (__rseq_abi.rseq_cs), 238 + [current_cpu_id] "m" (rseq_get_abi()->cpu_id), 239 + [rseq_cs] "m" (rseq_get_abi()->rseq_cs), 240 240 [v] "m" (*v), 241 241 [expect] "r" (expect), 242 242 [newv] "r" (newv) ··· 301 301 RSEQ_ASM_DEFINE_ABORT(4, abort) 302 302 : /* gcc asm goto does not allow outputs */ 303 303 : [cpu_id] "r" (cpu), 304 - [current_cpu_id] "m" (__rseq_abi.cpu_id), 305 - [rseq_cs] "m" (__rseq_abi.rseq_cs), 304 + [current_cpu_id] "m" (rseq_get_abi()->cpu_id), 305 + [rseq_cs] "m" (rseq_get_abi()->rseq_cs), 306 306 /* final store input */ 307 307 [v] "m" (*v), 308 308 [expectnot] "r" (expectnot), ··· 359 359 RSEQ_ASM_DEFINE_ABORT(4, abort) 360 360 : /* gcc asm goto does not allow outputs */ 361 361 : [cpu_id] "r" (cpu), 362 - [current_cpu_id] "m" (__rseq_abi.cpu_id), 363 - [rseq_cs] "m" (__rseq_abi.rseq_cs), 362 + [current_cpu_id] "m" (rseq_get_abi()->cpu_id), 363 + [rseq_cs] "m" (rseq_get_abi()->rseq_cs), 364 364 /* final store input */ 365 365 [v] "m" (*v), 366 366 [count] "r" (count) ··· 419 419 RSEQ_ASM_DEFINE_ABORT(4, abort) 420 420 : /* gcc asm goto does not allow outputs */ 421 421 : [cpu_id] "r" (cpu), 422 - [current_cpu_id] "m" (__rseq_abi.cpu_id), 423 - [rseq_cs] "m" (__rseq_abi.rseq_cs), 422 + [current_cpu_id] "m" (rseq_get_abi()->cpu_id), 423 + [rseq_cs] "m" (rseq_get_abi()->rseq_cs), 424 424 /* try store input */ 425 425 [v2] "m" (*v2), 426 426 [newv2] "r" (newv2), ··· 489 489 RSEQ_ASM_DEFINE_ABORT(4, abort) 490 490 : /* gcc asm goto does not allow outputs */ 491 491 : [cpu_id] "r" (cpu), 492 - [current_cpu_id] "m" (__rseq_abi.cpu_id), 493 - [rseq_cs] "m" (__rseq_abi.rseq_cs), 492 + [current_cpu_id] "m" (rseq_get_abi()->cpu_id), 493 + [rseq_cs] "m" (rseq_get_abi()->rseq_cs), 494 494 /* try store input */ 495 495 [v2] "m" (*v2), 496 496 [newv2] "r" (newv2), ··· 560 560 RSEQ_ASM_DEFINE_ABORT(4, abort) 561 561 : /* gcc asm goto does not allow outputs */ 562 562 : [cpu_id] "r" (cpu), 563 - [current_cpu_id] "m" (__rseq_abi.cpu_id), 564 - [rseq_cs] "m" (__rseq_abi.rseq_cs), 563 + [current_cpu_id] "m" (rseq_get_abi()->cpu_id), 564 + [rseq_cs] "m" (rseq_get_abi()->rseq_cs), 565 565 /* cmp2 input */ 566 566 [v2] "m" (*v2), 567 567 [expect2] "r" (expect2), ··· 635 635 RSEQ_ASM_DEFINE_ABORT(4, abort) 636 636 : /* gcc asm goto does not allow outputs */ 637 637 : [cpu_id] "r" (cpu), 638 - [current_cpu_id] "m" (__rseq_abi.cpu_id), 639 - [rseq_cs] "m" (__rseq_abi.rseq_cs), 638 + [current_cpu_id] "m" (rseq_get_abi()->cpu_id), 639 + [rseq_cs] "m" (rseq_get_abi()->rseq_cs), 640 640 /* final store input */ 641 641 [v] "m" (*v), 642 642 [expect] "r" (expect), ··· 711 711 RSEQ_ASM_DEFINE_ABORT(4, abort) 712 712 : /* gcc asm goto does not allow outputs */ 713 713 : [cpu_id] "r" (cpu), 714 - [current_cpu_id] "m" (__rseq_abi.cpu_id), 715 - [rseq_cs] "m" (__rseq_abi.rseq_cs), 714 + [current_cpu_id] "m" (rseq_get_abi()->cpu_id), 715 + [rseq_cs] "m" (rseq_get_abi()->rseq_cs), 716 716 /* final store input */ 717 717 [v] "m" (*v), 718 718 [expect] "r" (expect),
+12 -12
tools/testing/selftests/rseq/rseq-s390.h
··· 165 165 RSEQ_ASM_DEFINE_ABORT(4, "", abort) 166 166 : /* gcc asm goto does not allow outputs */ 167 167 : [cpu_id] "r" (cpu), 168 - [current_cpu_id] "m" (__rseq_abi.cpu_id), 169 - [rseq_cs] "m" (__rseq_abi.rseq_cs), 168 + [current_cpu_id] "m" (rseq_get_abi()->cpu_id), 169 + [rseq_cs] "m" (rseq_get_abi()->rseq_cs), 170 170 [v] "m" (*v), 171 171 [expect] "r" (expect), 172 172 [newv] "r" (newv) ··· 233 233 RSEQ_ASM_DEFINE_ABORT(4, "", abort) 234 234 : /* gcc asm goto does not allow outputs */ 235 235 : [cpu_id] "r" (cpu), 236 - [current_cpu_id] "m" (__rseq_abi.cpu_id), 237 - [rseq_cs] "m" (__rseq_abi.rseq_cs), 236 + [current_cpu_id] "m" (rseq_get_abi()->cpu_id), 237 + [rseq_cs] "m" (rseq_get_abi()->rseq_cs), 238 238 /* final store input */ 239 239 [v] "m" (*v), 240 240 [expectnot] "r" (expectnot), ··· 288 288 RSEQ_ASM_DEFINE_ABORT(4, "", abort) 289 289 : /* gcc asm goto does not allow outputs */ 290 290 : [cpu_id] "r" (cpu), 291 - [current_cpu_id] "m" (__rseq_abi.cpu_id), 292 - [rseq_cs] "m" (__rseq_abi.rseq_cs), 291 + [current_cpu_id] "m" (rseq_get_abi()->cpu_id), 292 + [rseq_cs] "m" (rseq_get_abi()->rseq_cs), 293 293 /* final store input */ 294 294 [v] "m" (*v), 295 295 [count] "r" (count) ··· 347 347 RSEQ_ASM_DEFINE_ABORT(4, "", abort) 348 348 : /* gcc asm goto does not allow outputs */ 349 349 : [cpu_id] "r" (cpu), 350 - [current_cpu_id] "m" (__rseq_abi.cpu_id), 351 - [rseq_cs] "m" (__rseq_abi.rseq_cs), 350 + [current_cpu_id] "m" (rseq_get_abi()->cpu_id), 351 + [rseq_cs] "m" (rseq_get_abi()->rseq_cs), 352 352 /* try store input */ 353 353 [v2] "m" (*v2), 354 354 [newv2] "r" (newv2), ··· 426 426 RSEQ_ASM_DEFINE_ABORT(4, "", abort) 427 427 : /* gcc asm goto does not allow outputs */ 428 428 : [cpu_id] "r" (cpu), 429 - [current_cpu_id] "m" (__rseq_abi.cpu_id), 430 - [rseq_cs] "m" (__rseq_abi.rseq_cs), 429 + [current_cpu_id] "m" (rseq_get_abi()->cpu_id), 430 + [rseq_cs] "m" (rseq_get_abi()->rseq_cs), 431 431 /* cmp2 input */ 432 432 [v2] "m" (*v2), 433 433 [expect2] "r" (expect2), ··· 534 534 #endif 535 535 : /* gcc asm goto does not allow outputs */ 536 536 : [cpu_id] "r" (cpu), 537 - [current_cpu_id] "m" (__rseq_abi.cpu_id), 538 - [rseq_cs] "m" (__rseq_abi.rseq_cs), 537 + [current_cpu_id] "m" (rseq_get_abi()->cpu_id), 538 + [rseq_cs] "m" (rseq_get_abi()->rseq_cs), 539 539 /* final store input */ 540 540 [v] "m" (*v), 541 541 [expect] "r" (expect),
+15 -15
tools/testing/selftests/rseq/rseq-x86.h
··· 141 141 RSEQ_ASM_DEFINE_ABORT(4, "", abort) 142 142 : /* gcc asm goto does not allow outputs */ 143 143 : [cpu_id] "r" (cpu), 144 - [rseq_abi] "r" (&__rseq_abi), 144 + [rseq_abi] "r" (rseq_get_abi()), 145 145 [v] "m" (*v), 146 146 [expect] "r" (expect), 147 147 [newv] "r" (newv) ··· 207 207 RSEQ_ASM_DEFINE_ABORT(4, "", abort) 208 208 : /* gcc asm goto does not allow outputs */ 209 209 : [cpu_id] "r" (cpu), 210 - [rseq_abi] "r" (&__rseq_abi), 210 + [rseq_abi] "r" (rseq_get_abi()), 211 211 /* final store input */ 212 212 [v] "m" (*v), 213 213 [expectnot] "r" (expectnot), ··· 258 258 RSEQ_ASM_DEFINE_ABORT(4, "", abort) 259 259 : /* gcc asm goto does not allow outputs */ 260 260 : [cpu_id] "r" (cpu), 261 - [rseq_abi] "r" (&__rseq_abi), 261 + [rseq_abi] "r" (rseq_get_abi()), 262 262 /* final store input */ 263 263 [v] "m" (*v), 264 264 [count] "er" (count) ··· 314 314 RSEQ_ASM_DEFINE_ABORT(4, "", abort) 315 315 : /* gcc asm goto does not allow outputs */ 316 316 : [cpu_id] "r" (cpu), 317 - [rseq_abi] "r" (&__rseq_abi), 317 + [rseq_abi] "r" (rseq_get_abi()), 318 318 /* final store input */ 319 319 [ptr] "m" (*ptr), 320 320 [off] "er" (off), ··· 372 372 RSEQ_ASM_DEFINE_ABORT(4, "", abort) 373 373 : /* gcc asm goto does not allow outputs */ 374 374 : [cpu_id] "r" (cpu), 375 - [rseq_abi] "r" (&__rseq_abi), 375 + [rseq_abi] "r" (rseq_get_abi()), 376 376 /* try store input */ 377 377 [v2] "m" (*v2), 378 378 [newv2] "r" (newv2), ··· 449 449 RSEQ_ASM_DEFINE_ABORT(4, "", abort) 450 450 : /* gcc asm goto does not allow outputs */ 451 451 : [cpu_id] "r" (cpu), 452 - [rseq_abi] "r" (&__rseq_abi), 452 + [rseq_abi] "r" (rseq_get_abi()), 453 453 /* cmp2 input */ 454 454 [v2] "m" (*v2), 455 455 [expect2] "r" (expect2), ··· 555 555 #endif 556 556 : /* gcc asm goto does not allow outputs */ 557 557 : [cpu_id] "r" (cpu), 558 - [rseq_abi] "r" (&__rseq_abi), 558 + [rseq_abi] "r" (rseq_get_abi()), 559 559 /* final store input */ 560 560 [v] "m" (*v), 561 561 [expect] "r" (expect), ··· 719 719 RSEQ_ASM_DEFINE_ABORT(4, "", abort) 720 720 : /* gcc asm goto does not allow outputs */ 721 721 : [cpu_id] "r" (cpu), 722 - [rseq_abi] "r" (&__rseq_abi), 722 + [rseq_abi] "r" (rseq_get_abi()), 723 723 [v] "m" (*v), 724 724 [expect] "r" (expect), 725 725 [newv] "r" (newv) ··· 785 785 RSEQ_ASM_DEFINE_ABORT(4, "", abort) 786 786 : /* gcc asm goto does not allow outputs */ 787 787 : [cpu_id] "r" (cpu), 788 - [rseq_abi] "r" (&__rseq_abi), 788 + [rseq_abi] "r" (rseq_get_abi()), 789 789 /* final store input */ 790 790 [v] "m" (*v), 791 791 [expectnot] "r" (expectnot), ··· 836 836 RSEQ_ASM_DEFINE_ABORT(4, "", abort) 837 837 : /* gcc asm goto does not allow outputs */ 838 838 : [cpu_id] "r" (cpu), 839 - [rseq_abi] "r" (&__rseq_abi), 839 + [rseq_abi] "r" (rseq_get_abi()), 840 840 /* final store input */ 841 841 [v] "m" (*v), 842 842 [count] "ir" (count) ··· 894 894 RSEQ_ASM_DEFINE_ABORT(4, "", abort) 895 895 : /* gcc asm goto does not allow outputs */ 896 896 : [cpu_id] "r" (cpu), 897 - [rseq_abi] "r" (&__rseq_abi), 897 + [rseq_abi] "r" (rseq_get_abi()), 898 898 /* try store input */ 899 899 [v2] "m" (*v2), 900 900 [newv2] "m" (newv2), ··· 962 962 RSEQ_ASM_DEFINE_ABORT(4, "", abort) 963 963 : /* gcc asm goto does not allow outputs */ 964 964 : [cpu_id] "r" (cpu), 965 - [rseq_abi] "r" (&__rseq_abi), 965 + [rseq_abi] "r" (rseq_get_abi()), 966 966 /* try store input */ 967 967 [v2] "m" (*v2), 968 968 [newv2] "r" (newv2), ··· 1032 1032 RSEQ_ASM_DEFINE_ABORT(4, "", abort) 1033 1033 : /* gcc asm goto does not allow outputs */ 1034 1034 : [cpu_id] "r" (cpu), 1035 - [rseq_abi] "r" (&__rseq_abi), 1035 + [rseq_abi] "r" (rseq_get_abi()), 1036 1036 /* cmp2 input */ 1037 1037 [v2] "m" (*v2), 1038 1038 [expect2] "r" (expect2), ··· 1142 1142 #endif 1143 1143 : /* gcc asm goto does not allow outputs */ 1144 1144 : [cpu_id] "r" (cpu), 1145 - [rseq_abi] "r" (&__rseq_abi), 1145 + [rseq_abi] "r" (rseq_get_abi()), 1146 1146 /* final store input */ 1147 1147 [v] "m" (*v), 1148 1148 [expect] "m" (expect), ··· 1255 1255 #endif 1256 1256 : /* gcc asm goto does not allow outputs */ 1257 1257 : [cpu_id] "r" (cpu), 1258 - [rseq_abi] "r" (&__rseq_abi), 1258 + [rseq_abi] "r" (rseq_get_abi()), 1259 1259 /* final store input */ 1260 1260 [v] "m" (*v), 1261 1261 [expect] "m" (expect),
+8 -3
tools/testing/selftests/rseq/rseq.h
··· 46 46 extern __thread struct rseq_abi __rseq_abi; 47 47 extern int __rseq_handled; 48 48 49 + static inline struct rseq_abi *rseq_get_abi(void) 50 + { 51 + return &__rseq_abi; 52 + } 53 + 49 54 #define rseq_likely(x) __builtin_expect(!!(x), 1) 50 55 #define rseq_unlikely(x) __builtin_expect(!!(x), 0) 51 56 #define rseq_barrier() __asm__ __volatile__("" : : : "memory") ··· 113 108 */ 114 109 static inline int32_t rseq_current_cpu_raw(void) 115 110 { 116 - return RSEQ_ACCESS_ONCE(__rseq_abi.cpu_id); 111 + return RSEQ_ACCESS_ONCE(rseq_get_abi()->cpu_id); 117 112 } 118 113 119 114 /* ··· 129 124 */ 130 125 static inline uint32_t rseq_cpu_start(void) 131 126 { 132 - return RSEQ_ACCESS_ONCE(__rseq_abi.cpu_id_start); 127 + return RSEQ_ACCESS_ONCE(rseq_get_abi()->cpu_id_start); 133 128 } 134 129 135 130 static inline uint32_t rseq_current_cpu(void) ··· 144 139 145 140 static inline void rseq_clear_rseq_cs(void) 146 141 { 147 - RSEQ_WRITE_ONCE(__rseq_abi.rseq_cs.arch.ptr, 0); 142 + RSEQ_WRITE_ONCE(rseq_get_abi()->rseq_cs.arch.ptr, 0); 148 143 } 149 144 150 145 /*