AT_SYSINFO is what kernel calls sysenter address in vdso segment. Kernel saves it for each thread in %gs:SYSINFO_OFFSET ?? as part of kernel TCB (thread control block) at beginning of TLS ??
| 459 | // Kernel saves it for each thread in %gs:SYSINFO_OFFSET ?? |
| 460 | // as part of kernel TCB (thread control block) at beginning of TLS ?? |
| 461 | void * |
| 462 | TLSInfo_GetThreadSysinfo() |
| 463 | { |
| 464 | void *sysinfo; |
| 465 | |
| 466 | #if defined(__i386__) || defined(__x86_64__) |
| 467 | asm volatile (CLEAN_FOR_64_BIT(mov %%gs:) DEFAULT_SYSINFO_OFFSET ", %0\n\t" |
| 468 | : "=r" (sysinfo)); |
| 469 | #elif defined(__arm__) |
| 470 | asm volatile ("mrc p15, 0, %0, c13, c0, 3 @ load_tp_hard\n\t" |
| 471 | : "=r" (sysinfo)); |
| 472 | #elif defined(__aarch64__) |
| 473 | asm volatile ("mrs %0, tpidr_el0" : "=r" (sysinfo)); |
| 474 | #elif defined(__riscv) |
| 475 | asm volatile ("addi %0, tp, 0" : "=r" (sysinfo)); |
| 476 | #else /* if defined(__i386__) || defined(__x86_64__) */ |
| 477 | # error "current architecture not supported" |
| 478 | #endif /* if defined(__i386__) || defined(__x86_64__) */ |
| 479 | return sysinfo; |
| 480 | } |
| 481 | |
| 482 | void |
| 483 | TLSInfo_SetThreadSysinfo(void *sysinfo) |