Skip to content

Commit 33bee2d

Browse files
committed
Merge branch 'dev' of github.com:qilingframework/qiling into dev
2 parents c3d8e32 + b3bacd0 commit 33bee2d

File tree

4 files changed

+56
-2
lines changed

4 files changed

+56
-2
lines changed

qiling/os/linux/syscall.py

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,17 @@ class timespec(ctypes.Structure):
1919

2020
_pack_ = 8
2121

22+
23+
# Temporary dirty fix.
24+
# TODO: Pack ctypes.Structure according to ql.archtype and ql.ostype?
25+
class timespec32(ctypes.Structure):
26+
_fields_ = [
27+
("tv_sec", ctypes.c_uint32),
28+
("tv_nsec", ctypes.c_int32)
29+
]
30+
31+
_pack_ = 4
32+
2233
def ql_syscall_set_thread_area(ql: Qiling, u_info_addr, *args, **kw):
2334
if ql.archtype == QL_ARCH.X86:
2435
GDT_ENTRY_TLS_MIN = 12
@@ -64,7 +75,10 @@ def ql_syscall_clock_gettime(ql, clock_gettime_clock_id, clock_gettime_timespec,
6475
now = datetime.now().timestamp()
6576
tv_sec = floor(now)
6677
tv_nsec = floor((now - floor(now)) * 1e6)
67-
tp = timespec(tv_sec= tv_sec, tv_nsec=tv_nsec)
78+
if ql.archtype == QL_ARCH.X8664:
79+
tp = timespec(tv_sec= tv_sec, tv_nsec=tv_nsec)
80+
else:
81+
tp = timespec32(tv_sec= tv_sec, tv_nsec=tv_nsec)
6882
ql.mem.write(clock_gettime_timespec, bytes(tp))
6983

7084
ql.log.debug("clock_gettime(clock_id = %d, timespec = 0x%x)" % (clock_gettime_clock_id, clock_gettime_timespec))
@@ -75,7 +89,10 @@ def ql_syscall_gettimeofday(ql, gettimeofday_tv, gettimeofday_tz, *args, **kw):
7589
now = datetime.now().timestamp()
7690
tv_sec = floor(now)
7791
tv_nsec = floor((now - floor(now)) * 1e6)
78-
tp = timespec(tv_sec= tv_sec, tv_nsec=tv_nsec)
92+
if ql.archtype == QL_ARCH.X8664:
93+
tp = timespec(tv_sec= tv_sec, tv_nsec=tv_nsec)
94+
else:
95+
tp = timespec32(tv_sec= tv_sec, tv_nsec=tv_nsec)
7996

8097
if gettimeofday_tv != 0:
8198
ql.mem.write(gettimeofday_tv, bytes(tp))

qiling/os/posix/const.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -541,3 +541,13 @@
541541
130: 'EOWNERDEAD',
542542
131: 'ENOTRECOVERABLE',
543543
}
544+
545+
# shm syscall
546+
IPC_CREAT = 8**3
547+
IPC_EXCL = 2*(8**3)
548+
IPC_NOWAIT = 4*(8**3)
549+
550+
SHM_RDONLY = 8**4
551+
SHM_RND = 2*(8**4)
552+
SHM_REMAP= 4*(8**4)
553+
SHM_EXEC = 1*(8**5)

qiling/os/posix/posix.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,8 @@ def __init__(self, ql: Qiling):
104104
self._fd[1] = self.stdout
105105
self._fd[2] = self.stderr
106106

107+
self._shms = {}
108+
107109
# ql.syscall - get syscall for all posix series
108110
@property
109111
def syscall(self):

qiling/os/posix/syscall/mman.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,3 +182,28 @@ def ql_syscall_mmap(ql, mmap_addr, mmap_length, mmap_prot, mmap_flags, mmap_fd,
182182

183183
def ql_syscall_mmap2(ql, mmap2_addr, mmap2_length, mmap2_prot, mmap2_flags, mmap2_fd, mmap2_pgoffset):
184184
return syscall_mmap_impl(ql, mmap2_addr, mmap2_length, mmap2_prot, mmap2_flags, mmap2_fd, mmap2_pgoffset, 2)
185+
186+
def ql_syscall_shmget(ql, key, size, shmflg, *args, **kwargs):
187+
if (shmflg & IPC_CREAT) == 0:
188+
if key not in ql.os._shms:
189+
return ENOENT
190+
else:
191+
if (shmflg & IPC_EXCL) != 0:
192+
if key in ql.os._shms:
193+
return EEXIST
194+
else:
195+
#addr = ql.mem.map_anywhere(size)
196+
ql.os._shms[key] = (key, size)
197+
return key
198+
199+
def ql_syscall_shmat(ql, shmid, shmaddr, shmflg, *args, **kwargs):
200+
# shmid == key
201+
# dummy implementation
202+
if shmid not in ql.os._shms:
203+
return EINVAL
204+
key, size = ql.os._shms[shmid]
205+
if shmaddr == 0:
206+
addr = ql.mem.map_anywhere(size)
207+
else:
208+
addr = ql.mem.map(shmaddr, size, info="[shm]")
209+
return addr

0 commit comments

Comments
 (0)