^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) #include <stdio.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) #include <stddef.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) #include <signal.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) #include <poll.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #include <sys/mman.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #include <sys/user.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #define __FRAME_OFFSETS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <linux/ptrace.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <asm/types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #define DEFINE(sym, val) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) asm volatile("\n->" #sym " %0 " #val : : "i" (val))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #define DEFINE_LONGS(sym, val) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) asm volatile("\n->" #sym " %0 " #val : : "i" (val/sizeof(unsigned long)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) void foo(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #ifdef __i386__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) DEFINE_LONGS(HOST_FP_SIZE, sizeof(struct user_fpregs_struct));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) DEFINE_LONGS(HOST_FPX_SIZE, sizeof(struct user_fpxregs_struct));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) DEFINE(HOST_IP, EIP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) DEFINE(HOST_SP, UESP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) DEFINE(HOST_EFLAGS, EFL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) DEFINE(HOST_AX, EAX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) DEFINE(HOST_BX, EBX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) DEFINE(HOST_CX, ECX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) DEFINE(HOST_DX, EDX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) DEFINE(HOST_SI, ESI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) DEFINE(HOST_DI, EDI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) DEFINE(HOST_BP, EBP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) DEFINE(HOST_CS, CS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) DEFINE(HOST_SS, SS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) DEFINE(HOST_DS, DS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) DEFINE(HOST_FS, FS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) DEFINE(HOST_ES, ES);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) DEFINE(HOST_GS, GS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) DEFINE(HOST_ORIG_AX, ORIG_EAX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #ifdef FP_XSTATE_MAGIC1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) DEFINE_LONGS(HOST_FP_SIZE, 2696);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) DEFINE(HOST_FP_SIZE, sizeof(struct _fpstate) / sizeof(unsigned long));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) DEFINE_LONGS(HOST_BX, RBX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) DEFINE_LONGS(HOST_CX, RCX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) DEFINE_LONGS(HOST_DI, RDI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) DEFINE_LONGS(HOST_SI, RSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) DEFINE_LONGS(HOST_DX, RDX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) DEFINE_LONGS(HOST_BP, RBP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) DEFINE_LONGS(HOST_AX, RAX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) DEFINE_LONGS(HOST_R8, R8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) DEFINE_LONGS(HOST_R9, R9);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) DEFINE_LONGS(HOST_R10, R10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) DEFINE_LONGS(HOST_R11, R11);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) DEFINE_LONGS(HOST_R12, R12);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) DEFINE_LONGS(HOST_R13, R13);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) DEFINE_LONGS(HOST_R14, R14);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) DEFINE_LONGS(HOST_R15, R15);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) DEFINE_LONGS(HOST_ORIG_AX, ORIG_RAX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) DEFINE_LONGS(HOST_CS, CS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) DEFINE_LONGS(HOST_SS, SS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) DEFINE_LONGS(HOST_EFLAGS, EFLAGS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) #if 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) DEFINE_LONGS(HOST_FS, FS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) DEFINE_LONGS(HOST_GS, GS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) DEFINE_LONGS(HOST_DS, DS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) DEFINE_LONGS(HOST_ES, ES);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) DEFINE_LONGS(HOST_IP, RIP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) DEFINE_LONGS(HOST_SP, RSP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) DEFINE(UM_FRAME_SIZE, sizeof(struct user_regs_struct));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) DEFINE(UM_POLLIN, POLLIN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) DEFINE(UM_POLLPRI, POLLPRI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) DEFINE(UM_POLLOUT, POLLOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) DEFINE(UM_PROT_READ, PROT_READ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) DEFINE(UM_PROT_WRITE, PROT_WRITE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) DEFINE(UM_PROT_EXEC, PROT_EXEC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) }