Skip to content

Commit 8b39494

Browse files
authored
Added mknod syscall (#1236)
* Added mknod syscall * Add ifndef * A comma is needed
1 parent 754b69f commit 8b39494

File tree

1 file changed

+24
-9
lines changed

1 file changed

+24
-9
lines changed

src/emu/x64syscall.c

+24-9
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ typedef struct x64_sigaction_s x64_sigaction_t;
3939
typedef struct x64_stack_s x64_stack_t;
4040

4141
extern int mkdir(const char *path, mode_t mode);
42+
extern int mknod(const char *path, mode_t mode, dev_t dev);
4243
extern int fchmodat (int __fd, const char *__file, mode_t __mode, int __flag);
4344

4445
//int32_t my_getrandom(x64emu_t* emu, void* buf, uint32_t buflen, uint32_t flags);
@@ -73,7 +74,7 @@ int32_t my_execve(x64emu_t* emu, const char* path, char* const argv[], char* con
7374
#undef fcntl
7475
int fcntl(int fd, int cmd, ... /* arg */ );
7576

76-
// Syscall table for x86_64 can be found
77+
// Syscall table for x86_64 can be found
7778
typedef struct scwrap_s {
7879
int nats;
7980
int nbpars;
@@ -186,6 +187,9 @@ static const scwrap_t syscallwrap[] = {
186187
[127] = {__NR_rt_sigpending, 2},
187188
[128] = {__NR_rt_sigtimedwait, 4},
188189
//[131] = {__NR_sigaltstack, 2}, // wrapped to use my_sigaltstack*
190+
#ifdef __NR_mknod
191+
[133] = {__NR_mknod, 3},
192+
#endif
189193
[140] = {__NR_getpriority, 2},
190194
[145] = {__NR_sched_getscheduler, 1},
191195
[148] = {__NR_sched_rr_get_interval, 2},
@@ -240,7 +244,7 @@ static const scwrap_t syscallwrap[] = {
240244
#endif
241245
[258] = {__NR_mkdirat, 3},
242246
[260] = {__NR_fchownat, 5},
243-
//[262] = {__NR_fstatat, 4},
247+
//[262] = {__NR_fstatat, 4},
244248
[263] = {__NR_unlinkat, 3},
245249
#ifdef __NR_renameat
246250
[264] = {__NR_renameat, 4},
@@ -401,7 +405,7 @@ void EXPORT x64Syscall(x64emu_t *emu)
401405
buffret = cycle_log?my_context->log_ret[my_context->current_line]:t_buffret;
402406
if(cycle_log)
403407
my_context->current_line = (my_context->current_line+1)%cycle_log;
404-
snprintf(buff, 255, "%04d|%p: Calling syscall 0x%02X (%d) %p %p %p %p %p %p", GetTID(), (void*)R_RIP, s, s, (void*)R_RDI, (void*)R_RSI, (void*)R_RDX, (void*)R_R10, (void*)R_R8, (void*)R_R9);
408+
snprintf(buff, 255, "%04d|%p: Calling syscall 0x%02X (%d) %p %p %p %p %p %p", GetTID(), (void*)R_RIP, s, s, (void*)R_RDI, (void*)R_RSI, (void*)R_RDX, (void*)R_R10, (void*)R_R8, (void*)R_R9);
405409
if(!cycle_log)
406410
printf_log(LOG_NONE, "%s", buff);
407411
}
@@ -418,7 +422,7 @@ void EXPORT x64Syscall(x64emu_t *emu)
418422
case 5: S_RAX = syscall(sc, R_RDI, R_RSI, R_RDX, R_R10, R_R8); break;
419423
case 6: S_RAX = syscall(sc, R_RDI, R_RSI, R_RDX, R_R10, R_R8, R_R9); break;
420424
default:
421-
printf_log(LOG_NONE, "ERROR, Unimplemented syscall wrapper (%d, %d)\n", s, syscallwrap[s].nbpars);
425+
printf_log(LOG_NONE, "ERROR, Unimplemented syscall wrapper (%d, %d)\n", s, syscallwrap[s].nbpars);
422426
emu->quit = 1;
423427
return;
424428
}
@@ -440,7 +444,7 @@ void EXPORT x64Syscall(x64emu_t *emu)
440444
S_RAX = -errno;
441445
break;
442446
case 2: // sys_open
443-
if(s==5) {if (log) snprintf(buff2, 63, " [sys_open(\"%s\", %d, %d)]", (char*)R_RDI, of_convert(R_ESI), R_EDX);};
447+
if(s==5) {if (log) snprintf(buff2, 63, " [sys_open(\"%s\", %d, %d)]", (char*)R_RDI, of_convert(R_ESI), R_EDX);};
444448
//S_RAX = open((void*)R_EDI, of_convert(R_ESI), R_EDX);
445449
S_RAX = my_open(emu, (void*)R_RDI, of_convert(R_ESI), R_EDX);
446450
if(S_RAX==-1)
@@ -598,7 +602,7 @@ void EXPORT x64Syscall(x64emu_t *emu)
598602
}
599603
break;
600604
#ifndef __NR_fork
601-
case 57:
605+
case 57:
602606
S_RAX = fork();
603607
if(S_RAX==-1)
604608
S_RAX = -errno;
@@ -681,6 +685,13 @@ void EXPORT x64Syscall(x64emu_t *emu)
681685
if(S_RAX==-1)
682686
S_RAX = -errno;
683687
break;
688+
#ifndef __NR_mknod
689+
case 133: // sys_mknod
690+
S_RAX = mknod((void*)R_RDI, R_ESI, R_RDX);
691+
if(S_RAX==-1)
692+
S_RAX = -errno;
693+
break;
694+
#endif
684695
case 158: // sys_arch_prctl
685696
S_RAX = my_arch_prctl(emu, S_EDI, (void*)R_RSI);
686697
if(S_RAX==-1)
@@ -809,7 +820,7 @@ long EXPORT my_syscall(x64emu_t *emu)
809820
{
810821
static uint32_t warned = 0;
811822
uint32_t s = R_EDI;
812-
printf_dump(LOG_DEBUG, "%04d| %p: Calling libc syscall 0x%02X (%d) %p %p %p %p %p\n", GetTID(), (void*)R_RIP, s, s, (void*)R_RSI, (void*)R_RDX, (void*)R_RCX, (void*)R_R8, (void*)R_R9);
823+
printf_dump(LOG_DEBUG, "%04d| %p: Calling libc syscall 0x%02X (%d) %p %p %p %p %p\n", GetTID(), (void*)R_RIP, s, s, (void*)R_RSI, (void*)R_RDX, (void*)R_RCX, (void*)R_R8, (void*)R_R9);
813824
// check wrapper first
814825
uint32_t cnt = sizeof(syscallwrap) / sizeof(scwrap_t);
815826
if(s<cnt && syscallwrap[s].nats) {
@@ -823,7 +834,7 @@ long EXPORT my_syscall(x64emu_t *emu)
823834
case 5: return syscall(sc, R_RSI, R_RDX, R_RCX, R_R8, R_R9);
824835
case 6: return syscall(sc, R_RSI, R_RDX, R_RCX, R_R8, R_R9, u64(0));
825836
default:
826-
printf_log(LOG_NONE, "ERROR, Unimplemented syscall wrapper (%d, %d)\n", s, syscallwrap[s].nbpars);
837+
printf_log(LOG_NONE, "ERROR, Unimplemented syscall wrapper (%d, %d)\n", s, syscallwrap[s].nbpars);
827838
emu->quit = 1;
828839
return 0;
829840
}
@@ -945,7 +956,7 @@ long EXPORT my_syscall(x64emu_t *emu)
945956
return dup2(S_ESI, S_EDX);
946957
#endif
947958
#ifndef __NR_fork
948-
case 57:
959+
case 57:
949960
return fork();
950961
#endif
951962
case 58: // vfork
@@ -990,6 +1001,10 @@ long EXPORT my_syscall(x64emu_t *emu)
9901001
#endif
9911002
case 131: // sys_sigaltstack
9921003
return my_sigaltstack(emu, (void*)R_RSI, (void*)R_RDX);
1004+
#ifndef __NR_mknod
1005+
case 133: // sys_mknod
1006+
return mknod((void*)R_RSI, R_EDX, R_RCX);
1007+
#endif
9931008
case 158: // sys_arch_prctl
9941009
return my_arch_prctl(emu, S_ESI, (void*)R_RDX);
9951010
#ifndef __NR_setrlimit

0 commit comments

Comments
 (0)