File riscv.patch of Package python-python-ptrace
diff --git a/ptrace/binding/cpu.py b/ptrace/binding/cpu.py
index d4d8053..91c985c 100644
--- a/ptrace/binding/cpu.py
+++ b/ptrace/binding/cpu.py
@@ -1,5 +1,5 @@
from ptrace.cpu_info import (
- CPU_POWERPC, CPU_INTEL, CPU_X86_64, CPU_I386, CPU_ARM32, CPU_AARCH64)
+ CPU_POWERPC, CPU_INTEL, CPU_X86_64, CPU_I386, CPU_ARM32, CPU_AARCH64, CPU_RISCV)
CPU_INSTR_POINTER = None
CPU_STACK_POINTER = None
@@ -18,6 +18,10 @@ elif CPU_AARCH64:
CPU_INSTR_POINTER = 'pc'
CPU_STACK_POINTER = 'sp'
CPU_FRAME_POINTER = 'r29'
+elif CPU_RISCV:
+ CPU_INSTR_POINTER = 'pc'
+ CPU_STACK_POINTER = 'sp'
+ CPU_FRAME_POINTER = 's0'
elif CPU_X86_64:
CPU_INSTR_POINTER = "rip"
CPU_STACK_POINTER = "rsp"
diff --git a/ptrace/binding/func.py b/ptrace/binding/func.py
index bc4bf4d..04391ba 100644
--- a/ptrace/binding/func.py
+++ b/ptrace/binding/func.py
@@ -3,7 +3,7 @@ from ctypes import addressof, c_int, get_errno, set_errno, sizeof
from ptrace import PtraceError
from ptrace.ctypes_tools import formatAddress
from ptrace.os_tools import RUNNING_LINUX, RUNNING_BSD, RUNNING_OPENBSD
-from ptrace.cpu_info import CPU_64BITS, CPU_WORD_SIZE, CPU_POWERPC, CPU_AARCH64
+from ptrace.cpu_info import CPU_64BITS, CPU_WORD_SIZE, CPU_POWERPC, CPU_AARCH64, CPU_RISCV
if RUNNING_OPENBSD:
from ptrace.binding.openbsd_struct import (
@@ -82,7 +82,7 @@ elif RUNNING_BSD:
PTRACE_IO = 12
else:
# Linux
- if not CPU_AARCH64:
+ if not (CPU_AARCH64 or CPU_RISCV):
HAS_PTRACE_GETREGS = True
HAS_PTRACE_SETREGS = True
PTRACE_GETREGS = 12
diff --git a/ptrace/binding/linux_struct.py b/ptrace/binding/linux_struct.py
index 1bcc20c..4f6accc 100644
--- a/ptrace/binding/linux_struct.py
+++ b/ptrace/binding/linux_struct.py
@@ -1,7 +1,7 @@
from ctypes import (Structure, Union, sizeof,
c_char, c_ushort, c_int, c_uint, c_ulong, c_void_p,
c_uint16, c_uint32, c_uint64, c_size_t)
-from ptrace.cpu_info import CPU_64BITS, CPU_PPC32, CPU_PPC64, CPU_ARM32, CPU_AARCH64
+from ptrace.cpu_info import CPU_64BITS, CPU_PPC32, CPU_PPC64, CPU_ARM32, CPU_AARCH64, CPU_RISCV
pid_t = c_int
uid_t = c_ushort
@@ -123,6 +123,41 @@ class user_regs_struct(register_structure):
('pc', c_ulong),
('pstate', c_ulong)]
)
+ elif CPU_RISCV:
+ _fields_ = (
+ ("pc", c_ulong),
+ ("ra", c_ulong),
+ ("sp", c_ulong),
+ ("gp", c_ulong),
+ ("tp", c_ulong),
+ ("t0", c_ulong),
+ ("t1", c_ulong),
+ ("t2", c_ulong),
+ ("s0", c_ulong),
+ ("s1", c_ulong),
+ ("a0", c_ulong),
+ ("a1", c_ulong),
+ ("a2", c_ulong),
+ ("a3", c_ulong),
+ ("a4", c_ulong),
+ ("a5", c_ulong),
+ ("a6", c_ulong),
+ ("a7", c_ulong),
+ ("s2", c_ulong),
+ ("s3", c_ulong),
+ ("s4", c_ulong),
+ ("s5", c_ulong),
+ ("s6", c_ulong),
+ ("s7", c_ulong),
+ ("s8", c_ulong),
+ ("s9", c_ulong),
+ ("s10", c_ulong),
+ ("s11", c_ulong),
+ ("t3", c_ulong),
+ ("t4", c_ulong),
+ ("t5", c_ulong),
+ ("t6", c_ulong),
+ )
elif CPU_64BITS:
_fields_ = (
("r15", c_ulong),
diff --git a/ptrace/cpu_info.py b/ptrace/cpu_info.py
index e8cd7b2..85e2e95 100644
--- a/ptrace/cpu_info.py
+++ b/ptrace/cpu_info.py
@@ -41,6 +41,8 @@ if HAS_UNAME:
CPU_X86_64 = (_machine in ("x86_64", "amd64")) # compatible Intel 64 bits
CPU_ARM32 = _machine.startswith('arm')
CPU_AARCH64 = (_machine == 'aarch64')
+ CPU_RISCV32 = (_machine == 'riscv32')
+ CPU_RISCV64 = (_machine == 'riscv64')
del _machine
else:
# uname() fallback for Windows
@@ -51,6 +53,8 @@ else:
CPU_X86_64 = False
CPU_ARM32 = False
CPU_AARCH64 = False
+ CPU_RISCV32 = False
+ CPU_RISCV64 = False
bits, linkage = architecture()
if bits == '32bit':
CPU_I386 = True
@@ -62,3 +66,4 @@ else:
CPU_INTEL = (CPU_I386 or CPU_X86_64)
CPU_POWERPC = (CPU_PPC32 or CPU_PPC64)
CPU_ARM = (CPU_ARM32 or CPU_AARCH64)
+CPU_RISCV = (CPU_RISCV32 or CPU_RISCV64)
diff --git a/ptrace/syscall/linux/riscv32.py b/ptrace/syscall/linux/riscv32.py
new file mode 100644
index 0000000..dd7927c
--- /dev/null
+++ b/ptrace/syscall/linux/riscv32.py
@@ -0,0 +1,316 @@
+SYSCALL_NAMES = {
+ 0: "io_setup",
+ 1: "io_destroy",
+ 2: "io_submit",
+ 3: "io_cancel",
+ 5: "setxattr",
+ 6: "lsetxattr",
+ 7: "fsetxattr",
+ 8: "getxattr",
+ 9: "lgetxattr",
+ 10: "fgetxattr",
+ 11: "listxattr",
+ 12: "llistxattr",
+ 13: "flistxattr",
+ 14: "removexattr",
+ 15: "lremovexattr",
+ 16: "fremovexattr",
+ 17: "getcwd",
+ 18: "lookup_dcookie",
+ 19: "eventfd2",
+ 20: "epoll_create1",
+ 21: "epoll_ctl",
+ 22: "epoll_pwait",
+ 23: "dup",
+ 24: "dup3",
+ 25: "fcntl64",
+ 26: "inotify_init1",
+ 27: "inotify_add_watch",
+ 28: "inotify_rm_watch",
+ 29: "ioctl",
+ 30: "ioprio_set",
+ 31: "ioprio_get",
+ 32: "flock",
+ 33: "mknodat",
+ 34: "mkdirat",
+ 35: "unlinkat",
+ 36: "symlinkat",
+ 37: "linkat",
+ 39: "umount2",
+ 40: "mount",
+ 41: "pivot_root",
+ 42: "nfsservctl",
+ 43: "statfs64",
+ 44: "fstatfs64",
+ 45: "truncate64",
+ 46: "ftruncate64",
+ 47: "fallocate",
+ 48: "faccessat",
+ 49: "chdir",
+ 50: "fchdir",
+ 51: "chroot",
+ 52: "fchmod",
+ 53: "fchmodat",
+ 54: "fchownat",
+ 55: "fchown",
+ 56: "openat",
+ 57: "close",
+ 58: "vhangup",
+ 59: "pipe2",
+ 60: "quotactl",
+ 61: "getdents64",
+ 62: "llseek",
+ 63: "read",
+ 64: "write",
+ 65: "readv",
+ 66: "writev",
+ 67: "pread64",
+ 68: "pwrite64",
+ 69: "preadv",
+ 70: "pwritev",
+ 71: "sendfile64",
+ 74: "signalfd4",
+ 75: "vmsplice",
+ 76: "splice",
+ 77: "tee",
+ 78: "readlinkat",
+ 81: "sync",
+ 82: "fsync",
+ 83: "fdatasync",
+ 84: "sync_file_range",
+ 85: "timerfd_create",
+ 89: "acct",
+ 90: "capget",
+ 91: "capset",
+ 92: "personality",
+ 93: "exit",
+ 94: "exit_group",
+ 95: "waitid",
+ 96: "set_tid_address",
+ 97: "unshare",
+ 99: "set_robust_list",
+ 100: "get_robust_list",
+ 102: "getitimer",
+ 103: "setitimer",
+ 104: "kexec_load",
+ 105: "init_module",
+ 106: "delete_module",
+ 107: "timer_create",
+ 109: "timer_getoverrun",
+ 111: "timer_delete",
+ 116: "syslog",
+ 117: "ptrace",
+ 118: "sched_setparam",
+ 119: "sched_setscheduler",
+ 120: "sched_getscheduler",
+ 121: "sched_getparam",
+ 122: "sched_setaffinity",
+ 123: "sched_getaffinity",
+ 124: "sched_yield",
+ 125: "sched_get_priority_max",
+ 126: "sched_get_priority_min",
+ 128: "restart_syscall",
+ 129: "kill",
+ 130: "tkill",
+ 131: "tgkill",
+ 132: "sigaltstack",
+ 133: "rt_sigsuspend",
+ 134: "rt_sigaction",
+ 135: "rt_sigprocmask",
+ 136: "rt_sigpending",
+ 138: "rt_sigqueueinfo",
+ 139: "rt_sigreturn",
+ 140: "setpriority",
+ 141: "getpriority",
+ 142: "reboot",
+ 143: "setregid",
+ 144: "setgid",
+ 145: "setreuid",
+ 146: "setuid",
+ 147: "setresuid",
+ 148: "getresuid",
+ 149: "setresgid",
+ 150: "getresgid",
+ 151: "setfsuid",
+ 152: "setfsgid",
+ 153: "times",
+ 154: "setpgid",
+ 155: "getpgid",
+ 156: "getsid",
+ 157: "setsid",
+ 158: "getgroups",
+ 159: "setgroups",
+ 160: "uname",
+ 161: "sethostname",
+ 162: "setdomainname",
+ 165: "getrusage",
+ 166: "umask",
+ 167: "prctl",
+ 168: "getcpu",
+ 172: "getpid",
+ 173: "getppid",
+ 174: "getuid",
+ 175: "geteuid",
+ 176: "getgid",
+ 177: "getegid",
+ 178: "gettid",
+ 179: "sysinfo",
+ 180: "mq_open",
+ 181: "mq_unlink",
+ 184: "mq_notify",
+ 185: "mq_getsetattr",
+ 186: "msgget",
+ 187: "msgctl",
+ 188: "msgrcv",
+ 189: "msgsnd",
+ 190: "semget",
+ 191: "semctl",
+ 193: "semop",
+ 194: "shmget",
+ 195: "shmctl",
+ 196: "shmat",
+ 197: "shmdt",
+ 198: "socket",
+ 199: "socketpair",
+ 200: "bind",
+ 201: "listen",
+ 202: "accept",
+ 203: "connect",
+ 204: "getsockname",
+ 205: "getpeername",
+ 206: "sendto",
+ 207: "recvfrom",
+ 208: "setsockopt",
+ 209: "getsockopt",
+ 210: "shutdown",
+ 211: "sendmsg",
+ 212: "recvmsg",
+ 213: "readahead",
+ 214: "brk",
+ 215: "munmap",
+ 216: "mremap",
+ 217: "add_key",
+ 218: "request_key",
+ 219: "keyctl",
+ 220: "clone",
+ 221: "execve",
+ 222: "mmap2",
+ 223: "fadvise64_64",
+ 224: "swapon",
+ 225: "swapoff",
+ 226: "mprotect",
+ 227: "msync",
+ 228: "mlock",
+ 229: "munlock",
+ 230: "mlockall",
+ 231: "munlockall",
+ 232: "mincore",
+ 233: "madvise",
+ 234: "remap_file_pages",
+ 235: "mbind",
+ 236: "get_mempolicy",
+ 237: "set_mempolicy",
+ 238: "migrate_pages",
+ 239: "move_pages",
+ 240: "rt_tgsigqueueinfo",
+ 241: "perf_event_open",
+ 242: "accept4",
+ 259: "riscv_flush_icache",
+ 261: "prlimit64",
+ 262: "fanotify_init",
+ 263: "fanotify_mark",
+ 264: "name_to_handle_at",
+ 265: "open_by_handle_at",
+ 267: "syncfs",
+ 268: "setns",
+ 269: "sendmmsg",
+ 270: "process_vm_readv",
+ 271: "process_vm_writev",
+ 272: "kcmp",
+ 273: "finit_module",
+ 274: "sched_setattr",
+ 275: "sched_getattr",
+ 276: "renameat2",
+ 277: "seccomp",
+ 278: "getrandom",
+ 279: "memfd_create",
+ 280: "bpf",
+ 281: "execveat",
+ 282: "userfaultfd",
+ 283: "membarrier",
+ 284: "mlock2",
+ 285: "copy_file_range",
+ 286: "preadv2",
+ 287: "pwritev2",
+ 288: "pkey_mprotect",
+ 289: "pkey_alloc",
+ 290: "pkey_free",
+ 291: "statx",
+ 293: "rseq",
+ 294: "kexec_file_load",
+ 403: "clock_gettime64",
+ 404: "clock_settime64",
+ 405: "clock_adjtime64",
+ 406: "clock_getres_time64",
+ 407: "clock_nanosleep_time64",
+ 408: "timer_gettime64",
+ 409: "timer_settime64",
+ 410: "timerfd_gettime64",
+ 411: "timerfd_settime64",
+ 412: "utimensat_time64",
+ 413: "pselect6_time64",
+ 414: "ppoll_time64",
+ 416: "io_pgetevents_time64",
+ 417: "recvmmsg_time64",
+ 418: "mq_timedsend_time64",
+ 419: "mq_timedreceive_time64",
+ 420: "semtimedop_time64",
+ 421: "rt_sigtimedwait_time64",
+ 422: "futex_time64",
+ 423: "sched_rr_get_interval_time64",
+ 424: "pidfd_send_signal",
+ 425: "io_uring_setup",
+ 426: "io_uring_enter",
+ 427: "io_uring_register",
+ 428: "open_tree",
+ 429: "move_mount",
+ 430: "fsopen",
+ 431: "fsconfig",
+ 432: "fsmount",
+ 433: "fspick",
+ 434: "pidfd_open",
+ 435: "clone3",
+ 436: "close_range",
+ 437: "openat2",
+ 438: "pidfd_getfd",
+ 439: "faccessat2",
+ 440: "process_madvise",
+ 441: "epoll_pwait2",
+ 442: "mount_setattr",
+ 443: "quotactl_fd",
+ 444: "landlock_create_ruleset",
+ 445: "landlock_add_rule",
+ 446: "landlock_restrict_self",
+ 447: "memfd_secret",
+ 448: "process_mrelease",
+ 449: "futex_waitv",
+ 450: "set_mempolicy_home_node",
+}
+
+SOCKET_SYSCALL_NAMES = set((
+ "socket",
+ "socketpair",
+ "connect",
+ "sendto",
+ "recvfrom",
+ "sendmsg",
+ "recvmsg",
+ "bind",
+ "listen",
+ "accept",
+ "getsockname",
+ "getpeername",
+ "getsockopt",
+ "setsockopt",
+ "shutdown",
+))
diff --git a/ptrace/syscall/linux/riscv64.py b/ptrace/syscall/linux/riscv64.py
new file mode 100644
index 0000000..40f4f1f
--- /dev/null
+++ b/ptrace/syscall/linux/riscv64.py
@@ -0,0 +1,327 @@
+SYSCALL_NAMES = {
+ 0: "io_setup",
+ 1: "io_destroy",
+ 2: "io_submit",
+ 3: "io_cancel",
+ 4: "io_getevents",
+ 5: "setxattr",
+ 6: "lsetxattr",
+ 7: "fsetxattr",
+ 8: "getxattr",
+ 9: "lgetxattr",
+ 10: "fgetxattr",
+ 11: "listxattr",
+ 12: "llistxattr",
+ 13: "flistxattr",
+ 14: "removexattr",
+ 15: "lremovexattr",
+ 16: "fremovexattr",
+ 17: "getcwd",
+ 18: "lookup_dcookie",
+ 19: "eventfd2",
+ 20: "epoll_create1",
+ 21: "epoll_ctl",
+ 22: "epoll_pwait",
+ 23: "dup",
+ 24: "dup3",
+ 25: "fcntl",
+ 26: "inotify_init1",
+ 27: "inotify_add_watch",
+ 28: "inotify_rm_watch",
+ 29: "ioctl",
+ 30: "ioprio_set",
+ 31: "ioprio_get",
+ 32: "flock",
+ 33: "mknodat",
+ 34: "mkdirat",
+ 35: "unlinkat",
+ 36: "symlinkat",
+ 37: "linkat",
+ 38: "renameat",
+ 39: "umount2",
+ 40: "mount",
+ 41: "pivot_root",
+ 42: "nfsservctl",
+ 43: "statfs",
+ 44: "fstatfs",
+ 45: "truncate",
+ 46: "ftruncate",
+ 47: "fallocate",
+ 48: "faccessat",
+ 49: "chdir",
+ 50: "fchdir",
+ 51: "chroot",
+ 52: "fchmod",
+ 53: "fchmodat",
+ 54: "fchownat",
+ 55: "fchown",
+ 56: "openat",
+ 57: "close",
+ 58: "vhangup",
+ 59: "pipe2",
+ 60: "quotactl",
+ 61: "getdents64",
+ 62: "lseek",
+ 63: "read",
+ 64: "write",
+ 65: "readv",
+ 66: "writev",
+ 67: "pread64",
+ 68: "pwrite64",
+ 69: "preadv",
+ 70: "pwritev",
+ 71: "sendfile",
+ 72: "pselect6",
+ 73: "ppoll",
+ 74: "signalfd4",
+ 75: "vmsplice",
+ 76: "splice",
+ 77: "tee",
+ 78: "readlinkat",
+ 79: "newfstatat",
+ 80: "fstat",
+ 81: "sync",
+ 82: "fsync",
+ 83: "fdatasync",
+ 84: "sync_file_range",
+ 85: "timerfd_create",
+ 86: "timerfd_settime",
+ 87: "timerfd_gettime",
+ 88: "utimensat",
+ 89: "acct",
+ 90: "capget",
+ 91: "capset",
+ 92: "personality",
+ 93: "exit",
+ 94: "exit_group",
+ 95: "waitid",
+ 96: "set_tid_address",
+ 97: "unshare",
+ 98: "futex",
+ 99: "set_robust_list",
+ 100: "get_robust_list",
+ 101: "nanosleep",
+ 102: "getitimer",
+ 103: "setitimer",
+ 104: "kexec_load",
+ 105: "init_module",
+ 106: "delete_module",
+ 107: "timer_create",
+ 108: "timer_gettime",
+ 109: "timer_getoverrun",
+ 110: "timer_settime",
+ 111: "timer_delete",
+ 112: "clock_settime",
+ 113: "clock_gettime",
+ 114: "clock_getres",
+ 115: "clock_nanosleep",
+ 116: "syslog",
+ 117: "ptrace",
+ 118: "sched_setparam",
+ 119: "sched_setscheduler",
+ 120: "sched_getscheduler",
+ 121: "sched_getparam",
+ 122: "sched_setaffinity",
+ 123: "sched_getaffinity",
+ 124: "sched_yield",
+ 125: "sched_get_priority_max",
+ 126: "sched_get_priority_min",
+ 127: "sched_rr_get_interval",
+ 128: "restart_syscall",
+ 129: "kill",
+ 130: "tkill",
+ 131: "tgkill",
+ 132: "sigaltstack",
+ 133: "rt_sigsuspend",
+ 134: "rt_sigaction",
+ 135: "rt_sigprocmask",
+ 136: "rt_sigpending",
+ 137: "rt_sigtimedwait",
+ 138: "rt_sigqueueinfo",
+ 139: "rt_sigreturn",
+ 140: "setpriority",
+ 141: "getpriority",
+ 142: "reboot",
+ 143: "setregid",
+ 144: "setgid",
+ 145: "setreuid",
+ 146: "setuid",
+ 147: "setresuid",
+ 148: "getresuid",
+ 149: "setresgid",
+ 150: "getresgid",
+ 151: "setfsuid",
+ 152: "setfsgid",
+ 153: "times",
+ 154: "setpgid",
+ 155: "getpgid",
+ 156: "getsid",
+ 157: "setsid",
+ 158: "getgroups",
+ 159: "setgroups",
+ 160: "uname",
+ 161: "sethostname",
+ 162: "setdomainname",
+ 163: "getrlimit",
+ 164: "setrlimit",
+ 165: "getrusage",
+ 166: "umask",
+ 167: "prctl",
+ 168: "getcpu",
+ 169: "gettimeofday",
+ 170: "settimeofday",
+ 171: "adjtimex",
+ 172: "getpid",
+ 173: "getppid",
+ 174: "getuid",
+ 175: "geteuid",
+ 176: "getgid",
+ 177: "getegid",
+ 178: "gettid",
+ 179: "sysinfo",
+ 180: "mq_open",
+ 181: "mq_unlink",
+ 182: "mq_timedsend",
+ 183: "mq_timedreceive",
+ 184: "mq_notify",
+ 185: "mq_getsetattr",
+ 186: "msgget",
+ 187: "msgctl",
+ 188: "msgrcv",
+ 189: "msgsnd",
+ 190: "semget",
+ 191: "semctl",
+ 192: "semtimedop",
+ 193: "semop",
+ 194: "shmget",
+ 195: "shmctl",
+ 196: "shmat",
+ 197: "shmdt",
+ 198: "socket",
+ 199: "socketpair",
+ 200: "bind",
+ 201: "listen",
+ 202: "accept",
+ 203: "connect",
+ 204: "getsockname",
+ 205: "getpeername",
+ 206: "sendto",
+ 207: "recvfrom",
+ 208: "setsockopt",
+ 209: "getsockopt",
+ 210: "shutdown",
+ 211: "sendmsg",
+ 212: "recvmsg",
+ 213: "readahead",
+ 214: "brk",
+ 215: "munmap",
+ 216: "mremap",
+ 217: "add_key",
+ 218: "request_key",
+ 219: "keyctl",
+ 220: "clone",
+ 221: "execve",
+ 222: "mmap",
+ 223: "fadvise64",
+ 224: "swapon",
+ 225: "swapoff",
+ 226: "mprotect",
+ 227: "msync",
+ 228: "mlock",
+ 229: "munlock",
+ 230: "mlockall",
+ 231: "munlockall",
+ 232: "mincore",
+ 233: "madvise",
+ 234: "remap_file_pages",
+ 235: "mbind",
+ 236: "get_mempolicy",
+ 237: "set_mempolicy",
+ 238: "migrate_pages",
+ 239: "move_pages",
+ 240: "rt_tgsigqueueinfo",
+ 241: "perf_event_open",
+ 242: "accept4",
+ 259: "riscv_flush_icache",
+ 243: "recvmmsg",
+ 260: "wait4",
+ 261: "prlimit64",
+ 262: "fanotify_init",
+ 263: "fanotify_mark",
+ 264: "name_to_handle_at",
+ 265: "open_by_handle_at",
+ 266: "clock_adjtime",
+ 267: "syncfs",
+ 268: "setns",
+ 269: "sendmmsg",
+ 270: "process_vm_readv",
+ 271: "process_vm_writev",
+ 272: "kcmp",
+ 273: "finit_module",
+ 274: "sched_setattr",
+ 275: "sched_getattr",
+ 276: "renameat2",
+ 277: "seccomp",
+ 278: "getrandom",
+ 279: "memfd_create",
+ 280: "bpf",
+ 281: "execveat",
+ 282: "userfaultfd",
+ 283: "membarrier",
+ 284: "mlock2",
+ 285: "copy_file_range",
+ 286: "preadv2",
+ 287: "pwritev2",
+ 288: "pkey_mprotect",
+ 289: "pkey_alloc",
+ 290: "pkey_free",
+ 291: "statx",
+ 292: "io_pgetevents",
+ 293: "rseq",
+ 294: "kexec_file_load",
+ 424: "pidfd_send_signal",
+ 425: "io_uring_setup",
+ 426: "io_uring_enter",
+ 427: "io_uring_register",
+ 428: "open_tree",
+ 429: "move_mount",
+ 430: "fsopen",
+ 431: "fsconfig",
+ 432: "fsmount",
+ 433: "fspick",
+ 434: "pidfd_open",
+ 435: "clone3",
+ 436: "close_range",
+ 437: "openat2",
+ 438: "pidfd_getfd",
+ 439: "faccessat2",
+ 440: "process_madvise",
+ 441: "epoll_pwait2",
+ 442: "mount_setattr",
+ 443: "quotactl_fd",
+ 444: "landlock_create_ruleset",
+ 445: "landlock_add_rule",
+ 446: "landlock_restrict_self",
+ 447: "memfd_secret",
+ 448: "process_mrelease",
+ 449: "futex_waitv",
+ 450: "set_mempolicy_home_node",
+}
+
+SOCKET_SYSCALL_NAMES = set((
+ "socket",
+ "socketpair",
+ "connect",
+ "sendto",
+ "recvfrom",
+ "sendmsg",
+ "recvmsg",
+ "bind",
+ "listen",
+ "accept",
+ "getsockname",
+ "getpeername",
+ "getsockopt",
+ "setsockopt",
+ "shutdown",
+))
diff --git a/ptrace/syscall/names.py b/ptrace/syscall/names.py
index fb4e6c6..b970989 100644
--- a/ptrace/syscall/names.py
+++ b/ptrace/syscall/names.py
@@ -1,4 +1,4 @@
-from ptrace.cpu_info import CPU_X86_64, CPU_I386, CPU_PPC64, CPU_PPC32, CPU_AARCH64
+from ptrace.cpu_info import CPU_X86_64, CPU_I386, CPU_PPC64, CPU_PPC32, CPU_AARCH64, CPU_RISCV32, CPU_RISCV64
from ptrace.os_tools import RUNNING_LINUX, RUNNING_FREEBSD
if RUNNING_LINUX:
if CPU_X86_64:
@@ -11,6 +11,10 @@ if RUNNING_LINUX:
from ptrace.syscall.linux.powerpc32 import SYSCALL_NAMES, SOCKET_SYSCALL_NAMES
elif CPU_AARCH64:
from ptrace.syscall.linux.aarch64 import SYSCALL_NAMES, SOCKET_SYSCALL_NAMES
+ elif CPU_RISCV32:
+ from ptrace.syscall.linux.riscv32 import SYSCALL_NAMES, SOCKET_SYSCALL_NAMES
+ elif CPU_RISCV64:
+ from ptrace.syscall.linux.riscv64 import SYSCALL_NAMES, SOCKET_SYSCALL_NAMES
else:
raise NotImplementedError("Unsupported CPU architecture")
diff --git a/ptrace/syscall/ptrace_syscall.py b/ptrace/syscall/ptrace_syscall.py
index 14d9408..2dfd7dc 100644
--- a/ptrace/syscall/ptrace_syscall.py
+++ b/ptrace/syscall/ptrace_syscall.py
@@ -1,7 +1,7 @@
from os import strerror
from errno import errorcode
-from ptrace.cpu_info import CPU_X86_64, CPU_POWERPC, CPU_I386, CPU_ARM32, CPU_AARCH64
+from ptrace.cpu_info import CPU_X86_64, CPU_POWERPC, CPU_I386, CPU_ARM32, CPU_AARCH64, CPU_RISCV
from ptrace.ctypes_tools import ulong2long, formatAddress, formatWordHex
from ptrace.func_call import FunctionCall
from ptrace.syscall import SYSCALL_NAMES, SYSCALL_PROTOTYPES, SyscallArgument
@@ -16,6 +16,8 @@ elif CPU_ARM32:
SYSCALL_REGISTER = "r7"
elif CPU_AARCH64:
SYSCALL_REGISTER = "r8"
+elif CPU_RISCV:
+ SYSCALL_REGISTER = "a7"
elif RUNNING_LINUX:
if CPU_X86_64:
SYSCALL_REGISTER = "orig_rax"
@@ -37,6 +39,8 @@ elif CPU_X86_64:
RETURN_VALUE_REGISTER = "rax"
elif CPU_POWERPC:
RETURN_VALUE_REGISTER = "result"
+elif CPU_RISCV:
+ RETURN_VALUE_REGISTER = "a0"
else:
raise NotImplementedError("Unsupported CPU architecture")
@@ -92,6 +96,8 @@ class PtraceSyscall(FunctionCall):
return (regs.r0, regs.r1, regs.r2, regs.r3, regs.r4, regs.r5, regs.r6)
if CPU_AARCH64:
return (regs.r0, regs.r1, regs.r2, regs.r3, regs.r4, regs.r5, regs.r6, regs.r7)
+ if CPU_RISCV:
+ return (regs.a0, regs.a1, regs.a2, regs.a3, regs.a4, regs.a5, regs.a6)
if RUNNING_BSD:
sp = self.process.getStackPointer()
return [self.process.readWord(sp + index * CPU_WORD_SIZE)
diff --git a/tests/test_strace.py b/tests/test_strace.py
index 39ff14c..2020a3b 100755
--- a/tests/test_strace.py
+++ b/tests/test_strace.py
@@ -11,6 +11,7 @@ STRACE = os.path.normpath(
os.path.join(os.path.dirname(__file__), '..', 'strace.py'))
AARCH64 = (getattr(os.uname(), 'machine', None) == 'aarch64')
+RISCV = (getattr(os.uname(), 'machine', None).startswith('riscv'))
class TestStrace(unittest.TestCase):
@@ -78,19 +79,21 @@ class TestStrace(unittest.TestCase):
pattern = br"^rename\('oldpath', 'newpath'\)"
if AARCH64:
pattern = br"^renameat\(.*'oldpath'.*'newpath'\)"
+ if RISCV:
+ pattern = br"^renameat2\(.*'oldpath'.*'newpath', 0\)"
self.assert_syscall("import os; os.rename('oldpath', 'newpath')",
pattern)
def test_link(self):
pattern = br"^link\('oldpath', 'newpath'\)"
- if AARCH64:
+ if AARCH64 or RISCV:
pattern = br"^linkat\(.*'oldpath'.*'newpath'.*\)"
self.assert_syscall("import os; os.link('oldpath', 'newpath')",
pattern)
def test_symlink(self):
pattern = br"^symlink\('target', 'linkpath'\)"
- if AARCH64:
+ if AARCH64 or RISCV:
pattern = br"^symlinkat\(.*'target'.*'linkpath'\)"
try:
self.assert_syscall("import os; os.symlink('target', 'linkpath')",