Sys.lean
Declarations on this page (8)
Thread Identity and Affinity Syscalls
Linux AArch64 syscall numbers and transition functions for set_tid_address (96), sched_getaffinity (123), getpid (172), and gettid (178), modeled after Linux kernel/, kernel/, and kernel/ in a single-process, single-thread, single-CPU environment.
@[expose] public sectionnamespace Arm64def SYS_SET_TID_ADDRESS
Linux AArch64 set_tid_address syscall number (__NR_set_tid_address = 96, include/, kernel/).
def SYS_SET_TID_ADDRESS : BitVec 64 := 96#64def SYS_SCHED_GETAFFINITY
Linux AArch64 sched_getaffinity syscall number (__NR_sched_getaffinity = 123, include/, kernel/).
def SYS_SCHED_GETAFFINITY : BitVec 64 := 123#64def SYS_GETPID
Linux AArch64 getpid syscall number (__NR_getpid = 172, include/, kernel/).
def SYS_GETPID : BitVec 64 := 172#64def SYS_GETTID
Linux AArch64 gettid syscall number (__NR_gettid = 178, include/, kernel/).
def SYS_GETTID : BitVec 64 := 178#64def SCHED_AFFINITY_MASK
8-byte kernel cpumask_t (CPU 0 online) written by sched_getaffinity.
def SCHED_AFFINITY_MASK : List (BitVec 8) :=
[1#8, 0#8, 0#8, 0#8, 0#8, 0#8, 0#8, 0#8]def execSetTidAddress
set_tid_address(tidptr) (__NR_set_tid_address = 96, kernel/): per Linux kernel/, records clear_child_tid ([INTENTIONAL_SCOPE]: no-op in single-threaded execution without CLONE_CHILD_CLEARTID) without dereferencing tidptr, and always succeeds returning the caller's thread ID (SIM_TID = 1).
def execGetpid
getpid() (__NR_getpid = 172, kernel/) and gettid() (__NR_gettid = 178, kernel/): return the calling process/thread ID (SIM_TID = 1) in the single-process, single-thread model ([INTENTIONAL_SCOPE]).
def execSchedGetaffinity
sched_getaffinity(pid, cpusetsize, mask) (__NR_sched_getaffinity = 123, kernel/ SYSCALL_DEFINE3(sched_getaffinity, pid_t, pid, unsigned int, len, unsigned long __user *, user_mask_ptr) -> sched_getaffinity -> find_process_by_pid at kernel/): models Linux kernel/ on a single-CPU AArch64 system (cpumask_size() = 8, sizeof(unsigned long) = 8, CPU 0 online):
-
if 32-bit
unsigned intcpusetsize < 8orcpusetsize % 8 != 0, returns-EINVAL; -
if
(pid : Int32) < 0(pid.), returnsslt 0#32 -ESRCH(find_process_by_pid(pid)returnsNULLinkernel/);sched/ syscalls.c:1284-1286 -
[INTENTIONAL_SCOPE]: ifpid != 0(calling thread) andpid != 1(SIM_TID), fails closed with .Exception"unmodeled sched_getaffinity pid"; -
if
!s., returnsmem. canWrite mask 8 EFAULT_RET(-EFAULT); -
otherwise writes the 8-byte single-CPU mask (
SCHED_AFFINITY_MASK) tomaskand returns8(cpumask_size()).
def execSchedGetaffinity (s : State) : State :=
let pid := s.readReg32 Reg.x0
let cpusetsize := (s.readReg32 Reg.x1).toNat
let mask := s.readReg64 Reg.x2
if cpusetsize < 8 || cpusetsize % 8 != 0 then
(s.writeReg64 Reg.x0 (-EINVAL)).advancePC
else if pid.slt 0#32 then
(s.writeReg64 Reg.x0 (-ESRCH)).advancePC
else if pid != 0#32 && pid != 1#32 then
s.setStatus (.Exception "unmodeled sched_getaffinity pid")
else if !s.mem.canWrite mask 8 then
(s.writeReg64 Reg.x0 EFAULT_RET).advancePC
else
((s.setMem (s.mem.writeBytes mask SCHED_AFFINITY_MASK)).writeReg64 Reg.x0 8#64).advancePCend Arm64