Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F175299525
D60394.id188788.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
14 KB
Referenced Files
None
Subscribers
None
D60394.id188788.diff
View Options
diff --git a/sys/amd64/linux/linux_proto.h b/sys/amd64/linux/linux_proto.h
--- a/sys/amd64/linux/linux_proto.h
+++ b/sys/amd64/linux/linux_proto.h
@@ -1436,7 +1436,10 @@
syscallarg_t dummy;
};
struct linux_fchmodat2_args {
- syscallarg_t dummy;
+ char dfd_l_[PADL_(l_int)]; l_int dfd; char dfd_r_[PADR_(l_int)];
+ char filename_l_[PADL_(const char *)]; const char * filename; char filename_r_[PADR_(const char *)];
+ char mode_l_[PADL_(l_mode_t)]; l_mode_t mode; char mode_r_[PADR_(l_mode_t)];
+ char flags_l_[PADL_(l_int)]; l_int flags; char flags_r_[PADR_(l_int)];
};
struct linux_map_shadow_stack_args {
syscallarg_t dummy;
@@ -2059,7 +2062,7 @@
#define LINUX_SYS_AUE_linux_futex_waitv AUE_NULL
#define LINUX_SYS_AUE_linux_set_mempolicy_home_node AUE_NULL
#define LINUX_SYS_AUE_linux_cachestat AUE_NULL
-#define LINUX_SYS_AUE_linux_fchmodat2 AUE_NULL
+#define LINUX_SYS_AUE_linux_fchmodat2 AUE_FCHMODAT
#define LINUX_SYS_AUE_linux_map_shadow_stack AUE_NULL
#undef PAD_
diff --git a/sys/amd64/linux/linux_sysent.c b/sys/amd64/linux/linux_sysent.c
--- a/sys/amd64/linux/linux_sysent.c
+++ b/sys/amd64/linux/linux_sysent.c
@@ -466,6 +466,6 @@
{ .sy_narg = 0, .sy_call = (sy_call_t *)linux_futex_waitv, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 449 = linux_futex_waitv */
{ .sy_narg = 0, .sy_call = (sy_call_t *)linux_set_mempolicy_home_node, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 450 = linux_set_mempolicy_home_node */
{ .sy_narg = 0, .sy_call = (sy_call_t *)linux_cachestat, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 451 = linux_cachestat */
- { .sy_narg = 0, .sy_call = (sy_call_t *)linux_fchmodat2, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 452 = linux_fchmodat2 */
+ { .sy_narg = AS(linux_fchmodat2_args), .sy_call = (sy_call_t *)linux_fchmodat2, .sy_auevent = AUE_FCHMODAT, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 452 = linux_fchmodat2 */
{ .sy_narg = 0, .sy_call = (sy_call_t *)linux_map_shadow_stack, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 453 = linux_map_shadow_stack */
};
diff --git a/sys/amd64/linux/linux_systrace_args.c b/sys/amd64/linux/linux_systrace_args.c
--- a/sys/amd64/linux/linux_systrace_args.c
+++ b/sys/amd64/linux/linux_systrace_args.c
@@ -2806,7 +2806,12 @@
}
/* linux_fchmodat2 */
case 452: {
- *n_args = 0;
+ struct linux_fchmodat2_args *p = params;
+ iarg[a++] = p->dfd; /* l_int */
+ uarg[a++] = (intptr_t)p->filename; /* const char * */
+ iarg[a++] = p->mode; /* l_mode_t */
+ iarg[a++] = p->flags; /* l_int */
+ *n_args = 4;
break;
}
/* linux_map_shadow_stack */
@@ -7298,6 +7303,22 @@
break;
/* linux_fchmodat2 */
case 452:
+ switch (ndx) {
+ case 0:
+ p = "l_int";
+ break;
+ case 1:
+ p = "userland const char *";
+ break;
+ case 2:
+ p = "l_mode_t";
+ break;
+ case 3:
+ p = "l_int";
+ break;
+ default:
+ break;
+ };
break;
/* linux_map_shadow_stack */
case 453:
@@ -8827,6 +8848,9 @@
case 451:
/* linux_fchmodat2 */
case 452:
+ if (ndx == 0 || ndx == 1)
+ p = "int";
+ break;
/* linux_map_shadow_stack */
case 453:
default:
diff --git a/sys/amd64/linux/syscalls.master b/sys/amd64/linux/syscalls.master
--- a/sys/amd64/linux/syscalls.master
+++ b/sys/amd64/linux/syscalls.master
@@ -2188,8 +2188,13 @@
int linux_cachestat(void);
}
; Linux 6.6:
-452 AUE_NULL STD {
- int linux_fchmodat2(void);
+452 AUE_FCHMODAT STD {
+ int linux_fchmodat2(
+ l_int dfd,
+ const char *filename,
+ l_mode_t mode,
+ l_int flags
+ );
}
453 AUE_NULL STD {
int linux_map_shadow_stack(void);
diff --git a/sys/amd64/linux32/linux32_proto.h b/sys/amd64/linux32/linux32_proto.h
--- a/sys/amd64/linux32/linux32_proto.h
+++ b/sys/amd64/linux32/linux32_proto.h
@@ -1737,7 +1737,10 @@
syscallarg_t dummy;
};
struct linux_fchmodat2_args {
- syscallarg_t dummy;
+ char dfd_l_[PADL_(l_int)]; l_int dfd; char dfd_r_[PADR_(l_int)];
+ char filename_l_[PADL_(const char *)]; const char * filename; char filename_r_[PADR_(const char *)];
+ char mode_l_[PADL_(l_mode_t)]; l_mode_t mode; char mode_r_[PADR_(l_mode_t)];
+ char flags_l_[PADL_(l_int)]; l_int flags; char flags_r_[PADR_(l_int)];
};
int linux_exit(struct thread *, struct linux_exit_args *);
int linux_fork(struct thread *, struct linux_fork_args *);
@@ -2486,7 +2489,7 @@
#define LINUX32_SYS_AUE_linux_futex_waitv AUE_NULL
#define LINUX32_SYS_AUE_linux_set_mempolicy_home_node AUE_NULL
#define LINUX32_SYS_AUE_linux_cachestat AUE_NULL
-#define LINUX32_SYS_AUE_linux_fchmodat2 AUE_NULL
+#define LINUX32_SYS_AUE_linux_fchmodat2 AUE_FCHMODAT
#undef PAD_
#undef PADL_
diff --git a/sys/amd64/linux32/linux32_sysent.c b/sys/amd64/linux32/linux32_sysent.c
--- a/sys/amd64/linux32/linux32_sysent.c
+++ b/sys/amd64/linux32/linux32_sysent.c
@@ -467,5 +467,5 @@
{ .sy_narg = 0, .sy_call = (sy_call_t *)linux_futex_waitv, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 449 = linux_futex_waitv */
{ .sy_narg = 0, .sy_call = (sy_call_t *)linux_set_mempolicy_home_node, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 450 = linux_set_mempolicy_home_node */
{ .sy_narg = 0, .sy_call = (sy_call_t *)linux_cachestat, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 451 = linux_cachestat */
- { .sy_narg = 0, .sy_call = (sy_call_t *)linux_fchmodat2, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 452 = linux_fchmodat2 */
+ { .sy_narg = AS(linux_fchmodat2_args), .sy_call = (sy_call_t *)linux_fchmodat2, .sy_auevent = AUE_FCHMODAT, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 452 = linux_fchmodat2 */
};
diff --git a/sys/amd64/linux32/linux32_systrace_args.c b/sys/amd64/linux32/linux32_systrace_args.c
--- a/sys/amd64/linux32/linux32_systrace_args.c
+++ b/sys/amd64/linux32/linux32_systrace_args.c
@@ -3322,7 +3322,12 @@
}
/* linux_fchmodat2 */
case 452: {
- *n_args = 0;
+ struct linux_fchmodat2_args *p = params;
+ iarg[a++] = p->dfd; /* l_int */
+ uarg[a++] = (intptr_t)p->filename; /* const char * */
+ iarg[a++] = p->mode; /* l_mode_t */
+ iarg[a++] = p->flags; /* l_int */
+ *n_args = 4;
break;
}
default:
@@ -8681,6 +8686,22 @@
break;
/* linux_fchmodat2 */
case 452:
+ switch (ndx) {
+ case 0:
+ p = "l_int";
+ break;
+ case 1:
+ p = "userland const char *";
+ break;
+ case 2:
+ p = "l_mode_t";
+ break;
+ case 3:
+ p = "l_int";
+ break;
+ default:
+ break;
+ };
break;
default:
break;
@@ -10497,6 +10518,9 @@
case 451:
/* linux_fchmodat2 */
case 452:
+ if (ndx == 0 || ndx == 1)
+ p = "int";
+ break;
default:
break;
};
diff --git a/sys/amd64/linux32/syscalls.master b/sys/amd64/linux32/syscalls.master
--- a/sys/amd64/linux32/syscalls.master
+++ b/sys/amd64/linux32/syscalls.master
@@ -2618,8 +2618,13 @@
int linux_cachestat(void);
}
; Linux 6.6:
-452 AUE_NULL STD {
- int linux_fchmodat2(void);
+452 AUE_FCHMODAT STD {
+ int linux_fchmodat2(
+ l_int dfd,
+ const char *filename,
+ l_mode_t mode,
+ l_int flags
+ );
}
; vim: syntax=off
diff --git a/sys/arm64/linux/linux_proto.h b/sys/arm64/linux/linux_proto.h
--- a/sys/arm64/linux/linux_proto.h
+++ b/sys/arm64/linux/linux_proto.h
@@ -1246,7 +1246,10 @@
syscallarg_t dummy;
};
struct linux_fchmodat2_args {
- syscallarg_t dummy;
+ char dfd_l_[PADL_(l_int)]; l_int dfd; char dfd_r_[PADR_(l_int)];
+ char filename_l_[PADL_(const char *)]; const char * filename; char filename_r_[PADR_(const char *)];
+ char mode_l_[PADL_(l_mode_t)]; l_mode_t mode; char mode_r_[PADR_(l_mode_t)];
+ char flags_l_[PADL_(l_int)]; l_int flags; char flags_r_[PADR_(l_int)];
};
int linux_setxattr(struct thread *, struct linux_setxattr_args *);
int linux_lsetxattr(struct thread *, struct linux_lsetxattr_args *);
@@ -1767,7 +1770,7 @@
#define LINUX_SYS_AUE_linux_futex_waitv AUE_NULL
#define LINUX_SYS_AUE_linux_set_mempolicy_home_node AUE_NULL
#define LINUX_SYS_AUE_linux_cachestat AUE_NULL
-#define LINUX_SYS_AUE_linux_fchmodat2 AUE_NULL
+#define LINUX_SYS_AUE_linux_fchmodat2 AUE_FCHMODAT
#undef PAD_
#undef PADL_
diff --git a/sys/arm64/linux/linux_sysent.c b/sys/arm64/linux/linux_sysent.c
--- a/sys/arm64/linux/linux_sysent.c
+++ b/sys/arm64/linux/linux_sysent.c
@@ -466,5 +466,5 @@
{ .sy_narg = 0, .sy_call = (sy_call_t *)linux_futex_waitv, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 449 = linux_futex_waitv */
{ .sy_narg = 0, .sy_call = (sy_call_t *)linux_set_mempolicy_home_node, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 450 = linux_set_mempolicy_home_node */
{ .sy_narg = 0, .sy_call = (sy_call_t *)linux_cachestat, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 451 = linux_cachestat */
- { .sy_narg = 0, .sy_call = (sy_call_t *)linux_fchmodat2, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 452 = linux_fchmodat2 */
+ { .sy_narg = AS(linux_fchmodat2_args), .sy_call = (sy_call_t *)linux_fchmodat2, .sy_auevent = AUE_FCHMODAT, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 452 = linux_fchmodat2 */
};
diff --git a/sys/arm64/linux/linux_systrace_args.c b/sys/arm64/linux/linux_systrace_args.c
--- a/sys/arm64/linux/linux_systrace_args.c
+++ b/sys/arm64/linux/linux_systrace_args.c
@@ -2428,7 +2428,12 @@
}
/* linux_fchmodat2 */
case 452: {
- *n_args = 0;
+ struct linux_fchmodat2_args *p = params;
+ iarg[a++] = p->dfd; /* l_int */
+ uarg[a++] = (intptr_t)p->filename; /* const char * */
+ iarg[a++] = p->mode; /* l_mode_t */
+ iarg[a++] = p->flags; /* l_int */
+ *n_args = 4;
break;
}
default:
@@ -6368,6 +6373,22 @@
break;
/* linux_fchmodat2 */
case 452:
+ switch (ndx) {
+ case 0:
+ p = "l_int";
+ break;
+ case 1:
+ p = "userland const char *";
+ break;
+ case 2:
+ p = "l_mode_t";
+ break;
+ case 3:
+ p = "l_int";
+ break;
+ default:
+ break;
+ };
break;
default:
break;
@@ -7679,6 +7700,9 @@
case 451:
/* linux_fchmodat2 */
case 452:
+ if (ndx == 0 || ndx == 1)
+ p = "int";
+ break;
default:
break;
};
diff --git a/sys/arm64/linux/syscalls.master b/sys/arm64/linux/syscalls.master
--- a/sys/arm64/linux/syscalls.master
+++ b/sys/arm64/linux/syscalls.master
@@ -1866,8 +1866,13 @@
int linux_cachestat(void);
}
; Linux 6.6:
-452 AUE_NULL STD {
- int linux_fchmodat2(void);
+452 AUE_FCHMODAT STD {
+ int linux_fchmodat2(
+ l_int dfd,
+ const char *filename,
+ l_mode_t mode,
+ l_int flags
+ );
}
; vim: syntax=off
diff --git a/sys/compat/linux/linux_dummy.c b/sys/compat/linux/linux_dummy.c
--- a/sys/compat/linux/linux_dummy.c
+++ b/sys/compat/linux/linux_dummy.c
@@ -145,5 +145,3 @@
DUMMY(set_mempolicy_home_node);
/* Linux 6.5: */
DUMMY(cachestat);
-/* Linux 6.6: */
-DUMMY(fchmodat2);
diff --git a/sys/compat/linux/linux_file.c b/sys/compat/linux/linux_file.c
--- a/sys/compat/linux/linux_file.c
+++ b/sys/compat/linux/linux_file.c
@@ -779,6 +779,28 @@
args->mode, 0));
}
+int
+linux_fchmodat2(struct thread *td, struct linux_fchmodat2_args *args)
+{
+ int bsdflags, dfd, lflags;
+
+ bsdflags = 0;
+ lflags = args->flags;
+
+ if ((lflags & ~(LINUX_AT_EMPTY_PATH | LINUX_AT_SYMLINK_NOFOLLOW)) != 0)
+ return (EINVAL);
+
+ if ((lflags & LINUX_AT_EMPTY_PATH) != 0)
+ bsdflags |= AT_EMPTY_PATH;
+
+ if ((lflags & LINUX_AT_SYMLINK_NOFOLLOW) != 0)
+ bsdflags |= AT_SYMLINK_NOFOLLOW;
+
+ dfd = (args->dfd == LINUX_AT_FDCWD) ? AT_FDCWD : args->dfd;
+ return (kern_fchmodat(td, dfd, args->filename, UIO_USERSPACE,
+ args->mode, bsdflags));
+}
+
#ifdef LINUX_LEGACY_SYSCALLS
int
linux_mkdir(struct thread *td, struct linux_mkdir_args *args)
diff --git a/sys/i386/linux/linux_proto.h b/sys/i386/linux/linux_proto.h
--- a/sys/i386/linux/linux_proto.h
+++ b/sys/i386/linux/linux_proto.h
@@ -1731,7 +1731,10 @@
syscallarg_t dummy;
};
struct linux_fchmodat2_args {
- syscallarg_t dummy;
+ char dfd_l_[PADL_(l_int)]; l_int dfd; char dfd_r_[PADR_(l_int)];
+ char filename_l_[PADL_(const char *)]; const char * filename; char filename_r_[PADR_(const char *)];
+ char mode_l_[PADL_(l_mode_t)]; l_mode_t mode; char mode_r_[PADR_(l_mode_t)];
+ char flags_l_[PADL_(l_int)]; l_int flags; char flags_r_[PADR_(l_int)];
};
int linux_exit(struct thread *, struct linux_exit_args *);
int linux_fork(struct thread *, struct linux_fork_args *);
@@ -2484,7 +2487,7 @@
#define LINUX_SYS_AUE_linux_futex_waitv AUE_NULL
#define LINUX_SYS_AUE_linux_set_mempolicy_home_node AUE_NULL
#define LINUX_SYS_AUE_linux_cachestat AUE_NULL
-#define LINUX_SYS_AUE_linux_fchmodat2 AUE_NULL
+#define LINUX_SYS_AUE_linux_fchmodat2 AUE_FCHMODAT
#undef PAD_
#undef PADL_
diff --git a/sys/i386/linux/linux_sysent.c b/sys/i386/linux/linux_sysent.c
--- a/sys/i386/linux/linux_sysent.c
+++ b/sys/i386/linux/linux_sysent.c
@@ -466,5 +466,5 @@
{ .sy_narg = 0, .sy_call = (sy_call_t *)linux_futex_waitv, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 449 = linux_futex_waitv */
{ .sy_narg = 0, .sy_call = (sy_call_t *)linux_set_mempolicy_home_node, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 450 = linux_set_mempolicy_home_node */
{ .sy_narg = 0, .sy_call = (sy_call_t *)linux_cachestat, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 451 = linux_cachestat */
- { .sy_narg = 0, .sy_call = (sy_call_t *)linux_fchmodat2, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 452 = linux_fchmodat2 */
+ { .sy_narg = AS(linux_fchmodat2_args), .sy_call = (sy_call_t *)linux_fchmodat2, .sy_auevent = AUE_FCHMODAT, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 452 = linux_fchmodat2 */
};
diff --git a/sys/i386/linux/linux_systrace_args.c b/sys/i386/linux/linux_systrace_args.c
--- a/sys/i386/linux/linux_systrace_args.c
+++ b/sys/i386/linux/linux_systrace_args.c
@@ -3353,7 +3353,12 @@
}
/* linux_fchmodat2 */
case 452: {
- *n_args = 0;
+ struct linux_fchmodat2_args *p = params;
+ iarg[a++] = p->dfd; /* l_int */
+ uarg[a++] = (intptr_t)p->filename; /* const char * */
+ iarg[a++] = p->mode; /* l_mode_t */
+ iarg[a++] = p->flags; /* l_int */
+ *n_args = 4;
break;
}
default:
@@ -8737,6 +8742,22 @@
break;
/* linux_fchmodat2 */
case 452:
+ switch (ndx) {
+ case 0:
+ p = "l_int";
+ break;
+ case 1:
+ p = "userland const char *";
+ break;
+ case 2:
+ p = "l_mode_t";
+ break;
+ case 3:
+ p = "l_int";
+ break;
+ default:
+ break;
+ };
break;
default:
break;
@@ -10577,6 +10598,9 @@
case 451:
/* linux_fchmodat2 */
case 452:
+ if (ndx == 0 || ndx == 1)
+ p = "int";
+ break;
default:
break;
};
diff --git a/sys/i386/linux/syscalls.master b/sys/i386/linux/syscalls.master
--- a/sys/i386/linux/syscalls.master
+++ b/sys/i386/linux/syscalls.master
@@ -2630,8 +2630,13 @@
int linux_cachestat(void);
}
; Linux 6.6:
-452 AUE_NULL STD {
- int linux_fchmodat2(void);
+452 AUE_FCHMODAT STD {
+ int linux_fchmodat2(
+ l_int dfd,
+ const char *filename,
+ l_mode_t mode,
+ l_int flags
+ );
}
; vim: syntax=off
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, Oct 10, 6:57 PM (8 h, 16 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
40531540
Default Alt Text
D60394.id188788.diff (14 KB)
Attached To
Mode
D60394: linux: implement fchmodat2 syscall
Attached
Detach File
Event Timeline
Log In to Comment