Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F136985495
D25272.id73237.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
8 KB
Referenced Files
None
Subscribers
None
D25272.id73237.diff
View Options
Index: sys/amd64/linux/linux_machdep.c
===================================================================
--- sys/amd64/linux/linux_machdep.c
+++ sys/amd64/linux/linux_machdep.c
@@ -141,6 +141,13 @@
}
int
+linux_madvise(struct thread *td, struct linux_madvise_args *uap)
+{
+
+ return (linux_madvise_common(td, PTROUT(uap->addr), uap->len, uap->behav));
+}
+
+int
linux_iopl(struct thread *td, struct linux_iopl_args *args)
{
int error;
Index: sys/amd64/linux/syscalls.master
===================================================================
--- sys/amd64/linux/syscalls.master
+++ sys/amd64/linux/syscalls.master
@@ -94,7 +94,7 @@
l_size_t len, l_int fl); }
27 AUE_MINCORE STD { int linux_mincore(l_ulong start, \
l_size_t len, u_char *vec); }
-28 AUE_MADVISE NOPROTO { int madvise(void *addr, size_t len, \
+28 AUE_MADVISE STD { int linux_madvise(void *addr, size_t len, \
int behav); }
29 AUE_NULL STD { int linux_shmget(l_key_t key, l_size_t size, \
l_int shmflg); }
Index: sys/amd64/linux32/linux32_machdep.c
===================================================================
--- sys/amd64/linux32/linux32_machdep.c
+++ sys/amd64/linux32/linux32_machdep.c
@@ -469,6 +469,13 @@
}
int
+linux_madvise(struct thread *td, struct linux_madvise_args *uap)
+{
+
+ return (linux_madvise_common(td, PTROUT(uap->addr), uap->len, uap->behav));
+}
+
+int
linux_iopl(struct thread *td, struct linux_iopl_args *args)
{
int error;
Index: sys/amd64/linux32/syscalls.master
===================================================================
--- sys/amd64/linux32/syscalls.master
+++ sys/amd64/linux32/syscalls.master
@@ -390,7 +390,7 @@
char *put_old); }
218 AUE_MINCORE STD { int linux_mincore(l_ulong start, \
l_size_t len, u_char *vec); }
-219 AUE_MADVISE NOPROTO { int madvise(void *addr, size_t len, \
+219 AUE_MADVISE STD { int linux_madvise(void *addr, size_t len, \
int behav); }
220 AUE_GETDIRENTRIES STD { int linux_getdents64(l_uint fd, \
void *dirent, l_uint count); }
Index: sys/arm64/linux/linux_machdep.c
===================================================================
--- sys/arm64/linux/linux_machdep.c
+++ sys/arm64/linux/linux_machdep.c
@@ -104,6 +104,13 @@
uap->prot));
}
+int
+linux_madvise(struct thread *td, struct linux_madvise_args *uap)
+{
+
+ return (linux_madvise_common(td, PTROUT(uap->addr), uap->len, uap->behav));
+}
+
/* LINUXTODO: implement arm64 linux_rt_sigsuspend */
int
linux_rt_sigsuspend(struct thread *td, struct linux_rt_sigsuspend_args *uap)
Index: sys/arm64/linux/syscalls.master
===================================================================
--- sys/arm64/linux/syscalls.master
+++ sys/arm64/linux/syscalls.master
@@ -1310,8 +1310,9 @@
u_char *vec
);
}
-233 AUE_MADVISE NOPROTO {
- int madvise(void *addr,
+233 AUE_MADVISE STD {
+ int linux_madvise(
+ void *addr,
size_t len,
int behav
);
Index: sys/compat/linux/linux_mmap.h
===================================================================
--- sys/compat/linux/linux_mmap.h
+++ sys/compat/linux/linux_mmap.h
@@ -45,8 +45,29 @@
#define LINUX_PROT_GROWSDOWN 0x01000000
#define LINUX_PROT_GROWSUP 0x02000000
+#define LINUX_MADV_NORMAL 0
+#define LINUX_MADV_RANDOM 1
+#define LINUX_MADV_SEQUENTIAL 2
+#define LINUX_MADV_WILLNEED 3
+#define LINUX_MADV_DONTNEED 4
+#define LINUX_MADV_FREE 8
+#define LINUX_MADV_REMOVE 9
+#define LINUX_MADV_DONTFORK 10
+#define LINUX_MADV_DOFORK 11
+#define LINUX_MADV_MERGEABLE 12
+#define LINUX_MADV_UNMERGEABLE 13
+#define LINUX_MADV_HUGEPAGE 14
+#define LINUX_MADV_NOHUGEPAGE 15
+#define LINUX_MADV_DONTDUMP 16
+#define LINUX_MADV_DODUMP 17
+#define LINUX_MADV_WIPEONFORK 18
+#define LINUX_MADV_KEEPONFORK 19
+#define LINUX_MADV_HWPOISON 100
+#define LINUX_MADV_SOFT_OFFLINE 101
+
int linux_mmap_common(struct thread *, uintptr_t, size_t, int, int,
int, off_t);
int linux_mprotect_common(struct thread *, uintptr_t, size_t, int);
+int linux_madvise_common(struct thread *, uintptr_t, size_t, int);
#endif /* _LINUX_MMAP_H_ */
Index: sys/compat/linux/linux_mmap.c
===================================================================
--- sys/compat/linux/linux_mmap.c
+++ sys/compat/linux/linux_mmap.c
@@ -242,6 +242,62 @@
return (kern_mprotect(td, addr, len, prot));
}
+int
+linux_madvise_common(struct thread *td, uintptr_t addr, size_t len, int behav)
+{
+
+ switch (behav) {
+ case LINUX_MADV_NORMAL:
+ return (kern_madvise(td, addr, len, MADV_NORMAL));
+ case LINUX_MADV_RANDOM:
+ return (kern_madvise(td, addr, len, MADV_RANDOM));
+ case LINUX_MADV_SEQUENTIAL:
+ return (kern_madvise(td, addr, len, MADV_SEQUENTIAL));
+ case LINUX_MADV_WILLNEED:
+ return (kern_madvise(td, addr, len, MADV_WILLNEED));
+ case LINUX_MADV_DONTNEED:
+ return (kern_madvise(td, addr, len, MADV_DONTNEED));
+ case LINUX_MADV_FREE:
+ return (kern_madvise(td, addr, len, MADV_FREE));
+ case LINUX_MADV_REMOVE:
+ linux_msg(curthread, "unsupported madvise MADV_REMOVE");
+ return (EINVAL);
+ case LINUX_MADV_DONTFORK:
+ return (kern_minherit(td, addr, len, INHERIT_NONE));
+ case LINUX_MADV_DOFORK:
+ return (kern_minherit(td, addr, len, INHERIT_COPY));
+ case LINUX_MADV_MERGEABLE:
+ linux_msg(curthread, "unsupported madvise MADV_MERGEABLE");
+ return (EINVAL);
+ case LINUX_MADV_UNMERGEABLE:
+ /* We don't merge anyway. */
+ return (0);
+ case LINUX_MADV_HUGEPAGE:
+ /* Ignored; on FreeBSD huge pages are always on. */
+ return (0);
+ case LINUX_MADV_NOHUGEPAGE:
+ linux_msg(curthread, "unsupported madvise MADV_NOHUGEPAGE");
+ return (EINVAL);
+ case LINUX_MADV_DONTDUMP:
+ return (kern_madvise(td, addr, len, MADV_NOCORE));
+ case LINUX_MADV_DODUMP:
+ return (kern_madvise(td, addr, len, MADV_CORE));
+ case LINUX_MADV_WIPEONFORK:
+ return (kern_minherit(td, addr, len, INHERIT_ZERO));
+ case LINUX_MADV_KEEPONFORK:
+ return (kern_minherit(td, addr, len, INHERIT_COPY));
+ case LINUX_MADV_HWPOISON:
+ linux_msg(curthread, "unsupported madvise MADV_HWPOISON");
+ return (EINVAL);
+ case LINUX_MADV_SOFT_OFFLINE:
+ linux_msg(curthread, "unsupported madvise MADV_SOFT_OFFLINE");
+ return (EINVAL);
+ default:
+ linux_msg(curthread, "unsupported madvise behav %d", behav);
+ return (EINVAL);
+ }
+}
+
#if defined(__amd64__)
static void
linux_fixup_prot(struct thread *td, int *prot)
Index: sys/i386/linux/linux_machdep.c
===================================================================
--- sys/i386/linux/linux_machdep.c
+++ sys/i386/linux/linux_machdep.c
@@ -354,6 +354,13 @@
}
int
+linux_madvise(struct thread *td, struct linux_madvise_args *uap)
+{
+
+ return (linux_madvise_common(td, PTROUT(uap->addr), uap->len, uap->behav));
+}
+
+int
linux_ioperm(struct thread *td, struct linux_ioperm_args *args)
{
int error;
Index: sys/i386/linux/syscalls.master
===================================================================
--- sys/i386/linux/syscalls.master
+++ sys/i386/linux/syscalls.master
@@ -393,7 +393,7 @@
char *put_old); }
218 AUE_MINCORE STD { int linux_mincore(l_ulong start, \
l_size_t len, u_char *vec); }
-219 AUE_MADVISE NOPROTO { int madvise(void *addr, size_t len, \
+219 AUE_MADVISE STD { int linux_madvise(void *addr, size_t len, \
int behav); }
220 AUE_GETDIRENTRIES STD { int linux_getdents64(l_uint fd, \
void *dirent, l_uint count); }
Index: sys/sys/syscallsubr.h
===================================================================
--- sys/sys/syscallsubr.h
+++ sys/sys/syscallsubr.h
@@ -185,6 +185,8 @@
struct timeval *tptr, enum uio_seg tptrseg);
int kern_madvise(struct thread *td, uintptr_t addr, size_t len, int behav);
int kern_mincore(struct thread *td, uintptr_t addr, size_t len, char *vec);
+int kern_minherit(struct thread *td, uintptr_t addr, size_t len,
+ int inherit);
int kern_mkdirat(struct thread *td, int fd, const char *path,
enum uio_seg segflg, int mode);
int kern_mkfifoat(struct thread *td, int fd, const char *path,
Index: sys/vm/vm_mmap.c
===================================================================
--- sys/vm/vm_mmap.c
+++ sys/vm/vm_mmap.c
@@ -709,13 +709,21 @@
int
sys_minherit(struct thread *td, struct minherit_args *uap)
{
+
+ return (kern_minherit(td, (uintptr_t)uap->addr, uap->len,
+ uap->inherit));
+}
+
+int
+kern_minherit(struct thread *td, uintptr_t addr0, size_t len, int inherit0)
+{
vm_offset_t addr;
vm_size_t size, pageoff;
vm_inherit_t inherit;
- addr = (vm_offset_t)uap->addr;
- size = uap->len;
- inherit = uap->inherit;
+ addr = (vm_offset_t)addr0;
+ size = len;
+ inherit = inherit0;
pageoff = (addr & PAGE_MASK);
addr -= pageoff;
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Nov 21, 10:15 PM (17 h, 31 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
25814921
Default Alt Text
D25272.id73237.diff (8 KB)
Attached To
Mode
D25272: Add linux_madvise(2).
Attached
Detach File
Event Timeline
Log In to Comment